diff --git a/Inc/gex_gateway.h b/Inc/gex_gateway.h index b6c96dd..85e5564 100644 --- a/Inc/gex_gateway.h +++ b/Inc/gex_gateway.h @@ -7,5 +7,6 @@ #include "main.h" void gw_process(void); +void gw_handle_usb_out(uint8_t *buffer); #endif //GEX_NRF_GEX_GATEWAY_H diff --git a/Src/gex_gateway.c b/Src/gex_gateway.c index 4bb1267..c9aa5e0 100644 --- a/Src/gex_gateway.c +++ b/Src/gex_gateway.c @@ -42,74 +42,79 @@ void start_slave_cmd(uint8_t slave_addr, uint16_t frame_len, uint8_t cksum) msg4slave_cksum = cksum; } -/** called from the main loop, periodically */ -void gw_process(void) +void gw_handle_usb_out(uint8_t *buffer) { - static uint8_t buffer[MQ_SLOT_LEN]; - while (mq_read(&usb_rxq, buffer)) { // greedy - handle as many as possible - dbg("Handling frame."); - if (urx_state == URXS_IDLE) { - PayloadParser pp = pp_start(buffer, MQ_SLOT_LEN, NULL); - - // handle binary commands for the gateway - - // magic twice, one inverted - denotes a gateway command - uint16_t magic1 = pp_u8(&pp); - uint16_t magic2 = pp_u8(&pp); - if (magic1 == MAGIC_GW_COMMAND && magic2 == (0xFFU & (~MAGIC_GW_COMMAND))) { - // third byte is the command code - switch (pp_u8(&pp)) { - case CMD_GET_ID: - respond_gw_id(); + dbg("Handling frame."); + if (urx_state == URXS_IDLE) { + PayloadParser pp = pp_start(buffer, MQ_SLOT_LEN, NULL); + + // handle binary commands for the gateway + + // magic twice, one inverted - denotes a gateway command + uint16_t magic1 = pp_u8(&pp); + uint16_t magic2 = pp_u8(&pp); + if (magic1 == MAGIC_GW_COMMAND && magic2 == (0xFFU & (~MAGIC_GW_COMMAND))) { + // third byte is the command code + switch (pp_u8(&pp)) { + case CMD_GET_ID: + respond_gw_id(); + break; + + case CMD_MSG4SLAVE:; + uint8_t slave_addr = pp_u8(&pp); + uint16_t frame_len = pp_u16(&pp); + uint8_t cksum = pp_u8(&pp); + + if (frame_len == 0 || frame_len > MAX_FRAME_LEN) { + dbg("Frame too big!"); break; + } - case CMD_MSG4SLAVE:; - uint8_t slave_addr = pp_u8(&pp); - uint16_t frame_len = pp_u16(&pp); - uint8_t cksum = pp_u8(&pp); - - if (frame_len == 0 || frame_len > MAX_FRAME_LEN) { - dbg("Frame too big!"); - break; - } - - start_slave_cmd(slave_addr, frame_len, cksum); - dbg("Collecting frame for slave %02x: %d bytes", (int)slave_addr, (int)frame_len); - urx_state = URXS_MSG4SLAVE; - break; + start_slave_cmd(slave_addr, frame_len, cksum); + dbg("Collecting frame for slave %02x: %d bytes", (int)slave_addr, (int)frame_len); + urx_state = URXS_MSG4SLAVE; + break; - default: - dbg("Bad cmd"); - } - } else { - // Bad frame?? - dbg("Bad USB frame, starts %x,%x", buffer[0],buffer[1]); + default: + dbg("Bad cmd"); } + } else { + // Bad frame?? + dbg("Bad USB frame, starts %x,%x", buffer[0],buffer[1]); } - else if (urx_state == URXS_MSG4SLAVE) { - uint32_t wanted = MIN(msg4slave_len-msg4slave_already, MQ_SLOT_LEN); - memcpy(&msg4slave[msg4slave_already], buffer, wanted); - msg4slave_already += wanted; - - if (wanted < MQ_SLOT_LEN) { - // this was the end - uint8_t ck = 0; - for (int i = 0; i < msg4slave_len; i++) { - ck ^= msg4slave[i]; - } - ck = ~ck; - - if (ck != msg4slave_cksum) { - dbg("Checksum mismatch!"); - } - else { - dbg("Verified, sending a %d B frame to slave.", (int) msg4slave_len); - // TODO send to slave - } - - urx_state = URXS_IDLE; + } + else if (urx_state == URXS_MSG4SLAVE) { + uint32_t wanted = MIN(msg4slave_len-msg4slave_already, MQ_SLOT_LEN); + memcpy(&msg4slave[msg4slave_already], buffer, wanted); + msg4slave_already += wanted; + + if (wanted < MQ_SLOT_LEN) { + // this was the end + uint8_t ck = 0; + for (int i = 0; i < msg4slave_len; i++) { + ck ^= msg4slave[i]; + } + ck = ~ck; + + if (ck != msg4slave_cksum) { + dbg("Checksum mismatch!"); } + else { + dbg("Verified, sending a %d B frame to slave.", (int) msg4slave_len); + // TODO send to slave + } + + urx_state = URXS_IDLE; } } } +/** called from the main loop, periodically */ +void gw_process(void) +{ +// static uint8_t buffer[MQ_SLOT_LEN]; +// while (mq_read(&usb_rxq, buffer)) { // greedy - handle as many as possible +// gw_handle_usb_out(buffer); +// } +} + diff --git a/Src/usbd_cdc_if.c b/Src/usbd_cdc_if.c index bde0dfa..a5b6603 100644 --- a/Src/usbd_cdc_if.c +++ b/Src/usbd_cdc_if.c @@ -50,6 +50,7 @@ /* Includes ------------------------------------------------------------------*/ #include #include +#include #include "usbd_cdc_if.h" /* USER CODE BEGIN INCLUDE */ @@ -298,10 +299,15 @@ static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) // queue the frame dbg("USB rx frame"); - bool suc = mq_post(&usb_rxq, Buf, *Len); - if (!suc) { - dbg("USB rxq overrun!"); - } + gw_handle_usb_out(Buf); // this expects full 64byte frames always starting with magic or useful data + + // handled immediately in the interrupt to block USB (NAK) + +// +// bool suc = mq_post(&usb_rxq, Buf, *Len); +// if (!suc) { +// dbg("USB rxq overrun!"); +// } return (USBD_OK); /* USER CODE END 6 */ @@ -336,6 +342,8 @@ uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len) /* USER CODE END PRIVATE_FUNCTIONS_IMPLEMENTATION */ +// TODO add Tx Done notify + /** * @} */