Pass i2c_message_t messages not only from the left half to the right, but vice versa.
This commit is contained in:
@@ -10,24 +10,40 @@
|
|||||||
#include "slave_protocol_handler.h"
|
#include "slave_protocol_handler.h"
|
||||||
#include "i2c_watchdog.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)
|
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) {
|
switch (xfer->event) {
|
||||||
case kI2C_SlaveTransmitEvent:
|
case kI2C_SlaveTransmitEvent:
|
||||||
SlaveProtocolHandler();
|
SlaveTxHandler();
|
||||||
xfer->data = (uint8_t*)&txMessage;
|
xfer->data = (uint8_t*)&txMessage;
|
||||||
xfer->dataSize = txMessage.length+3;
|
xfer->dataSize = txMessage.length+3;
|
||||||
break;
|
break;
|
||||||
case kI2C_SlaveReceiveEvent:
|
case kI2C_SlaveReceiveEvent:
|
||||||
xfer->data = (uint8_t*)&rxMessage;
|
xfer->data = (uint8_t*)&byteIn;
|
||||||
// xfer->dataSize = I2C_BUFFER_MAX_LENGTH;
|
xfer->dataSize = 1;
|
||||||
SlaveProtocolHandler();
|
|
||||||
break;
|
break;
|
||||||
case kI2C_SlaveCompletionEvent:
|
case kI2C_SlaveCompletionEvent:
|
||||||
//SlaveProtocolHandler();
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
prevEvent = xfer->event;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InitInterruptPriorities()
|
void InitInterruptPriorities()
|
||||||
|
|||||||
@@ -32,15 +32,10 @@ void SetResponseByte(uint8_t response)
|
|||||||
txMessage.data[1] = response;
|
txMessage.data[1] = response;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SlaveProtocolHandler(void)
|
void SlaveRxHandler(void)
|
||||||
{
|
{
|
||||||
uint8_t commandId = rxMessage.data[0];
|
uint8_t commandId = rxMessage.data[0];
|
||||||
switch (commandId) {
|
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:
|
case SlaveCommand_SetTestLed:
|
||||||
txMessage.length = 0;
|
txMessage.length = 0;
|
||||||
bool isLedOn = rxMessage.data[1];
|
bool isLedOn = rxMessage.data[1];
|
||||||
@@ -56,3 +51,15 @@ void SlaveProtocolHandler(void)
|
|||||||
break;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
// Functions:
|
// Functions:
|
||||||
|
|
||||||
extern void SlaveProtocolHandler(void);
|
void SlaveRxHandler(void);
|
||||||
|
void SlaveTxHandler(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user