i2c state invalidation

This commit is contained in:
Chris Esposito 2018-11-04 10:47:25 +11:00
parent 0f00af0c08
commit 2772fee1cd
4 changed files with 20 additions and 4 deletions

View File

@ -7,12 +7,17 @@ static const uint32_t kClockMultiplier = 10;
i2cDecoder::i2cDecoder(isoBuffer* sda_in, isoBuffer* scl_in, uint32_t clockRate) :
QObject(nullptr),
sda(sda_in),
scl(scl_in),
serialPtr_bit(sda->back * 8)
scl(scl_in)
{
setStepSize(clockRate, kClockMultiplier);
}
void i2cDecoder::reset()
{
serialPtr_bit = sda->back * 8;
}
void i2cDecoder::run()
{
qDebug() << "i2cDecoder::run()";
@ -75,7 +80,7 @@ void i2cDecoder::runStateMachine()
{
state = transmissionState::unknown;
qDebug() << "Dumping I2C state and aborting...";
for (uint8_t i=0; i < 32; i++)
for (int i=32; i>=0; i--)
qDebug("%x\t%x", sda->buffer[serialPtr_bit/8 - i] & 0xFF, scl->buffer[serialPtr_bit/8 - i] & 0xFF);
throw std::runtime_error("unknown i2c transmission state");
return;

View File

@ -38,7 +38,7 @@ public:
uint8_t previousSdaValue = 0;
uint8_t currentSclValue = 0;
uint8_t previousSclValue = 0;
uint64_t serialPtr_bit;
uint64_t serialPtr_bit = 0;
transmissionState state = transmissionState::unknown;
// Data Transmission
@ -60,6 +60,7 @@ public:
void startCondition();
void stopCondition();
void dataByteCompleted(uint8_t byte, bool ACKed);
void reset();
signals:
public slots:

View File

@ -74,6 +74,8 @@ void isoDriver::timerTick(void){
return;
}
// TODO: Do we need to invalidate state when the device is reconnected?
bool invalidateTwoWireState = true;
switch(driver->deviceMode){
case 0:
frameActionGeneric(1,0);
@ -104,7 +106,12 @@ void isoDriver::timerTick(void){
internalBuffer375_CH2->serialManage(baudRate_CH2, 0);
}
if (serialDecodeEnabled_CH1 && serialType == 1)
{
if (twoWireStateInvalid)
twoWire->reset();
twoWire->run();
invalidateTwoWireState = false;
}
break;
case 5:
break;
@ -117,6 +124,8 @@ void isoDriver::timerTick(void){
default:
qFatal("Error in isoDriver::timerTick. Invalid device mode.");
}
if (invalidateTwoWireState)
twoWireStateInvalid = true;
//free(isoTemp);
}

View File

@ -117,6 +117,7 @@ private:
unsigned char serialType = 0;
i2c::i2cDecoder* twoWire = nullptr;
uint32_t i2cClockRate = 100000;
bool twoWireStateInvalid = true;
//Generic Vars
double windowAtPause = 0.01;
QTimer* isoTimer = NULL, *slowTimer = NULL, *fileTimer = NULL;