rx without processing
This commit is contained in:
parent
879459a728
commit
09416c4113
100
src/main.c
100
src/main.c
|
|
@ -38,10 +38,16 @@ volatile i16 countdown_tick = 0;
|
||||||
// Light timer
|
// Light timer
|
||||||
volatile i16 timer = 0;
|
volatile i16 timer = 0;
|
||||||
|
|
||||||
// volatile u08 exec = 0;
|
// rx buffer params
|
||||||
volatile u08 cmd[BUFFER_LEN];
|
volatile u08 rx_buffer[BUFFER_LEN];
|
||||||
volatile u08 cmdPos = 0;
|
volatile u08 rx_pos = 0;
|
||||||
volatile u08 cmdLen = 0;
|
volatile u08 rx_len = 0;
|
||||||
|
|
||||||
|
// tx buffer params
|
||||||
|
volatile u08 tx_buffer[BUFFER_LEN];
|
||||||
|
volatile u08 tx_pos = 0;
|
||||||
|
volatile u08 tx_len = 0;
|
||||||
|
|
||||||
volatile u08 state = 0;
|
volatile u08 state = 0;
|
||||||
u08 led_state = 0;
|
u08 led_state = 0;
|
||||||
|
|
||||||
|
|
@ -63,10 +69,10 @@ void reboot(void) {
|
||||||
* Start feeding cmd into UART (will process with interrupts)
|
* Start feeding cmd into UART (will process with interrupts)
|
||||||
*/
|
*/
|
||||||
void start_cmd(u08 len) {
|
void start_cmd(u08 len) {
|
||||||
cmdPos = 0;
|
tx_pos = 0;
|
||||||
cmdLen = len;
|
tx_len = len;
|
||||||
UART1.CR2 |= UART_CR2_TXE_IVT;
|
UART1.CR2 |= UART_CR2_TXE_IVT;
|
||||||
UART1.Data = cmd[0];
|
UART1.Data = tx_buffer[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -107,9 +113,9 @@ i16 elapsed(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void send_some_command(void) {
|
void send_some_command(void) {
|
||||||
cmd[0] = 'C';
|
tx_buffer[0] = 'C';
|
||||||
cmd[1] = 'M';
|
tx_buffer[1] = 'M';
|
||||||
cmd[2] = 'D';
|
tx_buffer[2] = 'D';
|
||||||
start_cmd(3);
|
start_cmd(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -188,37 +194,63 @@ void tick_250ms(void) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if rx buffer contains finished command
|
||||||
|
*/
|
||||||
|
int is_rx_finished(void) {
|
||||||
|
// head + len + cmd + ver + tail
|
||||||
|
if (rx_pos < 4 + 2 + 2 + 2 + 4) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// Check head, tail and just in case - length
|
||||||
|
return rx_buffer[0] == 0xFD &&
|
||||||
|
rx_buffer[1] == 0xFC &&
|
||||||
|
rx_buffer[2] == 0xFB &&
|
||||||
|
rx_buffer[3] == 0xFA &&
|
||||||
|
rx_buffer[rx_pos - 1] == 0x01 &&
|
||||||
|
rx_buffer[rx_pos - 2] == 0x02 &&
|
||||||
|
rx_buffer[rx_pos - 3] == 0x03 &&
|
||||||
|
rx_buffer[rx_pos - 4] == 0x04 &&
|
||||||
|
(rx_buffer[4] | (rx_buffer[5] << 8)) == rx_pos - 12;
|
||||||
|
}
|
||||||
|
|
||||||
interrupt(IRQ_UART1_RX_F, uart_recv) {
|
interrupt(IRQ_UART1_RX_F, uart_recv) {
|
||||||
u08 s = UART1.Status;
|
u08 s = UART1.Status;
|
||||||
u08 c = UART1.Data;
|
u08 c = UART1.Data;
|
||||||
// if (exec == 1) {
|
if ((s & UART_RX_NOT_EMPTY) == 0) {
|
||||||
// switch (c) {
|
return;
|
||||||
// case 0x2A:
|
}
|
||||||
// timer = 1200;
|
|
||||||
// break;
|
if (rx_pos < 4) {
|
||||||
// case 0x2B:
|
if (rx_pos == 0xFD - c) {
|
||||||
// timer = -1;
|
rx_buffer[rx_pos] = c;
|
||||||
// break;
|
} else {
|
||||||
// case 0x2C:
|
// Something wrong - reset
|
||||||
// timer = 0;
|
rx_pos = 0;
|
||||||
// break;
|
memset(rx_buffer, 0, BUFFER_LEN);
|
||||||
// }
|
}
|
||||||
// }
|
} else {
|
||||||
// if (c == 0x24) {
|
rx_buffer[rx_pos] = c;
|
||||||
// exec = 1;
|
if (is_rx_finished()) {
|
||||||
// } else {
|
// TODO: Process
|
||||||
// exec = 0;
|
rx_pos = 0;
|
||||||
// }
|
memset(rx_buffer, 0, BUFFER_LEN);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rx_pos++;
|
||||||
}
|
}
|
||||||
|
|
||||||
interrupt(IRQ_UART1_TX_C, uart_sent) {
|
interrupt(IRQ_UART1_TX_C, uart_sent) {
|
||||||
cmdPos++;
|
tx_pos++;
|
||||||
if (cmdPos < cmdLen) {
|
// If we have more data - process
|
||||||
UART1.Data = cmd[cmdPos];
|
if (tx_pos < tx_len) {
|
||||||
|
UART1.Data = tx_buffer[tx_pos];
|
||||||
} else {
|
} else {
|
||||||
cmdPos = 0;
|
// Clean up
|
||||||
cmdLen = 0;
|
tx_pos = 0;
|
||||||
memset(cmd, '\0', BUFFER_LEN);
|
tx_len = 0;
|
||||||
|
memset(tx_buffer, '\0', BUFFER_LEN);
|
||||||
UART1.CR2 &= ~UART_CR2_TXE_IVT;
|
UART1.CR2 &= ~UART_CR2_TXE_IVT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue