|
|
@@ -19,6 +19,8 @@ |
|
|
|
#include "ChannelHandler.h" |
|
|
|
#include <unistd.h> |
|
|
|
|
|
|
|
//#define CHANNEL_DEBUG |
|
|
|
|
|
|
|
ChannelHandler::ChannelHandler() : |
|
|
|
m_UpdateIndicator(false) |
|
|
|
{ |
|
|
@@ -48,28 +50,41 @@ ChannelHandler::~ChannelHandler() |
|
|
|
|
|
|
|
void ChannelHandler::UpdateDataNow() |
|
|
|
{ |
|
|
|
#ifdef CHANNEL_DEBUG |
|
|
|
cerr<<"Started update"<<endl; |
|
|
|
#endif |
|
|
|
// make sure the command is cleared even if |
|
|
|
// we can't get a lock on the data |
|
|
|
m_Command[0]=0; |
|
|
|
|
|
|
|
if (pthread_mutex_trylock(m_Mutex)) |
|
|
|
{ |
|
|
|
m_UpdateIndicator=!m_UpdateIndicator; |
|
|
|
#ifdef CHANNEL_DEBUG |
|
|
|
cerr<<"Got lock"<<endl; |
|
|
|
#endif |
|
|
|
|
|
|
|
m_UpdateIndicator=!m_UpdateIndicator; |
|
|
|
|
|
|
|
for(map<string, Channel*>::iterator i=m_ChannelMap.begin(); |
|
|
|
i!=m_ChannelMap.end(); i++) |
|
|
|
{ |
|
|
|
Channel *ch = i->second; |
|
|
|
|
|
|
|
|
|
|
|
switch (ch->type) |
|
|
|
{ |
|
|
|
case INPUT : |
|
|
|
{ |
|
|
|
#ifdef CHANNEL_DEBUG |
|
|
|
cerr<<"memcpy input channel: ["<<i->first<<"]"<<endl; |
|
|
|
#endif |
|
|
|
memcpy(ch->data,ch->data_buf,ch->size); |
|
|
|
} break; |
|
|
|
|
|
|
|
case OUTPUT : |
|
|
|
{ |
|
|
|
#ifdef CHANNEL_DEBUG |
|
|
|
cerr<<"memcpy output channel: ["<<i->first<<"]"<<endl; |
|
|
|
#endif |
|
|
|
memcpy(ch->data_buf,ch->data,ch->size); |
|
|
|
} break; |
|
|
|
|
|
|
@@ -82,11 +97,17 @@ void ChannelHandler::UpdateDataNow() |
|
|
|
if (m_BulkPos+ch->size>m_BulkSize) |
|
|
|
{ |
|
|
|
// last transfer |
|
|
|
#ifdef CHANNEL_DEBUG |
|
|
|
cerr<<"memcpy (last) bulk output channel: ["<<i->first<<"]"<<endl; |
|
|
|
#endif |
|
|
|
memcpy(ch->data_buf,((char*)m_BulkSrc)+m_BulkPos,m_BulkSize-m_BulkPos); |
|
|
|
m_BulkPos=-1; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
#ifdef CHANNEL_DEBUG |
|
|
|
cerr<<"memcpy bulk output channel: ["<<i->first<<"]"<<endl; |
|
|
|
#endif |
|
|
|
memcpy(ch->data_buf,((char*)m_BulkSrc)+m_BulkPos,ch->size); |
|
|
|
m_BulkPos+=ch->size; |
|
|
|
} |
|
|
@@ -97,6 +118,9 @@ void ChannelHandler::UpdateDataNow() |
|
|
|
// normal request transfer |
|
|
|
if (ch->requested) |
|
|
|
{ |
|
|
|
#ifdef CHANNEL_DEBUG |
|
|
|
cerr<<"memcpy output channel: ["<<i->first<<"]"<<endl; |
|
|
|
#endif |
|
|
|
memcpy(ch->data_buf,ch->data,ch->size); |
|
|
|
ch->updated=true; |
|
|
|
} |
|
|
@@ -117,7 +141,11 @@ void ChannelHandler::UpdateDataNow() |
|
|
|
else |
|
|
|
{ |
|
|
|
//cerr<<"Couldn't get lock"<<endl; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#ifdef CHANNEL_DEBUG |
|
|
|
cerr<<"Ended update"<<endl; |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
void ChannelHandler::RegisterData(const string &ID, Type t,void* pData, int size) |
|
|
@@ -126,7 +154,9 @@ void ChannelHandler::RegisterData(const string &ID, Type t,void* pData, int size |
|
|
|
// the channels have been set up they won't work anyway, but... |
|
|
|
//pthread_mutex_lock(m_Mutex); |
|
|
|
|
|
|
|
cerr<<"Registering ["<<ID<<"] "<<hex<<pData<<dec<<" as "<<size<<" bytes big"<<endl; |
|
|
|
#ifdef CHANNEL_DEBUG |
|
|
|
cerr<<"Registering ["<<ID<<"] "<<hex<<pData<<dec<<" as "<<size<<" bytes big"<<endl; |
|
|
|
#endif |
|
|
|
|
|
|
|
map<string,Channel*>::iterator i=m_ChannelMap.find(ID); |
|
|
|
if (i!=m_ChannelMap.end()) |
|
|
|