]> rtime.felk.cvut.cz Git - hydro.git/blob - app/sensor/board.c
Renamed top directory.
[hydro.git] / app / 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 uint16_t status_val;
12 int16_t oi_temperature;
13 uint16_t oi_cid_temp;
14 int16_t oi_humidity;
15 uint16_t oi_cid_hum;
16 uint16_t oi_period;
17
18 // OBJECT INTERFACE FUNCTIONS
19 int oi_cid_temp_wrfnc(ULOI_PARAM_coninfo void *context){
20     uloi_uint_wrfnc(ULOI_ARG_coninfo context);
21     return 1;
22 }
23
24 int oi_cid_hum_wrfnc(ULOI_PARAM_coninfo void *context){
25     uloi_uint_wrfnc(ULOI_ARG_coninfo context);
26     return 1;
27 }
28
29 int oi_period_wrfnc(ULOI_PARAM_coninfo void *context){
30     uloi_uint_wrfnc(ULOI_ARG_coninfo context);
31     return 1;
32 }
33
34 void send_data() {
35     int msgsend;
36     uchar *buf;
37     int i, len;
38
39     len = DATA_BUF_LEN;
40     if (oi_period == 1) len = len + 6;
41
42     read_ADC(&adcst);
43     adc2oi();
44
45     //.preparing of msg
46     buf = (uchar *) malloc(len*sizeof(uchar));  // NULL NULL NULL TEMPERATURE_CID len_data oi_temperature CID_HUM len_data oi_humidity
47     for (i=0; i<=2; i++) buf[i] = 0;
48
49     if (oi_period == 1){
50         int2buf(&buf[3],HEART_CID);
51         int2buf(&buf[5],2);
52         int2buf(&buf[7],status_val);
53         int2buf(&buf[9],oi_cid_temp);
54         int2buf(&buf[11],2);
55         int2buf(&buf[13],oi_temperature);
56         int2buf(&buf[15],oi_cid_hum);
57         int2buf(&buf[17],2);
58         int2buf(&buf[19],oi_humidity);
59     } else {
60         int2buf(&buf[3],oi_cid_temp);
61         int2buf(&buf[5],2);
62         int2buf(&buf[7],oi_temperature);
63         int2buf(&buf[9],oi_cid_hum);
64         int2buf(&buf[11],2);
65         int2buf(&buf[13],oi_humidity);
66     }
67
68     msgsend = ul_send_query(ul_fd, ul_dyac->ul_dysa, UL_CMD_PDO, UL_BFL_NORE, (void*) buf, len);
69     printf("[I] DATA\n");
70     free(buf);
71     ul_freemsg(ul_fd);
72 }
73
74 void accept_SDO(void) {
75         // setting lan configuration
76         if ((ul_inepoll(ul_fd)>0) && (ul_acceptmsg(ul_fd, &msginfo)>=0)) {
77            if ((msginfo.cmd != UL_CMD_PDO) && (msginfo.sadr != 99)) {
78                 if (!(msginfo.flg&(UL_BFL_PROC | UL_BFL_FAIL))) {
79                     //waiting for msg from bus
80                     if (uloi_process_msg(ULOI_ARG_coninfo (uloi_objdes_array_t*)&uloi_objdes_main, &msginfo)<0) {
81                         //checking dynamic adresation
82                         if (uldy_process_msg(ULDY_ARG_ul_dyac &msginfo)>=0){
83                             printf("message recieved - UL_CMD_NCS, sadr: %i, dadr: %i, cmd: %i\n",msginfo.sadr, msginfo.dadr, msginfo.cmd);
84                             printf("server addr :%i\n",ul_dyac->ul_dysa);
85                         } else {
86                             ul_freemsg(ul_fd);
87                             printf("problem in uldy_process_msg\n");
88                         }
89                     } else {
90                         printf("ULOI message processed\n");
91                     }
92                 } else {
93                     ul_freemsg(ul_fd);
94                 }
95             }
96         }
97 }
98
99 void setmyaddr(void){
100     ul_setmyadr(ul_fd,99);
101 }
102
103 void adc2oi(void){
104     oi_temperature = adcst.temp;
105     oi_humidity = adcst.hum;
106 }
107
108 void oiinit(void){
109     oi_cid_temp=233;
110     oi_cid_hum=234;
111     oi_period=2;
112     status_val = 5;
113 }
114
115 void work_with(void){
116     mstime_t time;
117     led1_time = current_time();
118     led2_time = current_time();
119 //     adcst.read = 0;
120 //     adcst.temp = 0;
121 //     adcst.temp_tmp = 0;
122 //     adcst.hum = 0;
123 //     adcst.hum_tmp = 0;
124 //     adcst.cnt = 0;
125
126     time = current_time();
127
128     while(1){
129         blink();
130         read_ADC(&adcst);
131
132         if((current_time()-time) > 1000){
133             printf("AD0.1 %i\n", adcst.temp);
134             printf("AD0.2 %i\n", adcst.hum);
135             time = current_time();
136             }
137     }
138 }
139
140 void init_ADC (int selected){
141     PINSEL1|= 0x05000000; // P0.28 and P0.29 set for AD0.1 and AD0.2 inputs
142     AD0CR &= 0x00000000; // Clear All Bit Control 
143     switch (selected){
144         case 1: AD0CR |= 0x00000002; // Select ADC = AIN1, CLKDive => Pclk/(x+1)< 4.5Mhz 
145                 break;
146         case 2: AD0CR |= 0x00000004; // Select ADC = AIN2
147                 break;
148     }
149     AD0CR |= 0x0000FF00; // ADC Clock = VBP(PCLK) / 7 1.55us 
150     AD0CR &= 0xFFF1FFFF; // CLKS 11 ciclos de reloj Res Máx 
151     AD0CR |= 0x00200000; // PDN = 1 = Active ADC Module 
152 //     AD0CR |= 0x00010000; // Burst = 1 = Continuing conversion 
153 //     AD0CR &= 0xFF3FFFFF; // TEST[1:0] = 00 = Modo normal 
154 //     AD0CR &= 0xF7FFFFFF; // EDGE = 0 = Flanco de bajada 
155 //     AD0STAT = 0x00000110; 
156 }
157
158 int read_ADC (adc_stat_t *adcst){
159     init_ADC(1);
160     AD0CR |= 0x01000000; // start conversion
161     while (!(AD0GDR & (ADGDR_DONE))); // wait for DONE to go high
162
163     adcst->read = AD0DR1; // get ADC data
164     adcst->read = ((adcst->read >>6) & 0x03FF); // extraction of result
165     adcst->temp_tmp += adcst->read;
166
167     init_ADC(2);
168     AD0CR |= 0x01000000; // start conversion
169     while (!(AD0GDR & (ADGDR_DONE))); // wait for DONE to go high
170
171     adcst->read = AD0DR2;
172     adcst->read = ((adcst->read >>6) & 0x03FF); // extraction of result
173     adcst->hum_tmp += adcst->read;
174
175     adcst->cnt++;
176     if (adcst->cnt == 30){
177         adcst->cnt = 0;
178         adcst->temp = adcst->temp_tmp/16;
179         adcst->hum = adcst->hum_tmp/16;
180         adcst->temp_tmp = 0;
181         adcst->hum_tmp = 0;
182         return 1;
183     }
184
185     return 0;
186 }