]> rtime.felk.cvut.cz Git - hydro.git/blob - app-stefic/sensor/board.c
Repairs in code
[hydro.git] / app-stefic / sensor / board.c
1
2 #include <stdio.h>
3 #include <system_def.h>
4 #include <cpu_def.h>
5
6 #include "board.h"
7
8 adc_stat_t adcst;
9
10 // OBJECT INTERFACE VARIABLES
11 int oi_temperature;
12 unsigned int oi_cid_temp;
13 int oi_humidity;
14 unsigned int oi_cid_hum;
15 unsigned int oi_period;
16
17 // OBJECT INTERFACE FUNCTIONS
18 int oi_cid_temp_wrfnc(ULOI_PARAM_coninfo void *context){
19     uloi_uint_wrfnc(ULOI_ARG_coninfo &oi_cid_temp);
20     return 1;
21 }
22
23 int oi_cid_hum_wrfnc(ULOI_PARAM_coninfo void *context){
24     uloi_uint_wrfnc(ULOI_ARG_coninfo &oi_cid_hum);
25     return 1;
26 }
27
28 int oi_period_wrfnc(ULOI_PARAM_coninfo void *context){
29     uloi_uint_wrfnc(ULOI_ARG_coninfo context);
30     return 1;
31 }
32
33 void send_data() {
34     int msgsend;
35
36     int cid_cnt = 0;
37     static const int MAX_CID_CNT = 3;
38     cid_data_t cids[MAX_CID_CNT];
39
40     if (oi_period == 1){
41         cids[cid_cnt].cid = HEART_CID; 
42         cids[cid_cnt].value = status_val; 
43         cid_cnt++;
44     }
45     if (oi_cid_temp > 0){
46         cids[cid_cnt].cid = oi_cid_temp; 
47         cids[cid_cnt].value = oi_temperature; 
48         cid_cnt++;
49     }
50     if (oi_cid_hum > 0){
51         cids[cid_cnt].cid = oi_cid_hum; 
52         cids[cid_cnt].value = oi_humidity; 
53         cid_cnt++;
54     }
55
56     if (cid_cnt != 0){
57         int i;
58         int buff_len;
59
60         for (i=0; i<=CNT; i++) read_ADC(&adcst);
61         adc2oi();
62
63         uchar buf[cid_cnt * 6 + 3];
64         for (buff_len = 0; buff_len < 3; buff_len++) buf[buff_len] = 0;
65
66         for(i=0; i<cid_cnt; i++) {
67             int2buf(buf + buff_len, cids[i].cid);
68             buff_len += 2;
69             int2buf(buf + buff_len, 2);
70             buff_len += 2;
71             int2buf(buf + buff_len, cids[i].value);
72             buff_len += 2;
73         }
74
75         msgsend = ul_send_query(ul_fd, 0, UL_CMD_PDO, UL_BFL_NORE, (void*) buf, buff_len);
76         printf("[I] DATA\n");
77         ul_freemsg(ul_fd);
78     }
79 }
80
81 // void adc2oi(void){
82 //     oi_temperature = 25;
83 // //     printf("temperature: %i\n",adcst.temp);
84 //     oi_humidity = 100;
85 // //     printf("humidity: %i\n",adcst.hum);
86 // }
87
88 void adc2oi(void){
89     oi_temperature = adcst.temp;
90     printf("temperature: %i\n",adcst.temp);
91     oi_humidity = adcst.hum;
92     printf("humidity: %i\n",adcst.hum);
93 }
94
95 void oiinit(void){
96     oi_cid_temp = 0;
97     oi_cid_hum = 0;
98     oi_period = 2;
99     status_val = 5;
100 }
101
102 void check_PDO(int cid, int data){}
103 void regulate(void){}
104
105 void work_with(void){
106     mstime_t time;
107     led1_time = current_time();
108     led2_time = current_time();
109 //     adcst.read = 0;
110 //     adcst.temp = 0;
111 //     adcst.temp_tmp = 0;
112 //     adcst.hum = 0;
113 //     adcst.hum_tmp = 0;
114 //     adcst.cnt = 0;
115
116     time = current_time();
117
118     while(1){
119 //         blink();
120 //         read_ADC(&adcst);
121
122         if((current_time()-time) > 1000){
123             printf("AD0.1 %i\n", adcst.temp);
124 //             printf("AD0.2 %i\n", adcst.hum);
125             time = current_time();
126             }
127     }
128 }
129
130 void init_ADC (int selected){
131     PINSEL1|= 0x05000000; // P0.28 and P0.29 set for AD0.1 and AD0.2 inputs
132     AD0CR &= 0x00000000; // Clear All Bit Control 
133     switch (selected){
134         case 1: AD0CR |= 0x00000002; // Select ADC = AIN1, CLKDive => Pclk/(x+1)< 4.5Mhz 
135                 break;
136         case 2: AD0CR |= 0x00000004; // Select ADC = AIN2
137                 break;
138     }
139     AD0CR |= 0x0000FF00; // ADC Clock = VBP(PCLK) / 7 1.55us 
140     AD0CR &= 0xFFF1FFFF; // CLKS 11 ciclos de reloj Res Máx 
141     AD0CR |= 0x00200000; // PDN = 1 = Active ADC Module 
142 //     AD0CR |= 0x00010000; // Burst = 1 = Continuing conversion 
143 //     AD0CR &= 0xFF3FFFFF; // TEST[1:0] = 00 = Modo normal 
144 //     AD0CR &= 0xF7FFFFFF; // EDGE = 0 = Flanco de bajada 
145 //     AD0STAT = 0x00000110; 
146 }
147
148 int read_ADC (adc_stat_t *adcst){
149     init_ADC(1);
150     AD0CR |= 0x01000000; // start conversion
151     while (!(AD0GDR & (ADGDR_DONE))); // wait for DONE to go high
152
153     adcst->read = AD0DR1; // get ADC data
154     adcst->read = ((adcst->read >>6) & 0x03FF); // extraction of result
155     adcst->temp_tmp += adcst->read;
156
157     init_ADC(2);
158     AD0CR |= 0x01000000; // start conversion
159     while (!(AD0GDR & (ADGDR_DONE))); // wait for DONE to go high
160
161     adcst->read = AD0DR2;
162     adcst->read = ((adcst->read >>6) & 0x03FF); // extraction of result
163     adcst->hum_tmp += adcst->read;
164
165     adcst->cnt++;
166     if (adcst->cnt == CNT){
167         adcst->cnt = 0;
168         adcst->temp = adcst->temp_tmp/CNT;
169         adcst->hum = adcst->hum_tmp/CNT;
170         adcst->temp_tmp = 0;
171         adcst->hum_tmp = 0;
172         return 1;
173     }
174
175     return 0;
176 }