return rtc_time != prev_time ? rtc_time : 0;
}
-time_t parseDVBtime(__u8 t1, __u8 t2, __u8 t3, __u8 t4, __u8 t5, __u16 *hash)
+static void parseDVBdate(tm& t, int mjd)
{
- tm t;
- t.tm_sec=fromBCD(t5);
- t.tm_min=fromBCD(t4);
- t.tm_hour=fromBCD(t3);
- int mjd=(t1<<8)|t2;
int k;
t.tm_year = (int) ((mjd - 15078.2) / 365.25);
t.tm_isdst = 0;
t.tm_gmtoff = 0;
+}
- if (hash) {
- *hash = t.tm_hour * 60 + t.tm_min;
- *hash |= t.tm_mday << 11;
- }
+static inline void parseDVBtime_impl(tm& t, const uint8_t *data)
+{
+ parseDVBdate(t, (data[0] << 8) | data[1]);
+ t.tm_hour = fromBCD(data[2]);
+ t.tm_min = fromBCD(data[3]);
+ t.tm_sec = fromBCD(data[4]);
+}
+time_t parseDVBtime(uint16_t mjd, uint32_t stime_bcd)
+{
+ tm t;
+ parseDVBdate(t, mjd);
+ t.tm_hour = fromBCD(stime_bcd >> 16);
+ t.tm_min = fromBCD((stime_bcd >> 8)&0xFF);
+ t.tm_sec = fromBCD(stime_bcd & 0xFF);
+ return timegm(&t);
+}
+
+time_t parseDVBtime(const uint8_t *data)
+{
+ tm t;
+ parseDVBtime_impl(t, data);
+ return timegm(&t);
+}
+
+time_t parseDVBtime(const uint8_t *data, uint16_t *hash)
+{
+ tm t;
+ parseDVBtime_impl(t, data);
+ *hash = t.tm_hour * 60 + t.tm_min;
+ *hash |= t.tm_mday << 11;
return timegm(&t);
}
int length = ((data[1] & 0x0F) << 8) | data[2];
if ( length >= 5 )
{
- time_t tptime = parseDVBtime(data[3], data[4], data[5], data[6], data[7]);
+ time_t tptime = parseDVBtime(&data[3]);
if (tptime && tptime != -1)
eDVBLocalTimeHandler::getInstance()->updateTime(tptime, chan, update_count);
error=0;
else if (tp_time == -1)
{
restart_tdt = true;
- /*if ( eSystemInfo::getInstance()->getHwType() == eSystemInfo::DM7020 ||
- ( eSystemInfo::getInstance()->getHwType() == eSystemInfo::DM7000
- && eSystemInfo::getInstance()->hasStandbyWakeupTimer() ) ) TODO !!!!!!! */
{
eDebug("[eDVBLocalTimerHandler] no transponder tuned... or no TDT/TOT avail .. try to use RTC :)");
time_t rtc_time = getRTC();