get rid of OUT queue, caused missed frames
This commit is contained in:
@@ -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
|
||||
|
||||
+62
-57
@@ -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);
|
||||
dbg("Handling frame.");
|
||||
if (urx_state == URXS_IDLE) {
|
||||
PayloadParser pp = pp_start(buffer, MQ_SLOT_LEN, NULL);
|
||||
|
||||
// handle binary commands for the gateway
|
||||
// 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();
|
||||
// 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);
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
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;
|
||||
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);
|
||||
// }
|
||||
}
|
||||
|
||||
|
||||
+12
-4
@@ -50,6 +50,7 @@
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include <debug.h>
|
||||
#include <msg_queue.h>
|
||||
#include <gex_gateway.h>
|
||||
#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
|
||||
|
||||
/**
|
||||
* @}
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user