From 7f5ccbfc7383b047540125f6c8c3a5b4ca3d644e Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Wed, 20 Feb 2019 20:01:23 +0000 Subject: [PATCH] -refactored git-svn-id: http://moon:8086/svn/projects/HendiControl@22 fda53097-d464-4ada-af97-ba876c37ca34 --- Control/firmware/uart_echo/main.c | 322 ++++----------------- Control/firmware/uart_echo/uart_echo.cproj | 42 +++ 2 files changed, 91 insertions(+), 273 deletions(-) diff --git a/Control/firmware/uart_echo/main.c b/Control/firmware/uart_echo/main.c index c2bb0c7..9f89601 100755 --- a/Control/firmware/uart_echo/main.c +++ b/Control/firmware/uart_echo/main.c @@ -10,6 +10,15 @@ #include #include #include + +#include "fifo.h" +#include "adc.h" +#include "port.h" +#include "timer.h" +#include "uart.h" +#include "i2c.h" +#include "mcp42x6.h" + #define ARDUINO_NANO #ifdef ARDUINO_NANO @@ -23,11 +32,13 @@ static uint8_t ledState = 0; static int16_t adc_value[16]; static size_t adc_ch = 0; +static Fifo messageFifo; enum MessageCode { NOP=0, Command, + Uart, Timer, AdcComplete, Error = 0xFF @@ -39,84 +50,6 @@ typedef struct _sMsg_t uint8_t data; } Msg_t; -typedef struct _sFifo -{ - void **ppData; - size_t capacity; - size_t itemSize; - size_t fill; - size_t wi; - size_t ri; - const char *pName; -} Fifo; - -static Fifo messageFifo; - -void Fifo_init(Fifo *pObj, size_t capacity, size_t itemSize, const char *pName) -{ - pObj->wi = 0; - pObj->ri = 0; - pObj->fill = 0; - pObj->capacity = capacity; - pObj->itemSize = itemSize; - pObj->ppData = (void**)malloc(capacity); - - for (int i=0; i < capacity; i++) - { - pObj->ppData[i] = (void*)malloc(itemSize); - } - pObj->pName = pName; -} - -void Fifo_free(Fifo *pObj) -{ - for (int i=0; i < pObj->capacity; i++) - { - free(pObj->ppData[i]); - } - free (pObj->ppData); - pObj->itemSize = 0; - pObj->capacity = 0; -} - -void Fifo_push(Fifo *pObj, void *pItem) -{ - if (pObj->fill >= pObj->capacity) - { - printf("%s: Fifo is full\n", pObj->pName); - return; - } - memcpy(pObj->ppData[pObj->wi], pItem, pObj->itemSize); - pObj->wi++; - pObj->fill++; - if (pObj->wi == pObj->capacity) - { - pObj->wi = 0; - } -} - -int Fifo_pop(Fifo *pObj, void *pItem) -{ - if (!pObj->fill) - { - return 0; - } - memcpy(pItem, pObj->ppData[pObj->ri], pObj->itemSize); - pObj->ri++; - pObj->fill--; - if (pObj->ri == pObj->capacity) - { - pObj->ri = 0; - } - return 1; -} - -int Fifo_isEmpty(Fifo *pObj) -{ - return pObj->fill == 0; -} - -void adc_start_conversion(int ch); ISR(ADC_vect) { int16_t value_low = (int16_t)ADCL; @@ -127,7 +60,7 @@ ISR(ADC_vect) if (((adc_value[adc_ch] - value) < -1) || ((adc_value[adc_ch] - value) > 1)) { Msg_t msg = {AdcComplete, adc_ch}; - Fifo_push(&messageFifo, &msg); + fifo_push(&messageFifo, &msg); } adc_value[adc_ch] = value; @@ -145,19 +78,21 @@ ISR(USART_RX_vect) if (rx_data == ' ') { Msg_t msg = {Error, rx_data}; - Fifo_push(&messageFifo, &msg); + fifo_push(&messageFifo, &msg); } else if (rx_data >= '0' && rx_data <= '9') { Msg_t msg = {Command, rx_data}; - Fifo_push(&messageFifo, &msg); + fifo_push(&messageFifo, &msg); } + Msg_t msg = {Uart, rx_data}; + fifo_push(&messageFifo, &msg); } ISR (TIMER1_OVF_vect) // Timer1 ISR { Msg_t msg = {Timer, ledState}; - Fifo_push(&messageFifo, &msg); + fifo_push(&messageFifo, &msg); TCNT1 = TIMER_RELOAD; ledState++; @@ -167,201 +102,15 @@ ISR (TIMER1_OVF_vect) // Timer1 ISR } } -void uart_init() -{ - // Set baud rate - UBRR0L = (uint8_t)BAUD_PRESCALE; - UBRR0H = (uint8_t)(BAUD_PRESCALE >> 8); - - // Enable receiver and transmitter - UCSR0B = (1<> 8); - *(buffer++) = (uint8_t)(dac_value >> 0); - - return 2; -} - -size_t MCP47x6_write_volatile_mem(uint16_t dac_value, uint8_t *buffer, size_t size) -{ - *(buffer++) = mask & 0x40; - dac_value <<= 4; - *(buffer++) = (uint8_t)(dac_value >> 8); - *(buffer++) = (uint8_t)(dac_value >> 0); - - return 3; -} - int main(void) { - Fifo_init(&messageFifo, 64, sizeof(Msg_t), "Fifo"); + fifo_init(&messageFifo, 64, sizeof(Msg_t), "Fifo"); /* Replace with your application code */ - uart_init(); - timer_init(); + uart_init(BAUD_PRESCALE); + timer_init(TIMER_RELOAD); adc_init(); i2c_init(); @@ -374,17 +123,44 @@ int main(void) sei(); adc_start_conversion(adc_ch); + + char cmdStr[16]; + size_t cmdStrSize = 0; while (1) { Msg_t msg; - if (!Fifo_isEmpty(&messageFifo)) + if (!fifo_isEmpty(&messageFifo)) { cli(); - Fifo_pop(&messageFifo, &msg); + fifo_pop(&messageFifo, &msg); sei(); switch(msg.code) { + case Uart: + { + cmdStr[cmdStrSize] = 0; + if (cmdStrSize < sizeof(cmdStr)) + { + char c = msg.data; + if (c == 0x0A || c == 0x0D) + { + printf("Command : %s\n", cmdStr); + cmdStrSize = 0; + } + else + { + cmdStr[cmdStrSize++] = c; + } + } + else + { + printf("Invalid command : %s\n", cmdStr); + cmdStrSize = 0; + } + } + break; + case Command: { printf("Command : %c\n", msg.data); diff --git a/Control/firmware/uart_echo/uart_echo.cproj b/Control/firmware/uart_echo/uart_echo.cproj index dc82cd6..8e15593 100755 --- a/Control/firmware/uart_echo/uart_echo.cproj +++ b/Control/firmware/uart_echo/uart_echo.cproj @@ -160,9 +160,51 @@ + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + compile + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + + + compile + \ No newline at end of file