Pass i2c_message_t messages not only from the left half to the right, but vice versa.

This commit is contained in:
László Monda
2017-09-26 04:12:05 +02:00
parent b88c6e4291
commit 3b3e40af83
3 changed files with 36 additions and 12 deletions

View File

@@ -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()

View File

@@ -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;
}
}

View File

@@ -22,6 +22,7 @@
// Functions: // Functions:
extern void SlaveProtocolHandler(void); void SlaveRxHandler(void);
void SlaveTxHandler(void);
#endif #endif