bl-packet.c (2367B)
1 #include "bl-packet.h" 2 #include "shared/protocol.h" 3 #include "shared/ring-buffer.h" 4 #include "shared/drv-usart-dma.h" 5 #include "bl/stimer.h" 6 #include "libopencm3/stm32/f4/nvic.h" 7 8 RingBuffer_t dbgRxRingBuf; 9 RingBuffer_t dbgTxRingBuf; 10 RingBuffer_t gsmRxRingBuf; 11 RingBuffer_t gsmTxRingBuf; 12 13 bool packetReceived = false; 14 uint8_t buffer[255] = {0}; 15 16 void packet_init(void) { 17 ring_buffer_setup(&dbgRxRingBuf, dbg.dma.rxBuf, DMA_RX_BUFFER_SIZE); 18 ring_buffer_setup(&dbgTxRingBuf, dbg.dma.txBuf, DMA_TX_BUFFER_SIZE); 19 ring_buffer_setup(&gsmRxRingBuf, gsm.dma.rxBuf, DMA_RX_BUFFER_SIZE); 20 ring_buffer_setup(&gsmTxRingBuf, gsm.dma.txBuf, DMA_TX_BUFFER_SIZE); 21 usart_enable(gsm.port); 22 usart_enable(dbg.port); 23 } 24 25 static void packet_tx_enqueue_data(const USART_t *usart, const uint8_t *data, const uint16_t len) { 26 res_usart_write(usart, data, len); 27 } 28 29 void packet_send_nack(void) { 30 uint8_t packet[4] = {PROTOCOL_TAG_NACK, 0, 30, 0}; 31 packet_tx_enqueue_data(comm, packet, sizeof packet); 32 } 33 34 void packet_send_ack(void) { 35 uint8_t packet[4] = {PROTOCOL_TAG_ACK, 0, 152, 3}; 36 packet_tx_enqueue_data(comm, packet, sizeof packet); 37 } 38 39 uint8_t *bl_packet_received(void) { 40 if (!packetReceived) { 41 return 0; 42 } else { 43 packetReceived = false; 44 return buffer; 45 } 46 } 47 48 void usart2_isr(void) { 49 (void)USART_SR(USART2); 50 (void)USART_DR(USART2); // This read sequence clears the idle interrupt flag 51 gsmRxRingBuf.tail = res_usart_dma_get_buffer_tail(&gsm); 52 uint16_t len = (DMA_RX_BUFFER_SIZE - 1) & (gsmRxRingBuf.tail - gsmRxRingBuf.head); 53 ring_buffer_read_chunk(&gsmRxRingBuf, buffer, len); 54 comm = &gsm; 55 packetReceived = true; 56 // protocol_handle_packet(buffer); 57 } 58 59 void usart1_isr(void) { 60 (void)USART_SR(USART1); 61 (void)USART_DR(USART1); // This read sequence clears the idle interrupt flag 62 dbgRxRingBuf.tail = res_usart_dma_get_buffer_tail(&dbg); 63 uint16_t len = (DMA_RX_BUFFER_SIZE - 1) & (dbgRxRingBuf.tail - dbgRxRingBuf.head); 64 ring_buffer_read_chunk(&dbgRxRingBuf, buffer, len); 65 comm = &dbg; 66 packetReceived = true; 67 } 68 69 void dma1_stream5_isr(void) { 70 // TODO: deactivate dma interrupt if nothing is done here 71 dma_clear_interrupt_flags(DMA1, DMA_STREAM5, DMA_TCIF); 72 } 73 74 void dma2_stream2_isr(void) { 75 dma_clear_interrupt_flags(DMA2, DMA_STREAM2, DMA_TCIF); 76 } 77 78