syncMaster for problem 3

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers hdtimeval_math.cpp Source File

hdtimeval_math.cpp

00001 #include "hdtimeval_math.h"
00002 
00003 void hdtv_add (hdtimeval_t * r, hdtimeval_t * v1, hdtimeval_t * v2)
00004 {
00005     r->tv_sec = v1->tv_sec + v2->tv_sec;
00006     r->ticks = v1->ticks + v2->ticks;
00007     if (r->ticks >= MAX_TICK) {
00008         r->tv_sec++;
00009         r->ticks -= MAX_TICK;
00010     }
00011 }
00012 
00013 void hdtv_div2 (hdtimeval_t * r, hdtimeval_t * v)
00014 {
00015     if (v->tv_sec & 0x1) {
00016         r->ticks = ((v->ticks+MAX_TICK)>>1);
00017     } else {
00018         r->ticks = (v->ticks>>1);
00019     }
00020     r->tv_sec = (v->tv_sec>>1);
00021 }
00022 
00023 void hdtv_div8 (hdtimeval_t * r, hdtimeval_t * v)
00024 {
00025     r->ticks = ((v->ticks+MAX_TICK*(v->tv_sec & 0x7))>>3);
00026     r->tv_sec = (v->tv_sec>>3);
00027 }
00028 
00029 void hdtv_sub (hdtimeval_t * r, hdtimeval_t * v1, hdtimeval_t * v2)
00030 {
00031     r->tv_sec = v1->tv_sec - v2->tv_sec;
00032     if (v1->ticks < v2->ticks) {
00033         r->ticks = MAX_TICK + v1->ticks - v2->ticks;
00034         r->tv_sec --;
00035     } else {
00036         r->ticks = v1->ticks - v2->ticks;
00037     }
00038 }
00039 
00040 void hdtv_muldiv (hdtimeval_t * r, hdtimeval_t * v, hdtimeval_t * m, hdtimeval_t * d)
00041 {
00042     double dblm, dbld, factor, rsec, rticks;
00043     uint32_t irticks, c;
00044     int32_t irsec;
00045 
00046     dblm = (double)(m->tv_sec) * (double)MAX_TICK + (double)(m->ticks);
00047     dbld = (double)(d->tv_sec) * (double)MAX_TICK + (double)(d->ticks);
00048     factor = dblm / dbld;
00049     
00050     rsec = (double)(v->tv_sec) * factor;
00051     rticks = (double)(v->ticks) * factor + (rsec - floor(rsec)) * (double)MAX_TICK;
00052     irticks = (uint32_t)rticks;
00053     irsec = (int32_t)rsec;
00054     c = irticks / MAX_TICK;
00055     r->tv_sec = irsec + c;
00056     r->ticks = irticks - c * MAX_TICK;
00057 }
00058 
00059 void hdtv_totv(timeval_t * r, hdtimeval_t * v)
00060 {
00061     r->tv_sec = v->tv_sec;
00062     r->tv_usec = (v->ticks + 48)/96;
00063     if (r->tv_usec >= 1000000) {
00064         r->tv_sec ++;
00065         r->tv_usec -= 1000000;
00066     }
00067 }