changing circuitry to disable RTC, update initialization to match
[fw/openalt] / sensors / sensors.c
1 //
2 //
3 //
4 #include <stdio.h>
5 #include <string.h>
6 #include <unistd.h>
7 #include <fcntl.h>
8
9 #include "FreeRTOS.h"
10 #include "task.h"
11 #include "semphr.h"
12
13 #include "../main.h"
14 #include "../adc/adc.h"
15 #include "../dac/dac.h"
16 #include "../leds/leds.h"
17 #include "sensors.h"
18
19 //
20 //
21 //
22 static sensorData_t sensorData;
23 static xSemaphoreHandle semaphore;
24
25 //
26 //  Return 1 if got a copy, 0 if not.
27 //
28 int sensorsCopyData (sensorData_t *dst)
29 {
30   if (xSemaphoreTake (semaphore, 100 / portTICK_RATE_MS) == pdTRUE)
31   {
32     memcpy (dst, &sensorData, sizeof (sensorData));
33     xSemaphoreGive (semaphore);
34     return 1;
35   }
36
37   memset (dst, 0, sizeof (sensorData_t));
38   return 0;
39 }
40
41 //
42 //
43 //
44 portTASK_FUNCTION (vSensorsTask, pvParameters __attribute__ ((unused)))
45 {
46   portTickType xTickCount;
47   int adcValue;
48   int adcLastValue = -1;
49   int adcChanged = -1;
50   int dacValue = 0;
51   int dacDirection = -16;
52
53   memset (&sensorData, 0, sizeof (sensorData));
54
55   vSemaphoreCreateBinary (semaphore);
56
57   xTickCount = xTaskGetTickCount ();
58
59   for (;;)
60   {
61     vTaskDelayUntil (&xTickCount, 100 / portTICK_RATE_MS);
62
63     // printf("tick\n");
64
65 #ifndef BDALE
66     //
67     //  Adjust the DAC value so we output a slow sine wave
68     //
69     if ((dacValue <= 0) || (dacValue >= (1024 - dacDirection)))
70       dacDirection = 0 - dacDirection;
71
72     dacSet (dacValue);
73     dacValue += dacDirection;
74
75     //
76     //  Read the current ADC value, keep only top 2 bits.  If it changes,
77     //  tell the LED task to change the blink rate.
78     //
79     if ((adcValue = (adcRead0_3 () >> 8)) != adcLastValue)
80     {
81       xQueueSend (xLEDQueue, &adcValue, (portTickType) 0);
82       adcLastValue = adcValue;
83       adcChanged++;
84     }
85
86     //
87     //  Update the sensors data
88     //
89     if (xSemaphoreTake (semaphore, portMAX_DELAY) == pdTRUE)
90     {
91       sensorData.sensorCount++;
92       sensorData.adcChanges = adcChanged;
93
94       xSemaphoreGive (semaphore);
95     }
96 #endif
97
98     //
99     //  get and display last X, Y, and Z accelerometer readings,
100     //  the start another conversion
101     //
102     printf("Vbat %04x  Pres %04x  X %04x  Y %04x  Z %04x\n", 
103         adcReadVbat(), adcReadPres(), adcReadX(), adcReadY(), adcReadZ());
104
105   }
106 }