diff options
| author | Donald Delmar Davis <don@suspectdevices.com> | 2012-08-13 17:42:25 -0700 |
|---|---|---|
| committer | Donald Delmar Davis <don@suspectdevices.com> | 2012-08-13 17:42:25 -0700 |
| commit | 1b8d33c1b063054b20409a5fbc2711c80e8bbf1d (patch) | |
| tree | 1c836000fb3b88a3d0630c04781c6b1d457015c0 /dumblogger/datalogger.cpp | |
| parent | 8b9f691d1f711b94c0c78125cf8c48d12d9cfcc3 (diff) | |
Draft of Freertos based logger without wifi.
Diffstat (limited to 'dumblogger/datalogger.cpp')
| -rw-r--r-- | dumblogger/datalogger.cpp | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/dumblogger/datalogger.cpp b/dumblogger/datalogger.cpp new file mode 100644 index 0000000..e17f1af --- /dev/null +++ b/dumblogger/datalogger.cpp @@ -0,0 +1,235 @@ +/*-----------------------------------------------------------------datalogger.cpp + * + * This is a functional prototype of a datalogger. + * + * + * + *-----------------------------------------------------------------------------*/ + +#ifndef uint8_t +#define uint8_t uint8 +#define uint16_t uint16 +//#define uint32_t uint32 +#endif + +#define ASCII_DELETE '\177' +#define ASCII_BACKSPACE '\010' + +/*---------------------------------------------------------------------TUNABLES + * + *----------------------------------------------------------------------------*/ + +#define BLU_LED 19 +#define YEL_LED 18 +#define GRN_LED 14 +#define LED_ON LOW +#define LED_OFF HIGH +/** + * \file setup.cpp + */ +#include <stdio.h> +#include <io.h> +#include <signal.h> +#include <stdint.h> +#include <wirish/wirish.h> +#include "MapleFreeRTOS.h" +#include <libmaple/timer.h> +#include <libmaple/usart.h> +//extern "C" { +#include "Monitor.h" +//} +/* Function Prototypes */ +static void vSerialTask(void* pvParameters); +static void vMonitorTask(void* pvParameters); +static void vLedTask(void* pvParameters); + +/* Global Variables */ + + +const int sensor_pin = 12; +void hardwareSetup(void) { + pinMode(YEL_LED, OUTPUT); + pinMode(GRN_LED, OUTPUT); + pinMode(BLU_LED, OUTPUT); + digitalWrite(YEL_LED, HIGH); + digitalWrite(BLU_LED, LOW); + digitalWrite(GRN_LED, HIGH); + SerialUSB.begin(); +} +/** + * The main function. + */ +void setup( void ) +{ + hardwareSetup(); + // Setup the LED to steady on + pinMode(BOARD_LED_PIN, OUTPUT); + digitalWrite(BOARD_LED_PIN, HIGH); + + // Setup the button as input + pinMode(BOARD_BUTTON_PIN, INPUT); + digitalWrite(BOARD_BUTTON_PIN, HIGH); + + // Setup the sensor pin as an analog input + pinMode(sensor_pin,INPUT_ANALOG); + + + /* Add tasks to the scheduler */ + xTaskCreate(vSerialTask, (const signed char*)"Serial", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); + xTaskCreate(vMonitorTask, (const signed char*)"Monitor", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); + xTaskCreate(vLedTask, (const signed char*)"Led", configMINIMAL_STACK_SIZE, NULL, 1, NULL ); + + /* Start the scheduler. */ + vTaskStartScheduler(); +} + +void loop( void ) +{ +} + +static void vLedTask(void* pvParameters) +{ + while (true){ + togglePin(BLU_LED); + vTaskDelay(200); + } +} +// move these to monitor..... + +/*-----------------------------------------------------------------vSerialTask() + * + * Handle (usb/serial) from console and monitored device. + * The idea here is to handle the incoming characters as quickly as possible. + * All data coming from the console or the datalogger + * is delimited by <CR><LF>. Finding an end of line "gives" a semaphore. + * + * eventually this should be moved down to the + */ +static void vSerialTask(void* pvParameters) +{ + portTickType xLastWakeTime = xTaskGetTickCount(); + const portTickType xWakePeriod = 50; + + usart_init(USART1); + usart_set_baud_rate(USART1, USART_USE_PCLK, 9600); + usart_enable(USART1); + deviceComm.len=0; + deviceComm.gotline=false; + //vSemaphoreCreateBinary( deviceComm.xGotLineSemaphore ); + //if( consoleComm.xGotLineSemaphore == NULL ) + //{ // FREAK OUT!!! + //} + consoleComm.len=0; + consoleComm.gotline=false; + //vSemaphoreCreateBinary( consoleComm.xGotLineSemaphore ); + //if( consoleComm.xGotLineSemaphore == NULL ) + //{ // FREAK THE HELL OUT!!! + //} + + + // usart_init(USART2); + // usart_set_baud_rate(USART2, USART_USE_PCLK, 9600); + // usart_enable(USART2); + + while (true) + { + togglePin(YEL_LED); + uint32_t rc=0; + unsigned char ch; +#if 0 + if (!deviceComm.gotline) { + //rc=usart_data_available(USART1); + while (usart_data_available(USART1) + && deviceComm.len<(MAX_COMMAND_LINE_LENGTH-1)) { + ch=usart_getc(USART1); + + if (ch=='\r') { + deviceComm.gotline=true; + deviceComm.line[deviceComm.len]='\0'; + //xSemaphoreGive(deviceComm.xGotLineSemaphore); + break; + } else if (ch!='\n') { + deviceComm.line[deviceComm.len++]=ch; + } + } + } +#endif + if (!consoleComm.gotline) { + while(SerialUSB.isConnected() && SerialUSB.available() + && consoleComm.len<(MAX_COMMAND_LINE_LENGTH-1)) { + ch=SerialUSB.read(); + SerialUSB.write(ch); + if (ch=='\r') { + consoleComm.gotline=true; + consoleComm.line[consoleComm.len]='\0'; + //xSemaphoreGive(consoleComm.xGotLineSemaphore); + break; + } else if ((ch==ASCII_DELETE) || (ch==ASCII_BACKSPACE)) { + if (consoleComm.len) consoleComm.len--; + } else if (ch!='\n') { + consoleComm.line[consoleComm.len++]=ch; + } + } + } + + vTaskDelayUntil(&xLastWakeTime, xWakePeriod); + + } +} + +#define IN_NO_TIME_AT_ALL (( portTickType ) (5/portTICK_RATE_MS)) +#define UNTIL_ITS_ANNOYING (( portTickType ) (550/portTICK_RATE_MS)) +static void vMonitorTask(void* pvParameters) +{ + portTickType xLastWakeTime = xTaskGetTickCount(); + + const portTickType xWakePeriod = 100; + int ret; + /* Infinite loop */ + while(true) + { //if(deviceComm.gotline){ +// if (xSemaphoreTake(deviceComm.xGotLineSemaphore,IN_NO_TIME_AT_ALL)){ +// handleDeviceInput(&deviceComm); +// xSemaphoreGive(deviceComm.xGotLineSemaphore); +// } + if (consoleComm.gotline){ +// if (xSemaphoreTake(consoleComm.xGotLineSemaphore,IN_NO_TIME_AT_ALL)){ + ret=handleConsoleInput(&consoleComm); +// xSemaphoreGive(consoleComm.xGotLineSemaphore); + // if(ret==COMMAND_FORWARDED){ +// if (xSemaphoreTake(deviceComm.xGotLineSemaphore,UNTIL_ITS_ANNOYING)) { + // while (!deviceComm.gotline) { + + // } + // handleDeviceInput(&deviceComm); +// xSemaphoreGive(deviceComm.xGotLineSemaphore); + //} + //} + } + // + + + togglePin(GRN_LED); + //SerialUSB.println("?"); + toConsole("?"); + // vTaskDelay(100); + vTaskDelayUntil(&xLastWakeTime, xWakePeriod); + } +} + +// Force init to be called *first*, i.e. before static object allocation. +// Otherwise, statically allocated objects that need libmaple may fail. +__attribute__((constructor)) void premain() { + init(); +} + +int main(void) { + setup(); + // should never get past setup. + while (true) { + loop(); + } + + return 0; + +}
\ No newline at end of file |
