diff --git a/left/src/init_peripherals.c b/left/src/init_peripherals.c index 8dac980..dc0d3b3 100644 --- a/left/src/init_peripherals.c +++ b/left/src/init_peripherals.c @@ -10,24 +10,40 @@ #include "slave_protocol_handler.h" #include "i2c_watchdog.h" +uint8_t byteIn; +uint8_t rxMessagePos; +i2c_slave_transfer_event_t prevEvent; + static void i2cSlaveCallback(I2C_Type *base, i2c_slave_transfer_t *xfer, void *userData) { + if (prevEvent != kI2C_SlaveReceiveEvent && xfer->event == kI2C_SlaveReceiveEvent) { + rxMessagePos = 0; + memset(&rxMessage, 0, I2C_BUFFER_MAX_LENGTH); + } else if (prevEvent == kI2C_SlaveReceiveEvent && xfer->event == kI2C_SlaveCompletionEvent) { + ((uint8_t*)&rxMessage)[rxMessagePos] = byteIn; + rxMessage.length = rxMessagePos-3; + SlaveRxHandler(); + } else if (prevEvent == kI2C_SlaveReceiveEvent && xfer->event == kI2C_SlaveReceiveEvent) { + ((uint8_t*)&rxMessage)[rxMessagePos++] = byteIn; + } + switch (xfer->event) { case kI2C_SlaveTransmitEvent: - SlaveProtocolHandler(); + SlaveTxHandler(); xfer->data = (uint8_t*)&txMessage; xfer->dataSize = txMessage.length+3; break; case kI2C_SlaveReceiveEvent: - xfer->data = (uint8_t*)&rxMessage; -// xfer->dataSize = I2C_BUFFER_MAX_LENGTH; - SlaveProtocolHandler(); + xfer->data = (uint8_t*)&byteIn; + xfer->dataSize = 1; break; case kI2C_SlaveCompletionEvent: - //SlaveProtocolHandler(); + break; default: break; } + + prevEvent = xfer->event; } void InitInterruptPriorities() diff --git a/left/src/slave_protocol_handler.c b/left/src/slave_protocol_handler.c index 400f813..0f3a7f1 100644 --- a/left/src/slave_protocol_handler.c +++ b/left/src/slave_protocol_handler.c @@ -32,15 +32,10 @@ void SetResponseByte(uint8_t response) txMessage.data[1] = response; } -void SlaveProtocolHandler(void) +void SlaveRxHandler(void) { uint8_t commandId = rxMessage.data[0]; switch (commandId) { - case SlaveCommand_RequestKeyStates: - BoolBytesToBits(keyMatrix.keyStates, txMessage.data, LEFT_KEYBOARD_HALF_KEY_COUNT); - txMessage.length = KEY_STATE_SIZE; - CRC16_UpdateMessageChecksum(&txMessage); - break; case SlaveCommand_SetTestLed: txMessage.length = 0; bool isLedOn = rxMessage.data[1]; @@ -56,3 +51,15 @@ void SlaveProtocolHandler(void) break; } } + +void SlaveTxHandler(void) +{ + uint8_t commandId = rxMessage.data[0]; + switch (commandId) { + case SlaveCommand_RequestKeyStates: + BoolBytesToBits(keyMatrix.keyStates, txMessage.data, LEFT_KEYBOARD_HALF_KEY_COUNT); + txMessage.length = KEY_STATE_SIZE; + CRC16_UpdateMessageChecksum(&txMessage); + break; + } +} diff --git a/left/src/slave_protocol_handler.h b/left/src/slave_protocol_handler.h index 82dfdf0..f059c07 100644 --- a/left/src/slave_protocol_handler.h +++ b/left/src/slave_protocol_handler.h @@ -22,6 +22,7 @@ // Functions: - extern void SlaveProtocolHandler(void); + void SlaveRxHandler(void); + void SlaveTxHandler(void); #endif