23 ProcessThread(name, fpsHz), m_i2cPath(i2cPath), m_i2cBus(i2cPath,
24 shouldPrint), m_lastProcessedEventTs(0), m_setupSuccess(false)
29 string error =
"Unable to open i2c bus " +
m_i2cPath +
"\n";
32 throw std::invalid_argument(error);
87 std::queue<I2C_Transaction_Message*> requests;
100 while (!requests.empty())
118 map<uint64_t, I2C_Transaction_Message> eventMessages;
123 bool isAnyEventProcessed =
false;
124 for (map<uint64_t, I2C_Transaction_Message>::iterator eventItr =
125 eventMessages.begin(); eventItr != eventMessages.end(); eventItr++)
132 isAnyEventProcessed =
true;
139 if (isAnyEventProcessed)
152 map<uint64_t, I2C_Transaction_Message> eventMessages;
157 for (map<uint64_t, I2C_Transaction_Message>::iterator eventItr =
158 eventMessages.begin(); eventItr != eventMessages.end(); eventItr++)
231 }
while (retryCount-- > 0);
269 else if (!compareEquals
276 }
while (retryCount-- > 0);
309 }
while (retryCount-- > 0);
317 for (
size_t messageIndex = 0; messageIndex < txMessage->
m_messages.size();
321 switch (txMessage->
m_messages[messageIndex].m_type)
347 transactionError = i2cError;
353 if (txMessage->
m_messages[messageIndex].m_delayInUsec)
355 if (txMessage->
m_messages[messageIndex].m_allowOtherProcessOnIdle)
358 txMessage->
m_messages[messageIndex].m_delayInUsec);
362 usleep(txMessage->
m_messages[messageIndex].m_delayInUsec);
366 txMessage->
setError(transactionError);
376 int64_t timeNow = startTime;
381 while ((delayInUsec > 0) && (pendingEvents-- > 0))
394 int64_t smallerTime, uint64_t timeDelay)
396 int64_t signedDiff = largerTime - smallerTime;
397 uint64_t timeDiff = signedDiff > -1 ? signedDiff : 0;
398 return (timeDiff < timeDelay) ? (timeDelay - timeDiff) : 0;
#define MONOCURRTIME(ret)
std::string getDebugMessage()
I2CError genericWrite(uint8_t chipAddress, vector< uint8_t > registerAddress, vector< uint8_t > data)
I2CError genericRead(uint8_t chipAddress, vector< uint8_t > registerAddress, vector< uint8_t > &readData)
void setSize(uint8_t registerSize, uint8_t dataSize)
bool isSuccessfullSetup()
void processI2CTransaction(I2C_Transaction_Message *txMessage)
uint64_t registerEvent(I2C_Transaction_Message message)
I2CError performCompareRead(uint8_t chipNumber, I2C_Message &message, bool compareEquals)
void unregisterEvent(uint64_t messageHandle)
virtual void processEvents()
apra::Mutex m_eventMessageLock
virtual void processSingleEvent()
I2CError performWrite(uint8_t chipNumber, I2C_Message &message)
vector< uint64_t > m_processedEvents
void processMessage(I2C_Transaction_Message *txMessage)
int64_t m_lastProcessedEventTs
map< uint64_t, I2C_Transaction_Message > m_registeredEvents
apra::Mutex m_processLock
void performTransactionDelay(const uint64_t timeDelay)
virtual void process(Message *obj)
uint64_t getNormalizedDelay(int64_t largerTime, int64_t smallerTime, uint64_t timeDelay)
I2CError performRead(uint8_t chipNumber, I2C_Message &message)
I2C_Interface(string i2cPath, string processName, uint64_t processFpsHz, bool shouldPrint)
vector< uint8_t > m_compareData
uint64_t m_retryDelayInUsec
vector< uint8_t > m_registerNumber
bool m_allowOtherProcessOnIdle
vector< I2C_Message > m_messages
void setError(I2CError error)
uint64_t m_transactionDelayUsec
bool m_stopOnAnyTransactionFailure
void publishTransaction()
void enqueResponse(Message *message)
std::queue< Message * > m_requestQueue
@ I2C_READ_COMPARE_NOT_EQUAL