14 #include "../adc/adc.h"
15 #include "../dac/dac.h"
16 #include "../leds/leds.h"
22 static sensorData_t sensorData;
23 static xSemaphoreHandle semaphore;
26 // Return 1 if got a copy, 0 if not.
28 int sensorsCopyData (sensorData_t *dst)
30 if (xSemaphoreTake (semaphore, 100 / portTICK_RATE_MS) == pdTRUE)
32 memcpy (dst, &sensorData, sizeof (sensorData));
33 xSemaphoreGive (semaphore);
37 memset (dst, 0, sizeof (sensorData_t));
44 portTASK_FUNCTION (vSensorsTask, pvParameters __attribute__ ((unused)))
46 portTickType xTickCount;
48 int adcLastValue = -1;
51 int dacDirection = -16;
53 memset (&sensorData, 0, sizeof (sensorData));
55 vSemaphoreCreateBinary (semaphore);
57 xTickCount = xTaskGetTickCount ();
61 vTaskDelayUntil (&xTickCount, 100 / portTICK_RATE_MS);
64 // Adjust the DAC value so we output a slow sine wave
66 if ((dacValue <= 0) || (dacValue >= (1024 - dacDirection)))
67 dacDirection = 0 - dacDirection;
70 dacValue += dacDirection;
73 // Read the current ADC value, keep only top 2 bits. If it changes,
74 // tell the LED task to change the blink rate.
76 if ((adcValue = (adcRead0_3 () >> 8)) != adcLastValue)
78 xQueueSend (xLEDQueue, &adcValue, (portTickType) 0);
79 adcLastValue = adcValue;
84 // Update the sensors data
86 if (xSemaphoreTake (semaphore, portMAX_DELAY) == pdTRUE)
88 sensorData.sensorCount++;
89 sensorData.adcChanges = adcChanged;
91 xSemaphoreGive (semaphore);