mirror of
https://github.com/tuxbox-fork-migrations/recycled-ni-neutrino.git
synced 2025-08-27 23:42:51 +02:00
driver/rcinput.cpp: try to use monotonic time,
ifdef old code with USE_GETTIMEOFDAY;
dont set time in neutrino
Origin commit data
------------------
Branch: ni/coolstream
Commit: 361513c016
Author: [CST] Focus <focus.cst@gmail.com>
Date: 2012-03-06 (Tue, 06 Mar 2012)
------------------
This commit was generated by Migit
This commit is contained in:
@@ -34,6 +34,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <driver/rcinput.h>
|
#include <driver/rcinput.h>
|
||||||
|
#include <driver/abstime.h>
|
||||||
#include <driver/stream2file.h>
|
#include <driver/stream2file.h>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -41,7 +42,6 @@
|
|||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
//#define RCDEBUG
|
|
||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#ifdef KEYBOARD_INSTEAD_OF_REMOTE_CONTROL
|
#ifdef KEYBOARD_INSTEAD_OF_REMOTE_CONTROL
|
||||||
@@ -61,6 +61,11 @@
|
|||||||
#include <neutrino.h>
|
#include <neutrino.h>
|
||||||
#include <cs_api.h>
|
#include <cs_api.h>
|
||||||
|
|
||||||
|
//#define RCDEBUG
|
||||||
|
//#define USE_GETTIMEOFDAY
|
||||||
|
|
||||||
|
#define ENABLE_REPEAT_CHECK
|
||||||
|
|
||||||
//const char * const RC_EVENT_DEVICE[NUMBER_OF_EVENT_DEVICES] = {"/dev/input/nevis_ir", "/dev/input/event0"};
|
//const char * const RC_EVENT_DEVICE[NUMBER_OF_EVENT_DEVICES] = {"/dev/input/nevis_ir", "/dev/input/event0"};
|
||||||
const char * const RC_EVENT_DEVICE[NUMBER_OF_EVENT_DEVICES] = {"/dev/input/nevis_ir"};
|
const char * const RC_EVENT_DEVICE[NUMBER_OF_EVENT_DEVICES] = {"/dev/input/nevis_ir"};
|
||||||
typedef struct input_event t_input_event;
|
typedef struct input_event t_input_event;
|
||||||
@@ -332,13 +337,15 @@ int CRCInput::messageLoop( bool anyKeyCancels, int timeout )
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int CRCInput::addTimer(uint64_t Interval, bool oneshot, bool correct_time )
|
int CRCInput::addTimer(uint64_t Interval, bool oneshot, bool correct_time )
|
||||||
{
|
{
|
||||||
|
#ifdef USE_GETTIMEOFDAY
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
|
||||||
gettimeofday( &tv, NULL );
|
gettimeofday( &tv, NULL );
|
||||||
uint64_t timeNow = (uint64_t) tv.tv_usec + (uint64_t)((uint64_t) tv.tv_sec * (uint64_t) 1000000);
|
uint64_t timeNow = (uint64_t) tv.tv_usec + (uint64_t)((uint64_t) tv.tv_sec * (uint64_t) 1000000);
|
||||||
|
#else
|
||||||
|
uint64_t timeNow = time_monotonic_us();
|
||||||
|
#endif
|
||||||
|
|
||||||
timer _newtimer;
|
timer _newtimer;
|
||||||
if (!oneshot)
|
if (!oneshot)
|
||||||
@@ -365,6 +372,7 @@ int CRCInput::addTimer(uint64_t Interval, bool oneshot, bool correct_time )
|
|||||||
return _newtimer.id;
|
return _newtimer.id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef USE_GETTIMEOFDAY
|
||||||
int CRCInput::addTimer(struct timeval Timeout)
|
int CRCInput::addTimer(struct timeval Timeout)
|
||||||
{
|
{
|
||||||
uint64_t timesout = (uint64_t) Timeout.tv_usec + (uint64_t)((uint64_t) Timeout.tv_sec * (uint64_t) 1000000);
|
uint64_t timesout = (uint64_t) Timeout.tv_usec + (uint64_t)((uint64_t) Timeout.tv_sec * (uint64_t) 1000000);
|
||||||
@@ -375,6 +383,7 @@ int CRCInput::addTimer(const time_t *Timeout)
|
|||||||
{
|
{
|
||||||
return addTimer( (uint64_t)*Timeout* (uint64_t) 1000000, true, false );
|
return addTimer( (uint64_t)*Timeout* (uint64_t) 1000000, true, false );
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
void CRCInput::killTimer(uint32_t &id)
|
void CRCInput::killTimer(uint32_t &id)
|
||||||
{
|
{
|
||||||
@@ -394,13 +403,14 @@ void CRCInput::killTimer(uint32_t &id)
|
|||||||
|
|
||||||
int CRCInput::checkTimers()
|
int CRCInput::checkTimers()
|
||||||
{
|
{
|
||||||
struct timeval tv;
|
|
||||||
int _id = 0;
|
int _id = 0;
|
||||||
|
#ifdef USE_GETTIMEOFDAY
|
||||||
|
struct timeval tv;
|
||||||
gettimeofday( &tv, NULL );
|
gettimeofday( &tv, NULL );
|
||||||
uint64_t timeNow = (uint64_t) tv.tv_usec + (uint64_t)((uint64_t) tv.tv_sec * (uint64_t) 1000000);
|
uint64_t timeNow = (uint64_t) tv.tv_usec + (uint64_t)((uint64_t) tv.tv_sec * (uint64_t) 1000000);
|
||||||
|
#else
|
||||||
|
uint64_t timeNow = time_monotonic_us();
|
||||||
|
#endif
|
||||||
std::vector<timer>::iterator e;
|
std::vector<timer>::iterator e;
|
||||||
for ( e= timers.begin(); e!= timers.end(); ++e )
|
for ( e= timers.begin(); e!= timers.end(); ++e )
|
||||||
if ( e->times_out< timeNow+ 2000 )
|
if ( e->times_out< timeNow+ 2000 )
|
||||||
@@ -440,41 +450,46 @@ int CRCInput::checkTimers()
|
|||||||
|
|
||||||
int64_t CRCInput::calcTimeoutEnd(const int timeout_in_seconds)
|
int64_t CRCInput::calcTimeoutEnd(const int timeout_in_seconds)
|
||||||
{
|
{
|
||||||
|
#ifdef USE_GETTIMEOFDAY
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
|
||||||
gettimeofday(&tv, NULL);
|
gettimeofday(&tv, NULL);
|
||||||
|
|
||||||
return (uint64_t) tv.tv_usec + (uint64_t)((uint64_t) tv.tv_sec + (uint64_t)timeout_in_seconds) * (uint64_t) 1000000;
|
return (uint64_t) tv.tv_usec + (uint64_t)((uint64_t) tv.tv_sec + (uint64_t)timeout_in_seconds) * (uint64_t) 1000000;
|
||||||
|
#else
|
||||||
|
return time_monotonic_us() + ((uint64_t)timeout_in_seconds * (uint64_t) 1000000);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t CRCInput::calcTimeoutEnd_MS(const int timeout_in_milliseconds)
|
int64_t CRCInput::calcTimeoutEnd_MS(const int timeout_in_milliseconds)
|
||||||
{
|
{
|
||||||
|
#ifdef USE_GETTIMEOFDAY
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
|
||||||
gettimeofday(&tv, NULL);
|
gettimeofday(&tv, NULL);
|
||||||
|
|
||||||
uint64_t timeNow = (uint64_t) tv.tv_usec + (uint64_t)((uint64_t) tv.tv_sec * (uint64_t) 1000000);
|
uint64_t timeNow = (uint64_t) tv.tv_usec + (uint64_t)((uint64_t) tv.tv_sec * (uint64_t) 1000000);
|
||||||
|
#else
|
||||||
|
uint64_t timeNow = time_monotonic_us();
|
||||||
|
#endif
|
||||||
return ( timeNow + timeout_in_milliseconds * 1000 );
|
return ( timeNow + timeout_in_milliseconds * 1000 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void CRCInput::getMsgAbsoluteTimeout(neutrino_msg_t * msg, neutrino_msg_data_t * data, uint64_t *TimeoutEnd, bool bAllowRepeatLR)
|
void CRCInput::getMsgAbsoluteTimeout(neutrino_msg_t * msg, neutrino_msg_data_t * data, uint64_t *TimeoutEnd, bool bAllowRepeatLR)
|
||||||
{
|
{
|
||||||
|
#ifdef USE_GETTIMEOFDAY
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
|
||||||
gettimeofday( &tv, NULL );
|
gettimeofday( &tv, NULL );
|
||||||
uint64_t timeNow = (uint64_t) tv.tv_usec + (uint64_t)((uint64_t) tv.tv_sec * (uint64_t) 1000000);
|
uint64_t timeNow = (uint64_t) tv.tv_usec + (uint64_t)((uint64_t) tv.tv_sec * (uint64_t) 1000000);
|
||||||
|
#else
|
||||||
|
uint64_t timeNow = time_monotonic_us();
|
||||||
|
#endif
|
||||||
uint64_t diff;
|
uint64_t diff;
|
||||||
|
|
||||||
if ( *TimeoutEnd < timeNow+ 100 )
|
if ( *TimeoutEnd < timeNow+ 100 )
|
||||||
diff = 100; // Minimum Differenz...
|
diff = 100; // Minimum Differenz...
|
||||||
else
|
else
|
||||||
diff = ( *TimeoutEnd - timeNow );
|
diff = ( *TimeoutEnd - timeNow );
|
||||||
|
|
||||||
//printf("CRCInput::getMsgAbsoluteTimeout diff %llx TimeoutEnd %llx now %llx\n", diff, *TimeoutEnd, timeNow);
|
//printf("CRCInput::getMsgAbsoluteTimeout diff %llx TimeoutEnd %llx now %llx\n", diff, *TimeoutEnd, timeNow);
|
||||||
getMsg_us( msg, data, diff, bAllowRepeatLR );
|
getMsg_us( msg, data, diff, bAllowRepeatLR );
|
||||||
|
#ifdef USE_GETTIMEOFDAY
|
||||||
if ( *msg == NeutrinoMessages::EVT_TIMESET )
|
if ( *msg == NeutrinoMessages::EVT_TIMESET )
|
||||||
{
|
{
|
||||||
// recalculate timeout....
|
// recalculate timeout....
|
||||||
@@ -483,6 +498,7 @@ void CRCInput::getMsgAbsoluteTimeout(neutrino_msg_t * msg, neutrino_msg_data_t *
|
|||||||
|
|
||||||
//printf("[getMsgAbsoluteTimeout]: EVT_TIMESET - recalculate timeout\n%llx/%llx - %llx/%llx\n", timeNow, *(int64_t*) *data, *TimeoutEnd, ta );
|
//printf("[getMsgAbsoluteTimeout]: EVT_TIMESET - recalculate timeout\n%llx/%llx - %llx/%llx\n", timeNow, *(int64_t*) *data, *TimeoutEnd, ta );
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void CRCInput::getMsg(neutrino_msg_t * msg, neutrino_msg_data_t * data, int Timeout, bool bAllowRepeatLR)
|
void CRCInput::getMsg(neutrino_msg_t * msg, neutrino_msg_data_t * data, int Timeout, bool bAllowRepeatLR)
|
||||||
@@ -495,16 +511,16 @@ void CRCInput::getMsg_ms(neutrino_msg_t * msg, neutrino_msg_data_t * data, int T
|
|||||||
getMsg_us(msg, data, (uint64_t) Timeout * 1000, bAllowRepeatLR);
|
getMsg_us(msg, data, (uint64_t) Timeout * 1000, bAllowRepeatLR);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ENABLE_REPEAT_CHECK
|
|
||||||
void CRCInput::getMsg_us(neutrino_msg_t * msg, neutrino_msg_data_t * data, uint64_t Timeout, bool bAllowRepeatLR)
|
void CRCInput::getMsg_us(neutrino_msg_t * msg, neutrino_msg_data_t * data, uint64_t Timeout, bool bAllowRepeatLR)
|
||||||
{
|
{
|
||||||
static uint64_t last_keypress = 0ULL;
|
static uint64_t last_keypress = 0ULL;
|
||||||
uint64_t getKeyBegin;
|
//uint64_t getKeyBegin;
|
||||||
|
|
||||||
//static __u16 rc_last_key = KEY_MAX;
|
//static __u16 rc_last_key = KEY_MAX;
|
||||||
static __u16 rc_last_repeat_key = KEY_MAX;
|
static __u16 rc_last_repeat_key = KEY_MAX;
|
||||||
|
|
||||||
struct timeval tv, tvselect;
|
struct timeval tv;
|
||||||
|
struct timeval tvselect;
|
||||||
uint64_t InitialTimeout = Timeout;
|
uint64_t InitialTimeout = Timeout;
|
||||||
int64_t targetTimeout;
|
int64_t targetTimeout;
|
||||||
|
|
||||||
@@ -515,15 +531,22 @@ void CRCInput::getMsg_us(neutrino_msg_t * msg, neutrino_msg_data_t * data, uint6
|
|||||||
*data = 0;
|
*data = 0;
|
||||||
|
|
||||||
// wiederholung reinmachen - dass wirklich die ganze zeit bis timeout gewartet wird!
|
// wiederholung reinmachen - dass wirklich die ganze zeit bis timeout gewartet wird!
|
||||||
|
#ifdef USE_GETTIMEOFDAY
|
||||||
gettimeofday( &tv, NULL );
|
gettimeofday( &tv, NULL );
|
||||||
getKeyBegin = (uint64_t) tv.tv_usec + (uint64_t)((uint64_t) tv.tv_sec * (uint64_t) 1000000);
|
uint64_t getKeyBegin = (uint64_t) tv.tv_usec + (uint64_t)((uint64_t) tv.tv_sec * (uint64_t) 1000000);
|
||||||
|
#else
|
||||||
|
uint64_t getKeyBegin = time_monotonic_us();
|
||||||
|
#endif
|
||||||
while(1) {
|
while(1) {
|
||||||
timer_id = 0;
|
timer_id = 0;
|
||||||
if ( timers.size()> 0 )
|
if ( timers.size()> 0 )
|
||||||
{
|
{
|
||||||
|
#ifdef USE_GETTIMEOFDAY
|
||||||
gettimeofday( &tv, NULL );
|
gettimeofday( &tv, NULL );
|
||||||
uint64_t t_n= (uint64_t) tv.tv_usec + (uint64_t)((uint64_t) tv.tv_sec * (uint64_t) 1000000);
|
uint64_t t_n= (uint64_t) tv.tv_usec + (uint64_t)((uint64_t) tv.tv_sec * (uint64_t) 1000000);
|
||||||
|
#else
|
||||||
|
uint64_t t_n = time_monotonic_us();
|
||||||
|
#endif
|
||||||
if ( timers[0].times_out< t_n )
|
if ( timers[0].times_out< t_n )
|
||||||
{
|
{
|
||||||
timer_id = checkTimers();
|
timer_id = checkTimers();
|
||||||
@@ -840,6 +863,7 @@ void CRCInput::getMsg_us(neutrino_msg_t * msg, neutrino_msg_data_t * data, uint6
|
|||||||
{
|
{
|
||||||
case CSectionsdClient::EVT_TIMESET:
|
case CSectionsdClient::EVT_TIMESET:
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
struct timeval ltv;
|
struct timeval ltv;
|
||||||
gettimeofday(<v, NULL);
|
gettimeofday(<v, NULL);
|
||||||
int64_t timeOld = ltv.tv_usec + ltv.tv_sec * (int64_t)1000000;
|
int64_t timeOld = ltv.tv_usec + ltv.tv_sec * (int64_t)1000000;
|
||||||
@@ -847,7 +871,8 @@ void CRCInput::getMsg_us(neutrino_msg_t * msg, neutrino_msg_data_t * data, uint6
|
|||||||
if (dvbtime) {
|
if (dvbtime) {
|
||||||
printf("[neutrino] timeset event. ");
|
printf("[neutrino] timeset event. ");
|
||||||
time_t difftime = dvbtime - ltv.tv_sec;
|
time_t difftime = dvbtime - ltv.tv_sec;
|
||||||
if (abs(difftime) > 120) {
|
if (abs(difftime) > 120)
|
||||||
|
{
|
||||||
printf("difference is %ld s, stepping...\n", difftime);
|
printf("difference is %ld s, stepping...\n", difftime);
|
||||||
if (stime(&dvbtime))
|
if (stime(&dvbtime))
|
||||||
perror("stime");
|
perror("stime");
|
||||||
@@ -868,14 +893,18 @@ void CRCInput::getMsg_us(neutrino_msg_t * msg, neutrino_msg_data_t * data, uint6
|
|||||||
delete[] p;//new [] delete []
|
delete[] p;//new [] delete []
|
||||||
p = new unsigned char[sizeof(int64_t)];
|
p = new unsigned char[sizeof(int64_t)];
|
||||||
*(int64_t*) p = timeNew - timeOld;
|
*(int64_t*) p = timeNew - timeOld;
|
||||||
|
#endif
|
||||||
|
printf("[neutrino] CSectionsdClient::EVT_TIMESET: timediff %lld\n", *(int64_t*) p);
|
||||||
|
/* FIXME what this code really do ? */
|
||||||
if ((int64_t)last_keypress > *(int64_t*)p)
|
if ((int64_t)last_keypress > *(int64_t*)p)
|
||||||
last_keypress += *(int64_t *)p;
|
last_keypress += *(int64_t *)p;
|
||||||
|
|
||||||
|
#ifdef USE_GETTIMEOFDAY
|
||||||
// Timer anpassen
|
// Timer anpassen
|
||||||
for(std::vector<timer>::iterator e = timers.begin(); e != timers.end(); ++e)
|
for(std::vector<timer>::iterator e = timers.begin(); e != timers.end(); ++e)
|
||||||
if (e->correct_time)
|
if (e->correct_time)
|
||||||
e->times_out+= *(int64_t*) p;
|
e->times_out+= *(int64_t*) p;
|
||||||
|
#endif
|
||||||
*msg = NeutrinoMessages::EVT_TIMESET;
|
*msg = NeutrinoMessages::EVT_TIMESET;
|
||||||
*data = (neutrino_msg_data_t) p;
|
*data = (neutrino_msg_data_t) p;
|
||||||
dont_delete_p = true;
|
dont_delete_p = true;
|
||||||
@@ -887,16 +916,18 @@ printf("[neutrino] CSectionsdClient::EVT_GOT_CN_EPG\n");
|
|||||||
*data = (neutrino_msg_data_t) p;
|
*data = (neutrino_msg_data_t) p;
|
||||||
dont_delete_p = true;
|
dont_delete_p = true;
|
||||||
break;
|
break;
|
||||||
|
case CSectionsdClient::EVT_WRITE_SI_FINISHED:
|
||||||
|
*msg = NeutrinoMessages::EVT_SI_FINISHED;
|
||||||
|
*data = 0;
|
||||||
|
break;
|
||||||
|
#if 0
|
||||||
case CSectionsdClient::EVT_SERVICES_UPDATE:
|
case CSectionsdClient::EVT_SERVICES_UPDATE:
|
||||||
*msg = NeutrinoMessages::EVT_SERVICES_UPD;
|
*msg = NeutrinoMessages::EVT_SERVICES_UPD;
|
||||||
*data = 0;
|
*data = 0;
|
||||||
break;
|
break;
|
||||||
case CSectionsdClient::EVT_BOUQUETS_UPDATE:
|
case CSectionsdClient::EVT_BOUQUETS_UPDATE:
|
||||||
break;
|
break;
|
||||||
case CSectionsdClient::EVT_WRITE_SI_FINISHED:
|
#endif
|
||||||
*msg = NeutrinoMessages::EVT_SI_FINISHED;
|
|
||||||
*data = 0;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
printf("[neutrino] event INITID_SECTIONSD - unknown eventID 0x%x\n", emsg.eventID );
|
printf("[neutrino] event INITID_SECTIONSD - unknown eventID 0x%x\n", emsg.eventID );
|
||||||
}
|
}
|
||||||
@@ -1260,8 +1291,12 @@ printf("[neutrino] CSectionsdClient::EVT_GOT_CN_EPG\n");
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
//timeout neu kalkulieren
|
//timeout neu kalkulieren
|
||||||
|
#ifdef USE_GETTIMEOFDAY
|
||||||
gettimeofday( &tv, NULL );
|
gettimeofday( &tv, NULL );
|
||||||
int64_t getKeyNow = (int64_t) tv.tv_usec + (int64_t)((int64_t) tv.tv_sec * (int64_t) 1000000);
|
int64_t getKeyNow = (int64_t) tv.tv_usec + (int64_t)((int64_t) tv.tv_sec * (int64_t) 1000000);
|
||||||
|
#else
|
||||||
|
int64_t getKeyNow = time_monotonic_us();
|
||||||
|
#endif
|
||||||
int64_t diff = (getKeyNow - getKeyBegin);
|
int64_t diff = (getKeyNow - getKeyBegin);
|
||||||
if( Timeout <= (uint64_t) diff )
|
if( Timeout <= (uint64_t) diff )
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user