diff options
Diffstat (limited to 'driver_fw/src')
-rw-r--r-- | driver_fw/src/main.c | 123 |
1 files changed, 84 insertions, 39 deletions
diff --git a/driver_fw/src/main.c b/driver_fw/src/main.c index ba3ddb8..866cde5 100644 --- a/driver_fw/src/main.c +++ b/driver_fw/src/main.c @@ -36,9 +36,37 @@ static union tx_buf_union *tx_buf_write = &tx_buf[2]; static bool idle_buf_ready = false; void update_tx_buf(void); +int hex_to_int(char *hex, size_t len); + +int hex_to_int(char *hex, size_t len) { + int rv = 0; + while (len--) { + rv = rv<<4; + char c = hex[len]; + if ('0' <= c && c <= '9') + c -= '0'; + else if ('a' <= c && c <= 'f') + c -= 'a' + 0xa; + else if ('A' <= c && c <= 'F') + c -= 'A' + 0xa; + else + c = 0; + rv |= c; + } + return rv; +} -char usartbuf[256]; -int usartp = 0; +enum leds { + LED_ON = 1, + LED_PING = 2, + LED_OVERHEAT = 4, + LED_CONTROL_ERR = 8, + LED_INPUT_ERR = 16, + LED_OUTPUT_ERR = 32 +}; + +char rxbuf[256]; +size_t rxp = 0; int main(void) { /* Configure clocks for 64 MHz system clock. @@ -160,7 +188,12 @@ int main(void) { GPIOD->MODER = IN(0) | IN(1) | IN(2) | IN(3) | IN(4) | IN(5) | IN(6) | IN(8) | IN(9); - delay_us(5*1000*1000); + for (int i=0; i<20; i++) { + set_status_leds(LED_ON); + delay_us(500*1000); + set_status_leds(0); + delay_us(500*1000); + } TIM1->CCMR1 = (6<<TIM_CCMR1_OC2M_Pos) | TIM_CCMR1_OC2PE; TIM1->CCMR2 = (6<<TIM_CCMR2_OC3M_Pos) | TIM_CCMR2_OC3PE; @@ -194,48 +227,60 @@ int main(void) { USART1->BRR = 6667; /* Set baudrate to 9600 Bd */ USART1->CR1 |= USART_CR1_UE; /* And... go! */ - int i = 0; - int j = 0; - int k = 0; - int n = 0; + int rj45_rx_ctr = 0; + int ping_ctr = 0; + int control_err_ctr = 0; while (23) { - if (USART1->ISR & USART_ISR_RXNE_RXFNE) { - usartbuf[usartp] = USART1->RDR; - usartp ++; - if (usartp >= sizeof(usartbuf)) { - usartp = 0; - } + if (rj45_rx_ctr) { + set_rj45_leds(0x5); + rj45_rx_ctr--; + + } else { + set_rj45_leds(0x0); } - } - { - i++; - j++; - i %= 6; - j %= 4; - delay_us(100000); - set_rj45_leds(1 << j); - set_status_leds(0x01); - if (i == 0) { - k++; - if (k == 10) { - k = 0; - n++; - if (n == 16) { - n = 0; + int leds = LED_ON; + if (ping_ctr) { + leds |= LED_PING; + ping_ctr--; + } + if (control_err_ctr) { + leds |= LED_CONTROL_ERR; + control_err_ctr--; + } + set_status_leds(leds); + + if (USART1->ISR & USART_ISR_RXNE_RXFNE) { + rj45_rx_ctr = 100000; + if (USART1->RDR == '\n') { + if (rxp != 4*16*3) { + rxp = 0; + control_err_ctr = 10000000; + continue; } - } - uint8_t b = (k < 8) ? (1<<k) : ~(1<<(k-8)); - - memset(tx_buf_write, 0, sizeof(*tx_buf_write)); - for (size_t i=0; i<COUNT_OF(tx_buf_write->packet.channels); i++) { - tx_buf_write->packet.channels[i] = (k < 9) ? (1<<k) : 0xff; - } - for (size_t i=0; i<COUNT_OF(tx_buf_write->packet.brightness); i++) { - tx_buf_write->packet.brightness[i] = 0xff; //(n<<4) | n; + for (size_t i=0; i<16; i++) { + int brightness = hex_to_int(&rxbuf[DRIVER_ADDR*16*3 + i*3], 1); + int channels = hex_to_int(&rxbuf[DRIVER_ADDR*16*3 + i*3 + 1], 2); + + tx_buf_write->packet.channels[i] = channels; + + if ((i&1) == 0) { + tx_buf_write->packet.brightness[i>>1] = brightness; + } else { + tx_buf_write->packet.brightness[i>>1] |= brightness<<4; + } + } + rxp = 0; + ping_ctr = 1000000; + update_tx_buf(); + + } else { + if (rxp <= sizeof(rxbuf)) { + rxbuf[rxp] = USART1->RDR; + rxp ++; + } } - update_tx_buf(); } } } |