mbed Weather Platform firmware http://mbed.org/users/okini3939/notebook/mbed-weather-platform-firmware/
Dependencies: ChaNFSSD EthernetNetIf I2CLEDDisp Agentbed ChaNFSUSB ILinterpreter mbed BMP085 WeatherMeters ConfigFile ChaNFS I2CLCD
ilip.cpp@0:bdb53686c194, 2011-07-04 (annotated)
- Committer:
- okini3939
- Date:
- Mon Jul 04 15:16:45 2011 +0000
- Revision:
- 0:bdb53686c194
- Child:
- 1:6c7141895545
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okini3939 | 0:bdb53686c194 | 1 | /** @file |
okini3939 | 0:bdb53686c194 | 2 | * @brief mbed Weather Platform |
okini3939 | 0:bdb53686c194 | 3 | */ |
okini3939 | 0:bdb53686c194 | 4 | #include "mbed.h" |
okini3939 | 0:bdb53686c194 | 5 | #include "weather.h" |
okini3939 | 0:bdb53686c194 | 6 | #ifdef USE_IL |
okini3939 | 0:bdb53686c194 | 7 | #include "ILinterpreter.h" |
okini3939 | 0:bdb53686c194 | 8 | |
okini3939 | 0:bdb53686c194 | 9 | static ILinterpreter ilip; |
okini3939 | 0:bdb53686c194 | 10 | #endif |
okini3939 | 0:bdb53686c194 | 11 | static Serial xbee(p13, p14); |
okini3939 | 0:bdb53686c194 | 12 | static volatile int measure_flg = 0; |
okini3939 | 0:bdb53686c194 | 13 | |
okini3939 | 0:bdb53686c194 | 14 | #ifdef USE_IL |
okini3939 | 0:bdb53686c194 | 15 | // input relay |
okini3939 | 0:bdb53686c194 | 16 | float cb_input(char key, int keynum, eEXPRESSION exp, int old) { |
okini3939 | 0:bdb53686c194 | 17 | float value = 0; |
okini3939 | 0:bdb53686c194 | 18 | Sensor *s; |
okini3939 | 0:bdb53686c194 | 19 | |
okini3939 | 0:bdb53686c194 | 20 | if (old) { |
okini3939 | 0:bdb53686c194 | 21 | s = &sensor_old; |
okini3939 | 0:bdb53686c194 | 22 | } else { |
okini3939 | 0:bdb53686c194 | 23 | s = &sensor; |
okini3939 | 0:bdb53686c194 | 24 | } |
okini3939 | 0:bdb53686c194 | 25 | |
okini3939 | 0:bdb53686c194 | 26 | switch (key) { |
okini3939 | 0:bdb53686c194 | 27 | case 'A': // sensor |
okini3939 | 0:bdb53686c194 | 28 | switch (keynum) { |
okini3939 | 0:bdb53686c194 | 29 | case 0: |
okini3939 | 0:bdb53686c194 | 30 | value = s->pres; |
okini3939 | 0:bdb53686c194 | 31 | break; |
okini3939 | 0:bdb53686c194 | 32 | case 1: |
okini3939 | 0:bdb53686c194 | 33 | value = s->temp; |
okini3939 | 0:bdb53686c194 | 34 | break; |
okini3939 | 0:bdb53686c194 | 35 | case 2: |
okini3939 | 0:bdb53686c194 | 36 | value = s->humi; |
okini3939 | 0:bdb53686c194 | 37 | break; |
okini3939 | 0:bdb53686c194 | 38 | case 3: |
okini3939 | 0:bdb53686c194 | 39 | value = s->anemo; |
okini3939 | 0:bdb53686c194 | 40 | break; |
okini3939 | 0:bdb53686c194 | 41 | case 4: |
okini3939 | 0:bdb53686c194 | 42 | value = s->vane; |
okini3939 | 0:bdb53686c194 | 43 | break; |
okini3939 | 0:bdb53686c194 | 44 | case 5: |
okini3939 | 0:bdb53686c194 | 45 | value = s->rain; |
okini3939 | 0:bdb53686c194 | 46 | break; |
okini3939 | 0:bdb53686c194 | 47 | case 6: |
okini3939 | 0:bdb53686c194 | 48 | value = s->light; |
okini3939 | 0:bdb53686c194 | 49 | break; |
okini3939 | 0:bdb53686c194 | 50 | case 7: |
okini3939 | 0:bdb53686c194 | 51 | value = s->uv; |
okini3939 | 0:bdb53686c194 | 52 | break; |
okini3939 | 0:bdb53686c194 | 53 | case 8: |
okini3939 | 0:bdb53686c194 | 54 | value = s->moist; |
okini3939 | 0:bdb53686c194 | 55 | break; |
okini3939 | 0:bdb53686c194 | 56 | case 99: |
okini3939 | 0:bdb53686c194 | 57 | value = measure_flg; |
okini3939 | 0:bdb53686c194 | 58 | break; |
okini3939 | 0:bdb53686c194 | 59 | } |
okini3939 | 0:bdb53686c194 | 60 | break; |
okini3939 | 0:bdb53686c194 | 61 | |
okini3939 | 0:bdb53686c194 | 62 | case 'I': // input |
okini3939 | 0:bdb53686c194 | 63 | if (keynum >= INPUT_NUM) break; |
okini3939 | 0:bdb53686c194 | 64 | value = s->input[keynum]; |
okini3939 | 0:bdb53686c194 | 65 | break; |
okini3939 | 0:bdb53686c194 | 66 | |
okini3939 | 0:bdb53686c194 | 67 | case 'Q': // output |
okini3939 | 0:bdb53686c194 | 68 | if (keynum >= OUTPUT_NUM) break; |
okini3939 | 0:bdb53686c194 | 69 | value = s->output[keynum]; |
okini3939 | 0:bdb53686c194 | 70 | break; |
okini3939 | 0:bdb53686c194 | 71 | } |
okini3939 | 0:bdb53686c194 | 72 | |
okini3939 | 0:bdb53686c194 | 73 | return value; |
okini3939 | 0:bdb53686c194 | 74 | } |
okini3939 | 0:bdb53686c194 | 75 | |
okini3939 | 0:bdb53686c194 | 76 | // output relay |
okini3939 | 0:bdb53686c194 | 77 | void cb_output(char key, int keynum, int reg, eMNEMONIC mne) { |
okini3939 | 0:bdb53686c194 | 78 | |
okini3939 | 0:bdb53686c194 | 79 | #ifdef DEBUG |
okini3939 | 0:bdb53686c194 | 80 | pc.printf("OUT [%c %d] %d %d\r\n", key, keynum, reg, mne); |
okini3939 | 0:bdb53686c194 | 81 | #endif |
okini3939 | 0:bdb53686c194 | 82 | pool_net(); |
okini3939 | 0:bdb53686c194 | 83 | |
okini3939 | 0:bdb53686c194 | 84 | switch (key) { |
okini3939 | 0:bdb53686c194 | 85 | case 'Q': // output |
okini3939 | 0:bdb53686c194 | 86 | if (keynum >= OUTPUT_NUM) break; |
okini3939 | 0:bdb53686c194 | 87 | if (mne == MNE_OUT) { |
okini3939 | 0:bdb53686c194 | 88 | sensor.output[keynum] = reg; |
okini3939 | 0:bdb53686c194 | 89 | } else |
okini3939 | 0:bdb53686c194 | 90 | if (mne == MNE_SET && reg) { |
okini3939 | 0:bdb53686c194 | 91 | sensor.output[keynum] = 1; |
okini3939 | 0:bdb53686c194 | 92 | } else |
okini3939 | 0:bdb53686c194 | 93 | if (mne == MNE_RST && reg) { |
okini3939 | 0:bdb53686c194 | 94 | sensor.output[keynum] = 0; |
okini3939 | 0:bdb53686c194 | 95 | } |
okini3939 | 0:bdb53686c194 | 96 | break; |
okini3939 | 0:bdb53686c194 | 97 | |
okini3939 | 0:bdb53686c194 | 98 | case 'P': // Pachube |
okini3939 | 0:bdb53686c194 | 99 | if (mne == MNE_OUT && reg) { |
okini3939 | 0:bdb53686c194 | 100 | pachube(csv); |
okini3939 | 0:bdb53686c194 | 101 | } |
okini3939 | 0:bdb53686c194 | 102 | break; |
okini3939 | 0:bdb53686c194 | 103 | |
okini3939 | 0:bdb53686c194 | 104 | case 'S': // Weather Stations |
okini3939 | 0:bdb53686c194 | 105 | if (mne == MNE_OUT && reg) { |
okini3939 | 0:bdb53686c194 | 106 | weatherstations(); |
okini3939 | 0:bdb53686c194 | 107 | } |
okini3939 | 0:bdb53686c194 | 108 | break; |
okini3939 | 0:bdb53686c194 | 109 | |
okini3939 | 0:bdb53686c194 | 110 | case 'W': // Twitter |
okini3939 | 0:bdb53686c194 | 111 | if (mne == MNE_OUT && reg) { |
okini3939 | 0:bdb53686c194 | 112 | twitter(keynum); |
okini3939 | 0:bdb53686c194 | 113 | } |
okini3939 | 0:bdb53686c194 | 114 | break; |
okini3939 | 0:bdb53686c194 | 115 | |
okini3939 | 0:bdb53686c194 | 116 | case 'X': // XBee |
okini3939 | 0:bdb53686c194 | 117 | if (mne == MNE_OUT && reg) { |
okini3939 | 0:bdb53686c194 | 118 | xbee.printf(csv); |
okini3939 | 0:bdb53686c194 | 119 | } |
okini3939 | 0:bdb53686c194 | 120 | break; |
okini3939 | 0:bdb53686c194 | 121 | |
okini3939 | 0:bdb53686c194 | 122 | case 'E': // E-mail |
okini3939 | 0:bdb53686c194 | 123 | if (mne == MNE_OUT && reg) { |
okini3939 | 0:bdb53686c194 | 124 | email(keynum); |
okini3939 | 0:bdb53686c194 | 125 | } |
okini3939 | 0:bdb53686c194 | 126 | break; |
okini3939 | 0:bdb53686c194 | 127 | } |
okini3939 | 0:bdb53686c194 | 128 | |
okini3939 | 0:bdb53686c194 | 129 | pool_net(); |
okini3939 | 0:bdb53686c194 | 130 | } |
okini3939 | 0:bdb53686c194 | 131 | #endif |
okini3939 | 0:bdb53686c194 | 132 | |
okini3939 | 0:bdb53686c194 | 133 | void pool_ilip () { |
okini3939 | 0:bdb53686c194 | 134 | #ifdef USE_IL |
okini3939 | 0:bdb53686c194 | 135 | ilip.pool(); |
okini3939 | 0:bdb53686c194 | 136 | #endif |
okini3939 | 0:bdb53686c194 | 137 | } |
okini3939 | 0:bdb53686c194 | 138 | |
okini3939 | 0:bdb53686c194 | 139 | // execute IL |
okini3939 | 0:bdb53686c194 | 140 | void exec_ilip (int enable) { |
okini3939 | 0:bdb53686c194 | 141 | Sensor sensor_tmp; |
okini3939 | 0:bdb53686c194 | 142 | |
okini3939 | 0:bdb53686c194 | 143 | measure_flg = enable; |
okini3939 | 0:bdb53686c194 | 144 | |
okini3939 | 0:bdb53686c194 | 145 | // set input |
okini3939 | 0:bdb53686c194 | 146 | // sensor.input[0] = conf.inputtype ? *aimoist > 0.5 : 0; |
okini3939 | 0:bdb53686c194 | 147 | // sensor.input[1] = swin2; |
okini3939 | 0:bdb53686c194 | 148 | |
okini3939 | 0:bdb53686c194 | 149 | sensor_tmp = sensor; |
okini3939 | 0:bdb53686c194 | 150 | |
okini3939 | 0:bdb53686c194 | 151 | #ifdef USE_IL |
okini3939 | 0:bdb53686c194 | 152 | // every time |
okini3939 | 0:bdb53686c194 | 153 | if (ilip.exec()) { |
okini3939 | 0:bdb53686c194 | 154 | printf("IL: out of stack\r\n"); |
okini3939 | 0:bdb53686c194 | 155 | } |
okini3939 | 0:bdb53686c194 | 156 | #else |
okini3939 | 0:bdb53686c194 | 157 | if (enable) { |
okini3939 | 0:bdb53686c194 | 158 | weatherstations(); |
okini3939 | 0:bdb53686c194 | 159 | pachube(csv); |
okini3939 | 0:bdb53686c194 | 160 | email(0); |
okini3939 | 0:bdb53686c194 | 161 | } |
okini3939 | 0:bdb53686c194 | 162 | #endif |
okini3939 | 0:bdb53686c194 | 163 | |
okini3939 | 0:bdb53686c194 | 164 | // set output |
okini3939 | 0:bdb53686c194 | 165 | // led3 = swout1 = sensor.output[0]; |
okini3939 | 0:bdb53686c194 | 166 | // led4 = swout2 = sensor.output[1]; |
okini3939 | 0:bdb53686c194 | 167 | |
okini3939 | 0:bdb53686c194 | 168 | sensor_old = sensor_tmp; |
okini3939 | 0:bdb53686c194 | 169 | } |
okini3939 | 0:bdb53686c194 | 170 | |
okini3939 | 0:bdb53686c194 | 171 | // init IL |
okini3939 | 0:bdb53686c194 | 172 | int init_ilip (char *dir) { |
okini3939 | 0:bdb53686c194 | 173 | char buf[40]; |
okini3939 | 0:bdb53686c194 | 174 | |
okini3939 | 0:bdb53686c194 | 175 | if (cfg.getValue("XBEE", buf, sizeof(buf))) { |
okini3939 | 0:bdb53686c194 | 176 | xbee.baud(atoi(chop(buf))); |
okini3939 | 0:bdb53686c194 | 177 | } |
okini3939 | 0:bdb53686c194 | 178 | |
okini3939 | 0:bdb53686c194 | 179 | #ifdef USE_IL |
okini3939 | 0:bdb53686c194 | 180 | strcpy(buf, dir); |
okini3939 | 0:bdb53686c194 | 181 | strcat(buf, IL_FILE); |
okini3939 | 0:bdb53686c194 | 182 | if (! ilip.load(buf)) { |
okini3939 | 0:bdb53686c194 | 183 | pc.printf("IL load %s\r\n", buf); |
okini3939 | 0:bdb53686c194 | 184 | ilip.attach(cb_input, cb_output); |
okini3939 | 0:bdb53686c194 | 185 | } |
okini3939 | 0:bdb53686c194 | 186 | #endif |
okini3939 | 0:bdb53686c194 | 187 | |
okini3939 | 0:bdb53686c194 | 188 | return 0; |
okini3939 | 0:bdb53686c194 | 189 | } |