<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    Hi there,<br>
    <br>
    we are using your <tt>"</tt>
    <meta http-equiv="content-type" content="text/html;
      charset=ISO-8859-1">
    <tt>test-server.c"</tt> as a template and noticed a strange double
    call of the callback functions.<br>
    If you look close at line 902-915 you find the minor bug:<br>
    You use the function "<tt>gettimeofday()</tt>" which holds the
    seconds and microseconds.<br>
    Unfortunately you use the microseconds to check, if you run out of
    time.<br>
    The member <tt>"tv_usec"</tt> only counts till 1000000, which is
    exactly one second, and then starts over.<br>
    this leads to the fact, that <tt>(</tt><tt>tv.tv_usec - oldus)</tt>
    becomes negative, and therefore very big because of the <tt>uint</tt>
    cast.<br>
    <br>
    So you do two callbacks.<br>
    - One, if your difference becomes naturally greater then the given
    value.<br>
    - Second, if <tt>tv.tv_usec</tt> starts over.<br>
    <br>
    We are using chrono like this :<br>
    <tt>.........</tt><tt>.......<br>
    </tt><tt>    </tt><tt>while (n >= 0 && !force_exit) {</tt><tt><br>
    </tt><tt><br>
    </tt><tt>        /*</tt><tt><br>
    </tt><tt>         * This provokes the LWS_CALLBACK_SERVER_WRITEABLE
      for every</tt><tt><br>
    </tt><tt>         * live websocket connection using the
      DUMB_INCREMENT protocol,</tt><tt><br>
    </tt><tt>         * as soon as it can take more packets (usually
      immediately)</tt><tt><br>
    </tt><tt>         */</tt><tt><br>
    </tt><tt><br>
    </tt><tt>        std::chrono::high_resolution_clock::time_point t2 =
      std::chrono::high_resolution_clock::now();</tt><tt><br>
    </tt><tt>        std::chrono::duration<float> time_span =
      std::chrono::duration_cast<std::chrono::duration<float>>(t2
      - t1);</tt><tt><br>
    </tt><tt><br>
    </tt><tt>        // Check if the time difference is bigger than the
      value in seconds, then execute the callbacks</tt><tt><br>
    </tt><tt>        if (time_span.count() > 0.1) {</tt><tt><br>
    </tt><tt>            if(frameReceived == true){</tt><tt><br>
    </tt><tt>                         
libwebsocket_callback_on_writable_all_protocol(&protocols[PROTOCOL_CAMERA]);</tt><tt><br>
    </tt><tt>                          frameReceived = false;</tt><tt><br>
    </tt><tt>            }</tt><tt><br>
    </tt><tt>           
libwebsocket_callback_on_writable_all_protocol(&protocols[PROTOCOL_INFRARED]);</tt><tt><br>
    </tt><tt>            t1 = std::chrono::high_resolution_clock::now();</tt><tt><br>
    </tt><tt>        }</tt><tt><br>
    </tt><tt>.............</tt><br>
    <br>
    Greetings,<br>
    Timo<br>
    <pre class="moz-signature" cols="72">-- 

Timo Korthals, M.Sc.
Universität Bielefeld    
AG Kognitronik & Sensorik
Exzellenzcluster Cognitive Interaction Technology (CITEC)
Inspiration 1 (Zehlendorfer Damm 199)
33619 Bielefeld - Germany

Office  : 3.037
Phone   : +49 521 106-67368
eMail   : <a class="moz-txt-link-abbreviated" href="mailto:tkorthals@cit-ec.uni-bielefeld.de">tkorthals@cit-ec.uni-bielefeld.de</a>
Internet: <a class="moz-txt-link-freetext" href="http://www.ks.cit-ec.uni-bielefeld.de/">http://www.ks.cit-ec.uni-bielefeld.de/</a></pre>
  </body>
</html>