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);
67 // Adjust the DAC value so we output a slow sine wave
69 if ((dacValue <= 0) || (dacValue >= (1024 - dacDirection)))
70 dacDirection = 0 - dacDirection;
73 dacValue += dacDirection;
76 // Read the current ADC value, keep only top 2 bits. If it changes,
77 // tell the LED task to change the blink rate.
79 if ((adcValue = (adcRead0_3 () >> 8)) != adcLastValue)
81 xQueueSend (xLEDQueue, &adcValue, (portTickType) 0);
82 adcLastValue = adcValue;
87 // Update the sensors data
89 if (xSemaphoreTake (semaphore, portMAX_DELAY) == pdTRUE)
91 sensorData.sensorCount++;
92 sensorData.adcChanges = adcChanged;
94 xSemaphoreGive (semaphore);
99 // get and display last X, Y, and Z accelerometer readings,
100 // the start another conversion
102 printf("Vbat %04x Pres %04x X %04x Y %04x Z %04x\n",
103 adcReadVbat(), adcReadPres(), adcReadX(), adcReadY(), adcReadZ());