library for enebular edge agent board(version p1)

Dependents:   ina-hack-2nd

Committer:
koyo_take
Date:
Sun Oct 22 03:56:20 2017 +0000
Revision:
3:f80f2838a956
Parent:
2:d48fcae8b5bd
resolve LoRa port number conflit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
koyo_take 0:c6b2a8ace823 1 #include "Eeabp1.h"
koyo_take 2:d48fcae8b5bd 2 #include <string.h>
koyo_take 0:c6b2a8ace823 3
koyo_take 0:c6b2a8ace823 4 static const int lora_msg_max_len = 11;
koyo_take 0:c6b2a8ace823 5
koyo_take 0:c6b2a8ace823 6 Eeabp1::Eeabp1() : pwr_en(P0_0), led(P0_23),
koyo_take 0:c6b2a8ace823 7 lora_power(P0_5), lora_reset(P0_22), grove_power(P0_6),
koyo_take 0:c6b2a8ace823 8 grv_sel2a(P0_19), grv_sel2g(P0_18), grv_sel1a(P0_17), grv_sel1g(P0_16),
koyo_take 0:c6b2a8ace823 9 grv_p1s1a(P0_2), grv_p1s2a(P0_1),
koyo_take 0:c6b2a8ace823 10 grv_p2s1a(P0_4), grv_p2s2a(P0_3)
koyo_take 0:c6b2a8ace823 11 {
koyo_take 0:c6b2a8ace823 12 this->led_state = LED_OFF;
koyo_take 0:c6b2a8ace823 13 this->led = 0;
koyo_take 0:c6b2a8ace823 14 this->serial = new RawSerial(P0_9, P0_11);
koyo_take 0:c6b2a8ace823 15 this->serial->baud(9600); /* use for LoRa */
koyo_take 0:c6b2a8ace823 16 this->pwr_en = 1; // メイン電源投入
koyo_take 0:c6b2a8ace823 17 this->lora_power = 0;
koyo_take 0:c6b2a8ace823 18 this->lora_reset = 0;
koyo_take 0:c6b2a8ace823 19 this->grove_power = 0;
koyo_take 0:c6b2a8ace823 20 this->lora_enabled = false;
koyo_take 0:c6b2a8ace823 21 this->grove_enabled = false;
koyo_take 0:c6b2a8ace823 22 // Grove端子をHiZに
koyo_take 0:c6b2a8ace823 23 this->grv_sel1g = 1;
koyo_take 0:c6b2a8ace823 24 this->grv_sel1a = 1;
koyo_take 0:c6b2a8ace823 25 this->grv_sel2g = 1;
koyo_take 0:c6b2a8ace823 26 this->grv_sel2a = 1;
koyo_take 0:c6b2a8ace823 27 grv_p1s1do = NULL, grv_p1s2do = NULL, grv_p1s1di = NULL, grv_p1s2di = NULL;
koyo_take 0:c6b2a8ace823 28 grv_p2s1do = NULL, grv_p2s2do = NULL, grv_p2s1di = NULL, grv_p2s2di = NULL;
koyo_take 0:c6b2a8ace823 29 temp_humid_sensor = NULL;
koyo_take 0:c6b2a8ace823 30 }
koyo_take 0:c6b2a8ace823 31
koyo_take 0:c6b2a8ace823 32 int Eeabp1::setLedState(EeabLedState state)
koyo_take 0:c6b2a8ace823 33 {
koyo_take 0:c6b2a8ace823 34 this->led_state = state;
koyo_take 0:c6b2a8ace823 35
koyo_take 0:c6b2a8ace823 36 if (this->led_state == LED_OFF) {
koyo_take 0:c6b2a8ace823 37 this->led = 0;
koyo_take 0:c6b2a8ace823 38 } else {
koyo_take 0:c6b2a8ace823 39 this->led = 1;
koyo_take 0:c6b2a8ace823 40 }
koyo_take 0:c6b2a8ace823 41
koyo_take 0:c6b2a8ace823 42 return 0;
koyo_take 0:c6b2a8ace823 43 }
koyo_take 0:c6b2a8ace823 44
koyo_take 0:c6b2a8ace823 45 void Eeabp1::loop(void)
koyo_take 0:c6b2a8ace823 46 {
koyo_take 0:c6b2a8ace823 47 switch (this->led_state) {
koyo_take 0:c6b2a8ace823 48 case LED_OFF:
koyo_take 0:c6b2a8ace823 49 /* fall through */
koyo_take 0:c6b2a8ace823 50 case LED_ON:
koyo_take 0:c6b2a8ace823 51 break;
koyo_take 0:c6b2a8ace823 52 case LED_BLINK_FAST:
koyo_take 0:c6b2a8ace823 53 case LED_BLINK_MID:
koyo_take 0:c6b2a8ace823 54 case LED_BLINK_SLOW:
koyo_take 0:c6b2a8ace823 55 this->led = !this->led;
koyo_take 0:c6b2a8ace823 56 break;
koyo_take 0:c6b2a8ace823 57 }
koyo_take 0:c6b2a8ace823 58 }
koyo_take 0:c6b2a8ace823 59
koyo_take 0:c6b2a8ace823 60 int Eeabp1::debug(const char * format, ...)
koyo_take 0:c6b2a8ace823 61 {
koyo_take 0:c6b2a8ace823 62 char tmp[80];
koyo_take 0:c6b2a8ace823 63 int ret;
koyo_take 0:c6b2a8ace823 64
koyo_take 0:c6b2a8ace823 65 std::va_list arg;
koyo_take 0:c6b2a8ace823 66 va_start(arg, format);
koyo_take 0:c6b2a8ace823 67 vsnprintf(tmp, sizeof(tmp), format, arg);
koyo_take 0:c6b2a8ace823 68 va_end(arg);
koyo_take 0:c6b2a8ace823 69
koyo_take 0:c6b2a8ace823 70 delete this->serial;
koyo_take 0:c6b2a8ace823 71 this->serial = new RawSerial(P0_8, P0_10);
koyo_take 0:c6b2a8ace823 72 ret = this->serial->puts(tmp);
koyo_take 0:c6b2a8ace823 73 delete this->serial;
koyo_take 0:c6b2a8ace823 74 this->serial = new RawSerial(P0_9, P0_11);
koyo_take 0:c6b2a8ace823 75
koyo_take 0:c6b2a8ace823 76 return ret;
koyo_take 0:c6b2a8ace823 77 }
koyo_take 0:c6b2a8ace823 78
koyo_take 2:d48fcae8b5bd 79 static char linebuf[64];
koyo_take 0:c6b2a8ace823 80 int Eeabp1::setLoRaPower(bool on)
koyo_take 0:c6b2a8ace823 81 {
koyo_take 0:c6b2a8ace823 82 int ret;
koyo_take 1:da9fd2252ed5 83 int retry;
koyo_take 1:da9fd2252ed5 84 const int retry_max = 10;
koyo_take 0:c6b2a8ace823 85
koyo_take 0:c6b2a8ace823 86 if (on) {
koyo_take 0:c6b2a8ace823 87 if (lora_enabled)
koyo_take 0:c6b2a8ace823 88 return 0; /* power is already on, do nothing */
koyo_take 0:c6b2a8ace823 89
koyo_take 0:c6b2a8ace823 90 this->lora_power= 1;
koyo_take 0:c6b2a8ace823 91 this->lora_reset = 1;
koyo_take 0:c6b2a8ace823 92 wait_us(500000);
koyo_take 0:c6b2a8ace823 93 serial->printf("mod set_echo off\r\n"); // ローカルエコー:無効
koyo_take 0:c6b2a8ace823 94 wait(1);
koyo_take 0:c6b2a8ace823 95 flushSerial();
koyo_take 2:d48fcae8b5bd 96
koyo_take 0:c6b2a8ace823 97 serial->printf("mod factory_reset\r\n"); // ファクトリーリセットを行い鍵をリフレッシュ
koyo_take 0:c6b2a8ace823 98 ret = chkSerialCharOk();
koyo_take 0:c6b2a8ace823 99 if (ret != 0)
koyo_take 0:c6b2a8ace823 100 return ret;
koyo_take 0:c6b2a8ace823 101 serial->printf("mod set_echo off\r\n"); // ローカルエコー:無効
koyo_take 0:c6b2a8ace823 102 wait(1);
koyo_take 1:da9fd2252ed5 103 for(retry=0; retry < retry_max; retry++) {
koyo_take 1:da9fd2252ed5 104 serial->printf("lorawan join otaa\r\n"); // Gatewayに接続(OTAA)
koyo_take 1:da9fd2252ed5 105 ret = chkSerialCharRes('a'); // 成功 ">> accepted" 失敗 ">> unsuccess"
koyo_take 1:da9fd2252ed5 106 if (ret == 0)
koyo_take 1:da9fd2252ed5 107 break;
koyo_take 1:da9fd2252ed5 108 wait(10);
koyo_take 1:da9fd2252ed5 109 }
koyo_take 1:da9fd2252ed5 110 if (retry == retry_max)
koyo_take 1:da9fd2252ed5 111 return __LINE__;
koyo_take 1:da9fd2252ed5 112
koyo_take 0:c6b2a8ace823 113 serial->printf("lorawan set_dr 2\r\n"); // データレートの設定(11byte)
koyo_take 0:c6b2a8ace823 114 ret = chkSerialCharOk();
koyo_take 0:c6b2a8ace823 115 if (ret != 0)
koyo_take 0:c6b2a8ace823 116 return ret;
koyo_take 0:c6b2a8ace823 117
koyo_take 0:c6b2a8ace823 118 this->lora_enabled = true;
koyo_take 0:c6b2a8ace823 119 } else { /* off */
koyo_take 0:c6b2a8ace823 120 if (!lora_enabled)
koyo_take 0:c6b2a8ace823 121 return 0; /* power is already off, do nothing */
koyo_take 0:c6b2a8ace823 122
koyo_take 0:c6b2a8ace823 123 lora_power= 0;
koyo_take 0:c6b2a8ace823 124 lora_enabled = false;
koyo_take 0:c6b2a8ace823 125 }
koyo_take 2:d48fcae8b5bd 126
koyo_take 0:c6b2a8ace823 127 return 0;
koyo_take 0:c6b2a8ace823 128 }
koyo_take 0:c6b2a8ace823 129
koyo_take 0:c6b2a8ace823 130 int Eeabp1::sendLoRaString(const char * format, ...)
koyo_take 0:c6b2a8ace823 131 {
koyo_take 0:c6b2a8ace823 132 char str[lora_msg_max_len+1] = {0x00, };
koyo_take 0:c6b2a8ace823 133 char msg[64];
koyo_take 0:c6b2a8ace823 134 char *p = msg;
koyo_take 0:c6b2a8ace823 135
koyo_take 0:c6b2a8ace823 136 std::va_list arg;
koyo_take 0:c6b2a8ace823 137 va_start(arg, format);
koyo_take 0:c6b2a8ace823 138 vsnprintf(str, sizeof(str), format, arg);
koyo_take 0:c6b2a8ace823 139 va_end(arg);
koyo_take 0:c6b2a8ace823 140
koyo_take 3:f80f2838a956 141 p += sprintf(msg, "lorawan tx ucnf %d ", getLoraPort());
koyo_take 0:c6b2a8ace823 142 for (unsigned int i = 0; i < strlen(str); i++) {
koyo_take 0:c6b2a8ace823 143 p += sprintf(p, "%02x", str[i]);
koyo_take 0:c6b2a8ace823 144 }
koyo_take 0:c6b2a8ace823 145 sprintf(p, "\r\n");
koyo_take 0:c6b2a8ace823 146
koyo_take 0:c6b2a8ace823 147 flushSerial();
koyo_take 0:c6b2a8ace823 148 serial->puts(msg);
koyo_take 0:c6b2a8ace823 149
koyo_take 0:c6b2a8ace823 150 return 0;
koyo_take 0:c6b2a8ace823 151 }
koyo_take 0:c6b2a8ace823 152
koyo_take 2:d48fcae8b5bd 153 int Eeabp1::sendLoRaStringAndReceiveResponse(char res[], const char * format, ...)
koyo_take 2:d48fcae8b5bd 154 {
koyo_take 2:d48fcae8b5bd 155 char str[lora_msg_max_len+1] = {0x00, };
koyo_take 2:d48fcae8b5bd 156 char msg[64];
koyo_take 2:d48fcae8b5bd 157 char *p = msg;
koyo_take 2:d48fcae8b5bd 158 // int count;
koyo_take 2:d48fcae8b5bd 159 char *tp;
koyo_take 2:d48fcae8b5bd 160 int ret;
koyo_take 2:d48fcae8b5bd 161
koyo_take 2:d48fcae8b5bd 162 std::va_list arg;
koyo_take 2:d48fcae8b5bd 163 va_start(arg, format);
koyo_take 2:d48fcae8b5bd 164 vsnprintf(str, sizeof(str), format, arg);
koyo_take 2:d48fcae8b5bd 165 va_end(arg);
koyo_take 2:d48fcae8b5bd 166
koyo_take 3:f80f2838a956 167 p += sprintf(msg, "lorawan tx ucnf %d ", getLoraPort());
koyo_take 2:d48fcae8b5bd 168 for (unsigned int i = 0; i < strlen(str); i++) {
koyo_take 2:d48fcae8b5bd 169 p += sprintf(p, "%02x", str[i]);
koyo_take 2:d48fcae8b5bd 170 }
koyo_take 2:d48fcae8b5bd 171 sprintf(p, "\r\n");
koyo_take 2:d48fcae8b5bd 172
koyo_take 2:d48fcae8b5bd 173 flushSerial();
koyo_take 2:d48fcae8b5bd 174 serial->puts(msg);
koyo_take 2:d48fcae8b5bd 175
koyo_take 2:d48fcae8b5bd 176 getline(linebuf, sizeof(linebuf), 10000);
koyo_take 2:d48fcae8b5bd 177 // count = getline(linebuf, sizeof(linebuf), 10000);
koyo_take 2:d48fcae8b5bd 178 // this->debug("%d '%s'\r\n", count, linebuf);
koyo_take 2:d48fcae8b5bd 179
koyo_take 2:d48fcae8b5bd 180 ret = -1;
koyo_take 2:d48fcae8b5bd 181 res[0] = '\0';
koyo_take 2:d48fcae8b5bd 182 tp = strtok(linebuf, " \r\n");
koyo_take 2:d48fcae8b5bd 183 while(tp != NULL){
koyo_take 2:d48fcae8b5bd 184 // this->debug("%s\r\n", tp);
koyo_take 2:d48fcae8b5bd 185 if (strcmp(tp, "tx_ok") == 0) {
koyo_take 2:d48fcae8b5bd 186 ret = 0;
koyo_take 2:d48fcae8b5bd 187 } else if (strcmp(tp, "err") == 0) {
koyo_take 2:d48fcae8b5bd 188 ret = -2;
koyo_take 2:d48fcae8b5bd 189 } else if (strcmp(tp, "rx") == 0) {
koyo_take 2:d48fcae8b5bd 190 // this->debug("rx found\r\n");
koyo_take 2:d48fcae8b5bd 191 tp = strtok(NULL, " \r\n");
koyo_take 2:d48fcae8b5bd 192 // this->debug("%s\r\n", tp);
koyo_take 2:d48fcae8b5bd 193 tp = strtok(NULL, " \r\n");
koyo_take 2:d48fcae8b5bd 194 // this->debug("%s\r\n", tp);
koyo_take 2:d48fcae8b5bd 195 strcpy(res, tp);
koyo_take 2:d48fcae8b5bd 196 }
koyo_take 2:d48fcae8b5bd 197 tp = strtok(NULL, " \r\n");
koyo_take 2:d48fcae8b5bd 198 }
koyo_take 2:d48fcae8b5bd 199
koyo_take 2:d48fcae8b5bd 200 return ret;
koyo_take 2:d48fcae8b5bd 201 }
koyo_take 2:d48fcae8b5bd 202
koyo_take 0:c6b2a8ace823 203 int Eeabp1::sendLoRaBinary(const char *payload, size_t len)
koyo_take 0:c6b2a8ace823 204 {
koyo_take 0:c6b2a8ace823 205 char msg[64];
koyo_take 0:c6b2a8ace823 206 char *p = msg;
koyo_take 0:c6b2a8ace823 207
koyo_take 0:c6b2a8ace823 208 if (lora_msg_max_len < len)
koyo_take 0:c6b2a8ace823 209 return -1;
koyo_take 0:c6b2a8ace823 210
koyo_take 3:f80f2838a956 211 p += sprintf(msg, "lorawan tx ucnf %d ", getLoraPort());
koyo_take 0:c6b2a8ace823 212 for (unsigned int i = 0; i < len; i++) {
koyo_take 0:c6b2a8ace823 213 p += sprintf(p, "%02x", payload[i]);
koyo_take 0:c6b2a8ace823 214 }
koyo_take 0:c6b2a8ace823 215 sprintf(p, "\r\n");
koyo_take 0:c6b2a8ace823 216
koyo_take 0:c6b2a8ace823 217 flushSerial();
koyo_take 0:c6b2a8ace823 218 serial->puts(msg);
koyo_take 0:c6b2a8ace823 219
koyo_take 0:c6b2a8ace823 220 return 0;
koyo_take 0:c6b2a8ace823 221 }
koyo_take 0:c6b2a8ace823 222
koyo_take 0:c6b2a8ace823 223 void Eeabp1::setGrovePower(bool on)
koyo_take 0:c6b2a8ace823 224 {
koyo_take 0:c6b2a8ace823 225 if (on) {
koyo_take 0:c6b2a8ace823 226 if (grove_enabled)
koyo_take 0:c6b2a8ace823 227 return; /* power is already on, do nothing */
koyo_take 0:c6b2a8ace823 228
koyo_take 0:c6b2a8ace823 229 grove_power = 1;
koyo_take 0:c6b2a8ace823 230 } else {
koyo_take 0:c6b2a8ace823 231 if (!grove_enabled)
koyo_take 0:c6b2a8ace823 232 return; /* power is already off, do nothing */
koyo_take 0:c6b2a8ace823 233
koyo_take 0:c6b2a8ace823 234 // Grove端子をHiZに
koyo_take 0:c6b2a8ace823 235 grv_sel1g = 1;
koyo_take 0:c6b2a8ace823 236 grv_sel1a = 1;
koyo_take 0:c6b2a8ace823 237 grv_sel2g = 1;
koyo_take 0:c6b2a8ace823 238 grv_sel2a = 1;
koyo_take 0:c6b2a8ace823 239 grove_power = 0;
koyo_take 0:c6b2a8ace823 240 }
koyo_take 0:c6b2a8ace823 241 }
koyo_take 0:c6b2a8ace823 242
koyo_take 0:c6b2a8ace823 243 int Eeabp1::setGrovePortType(EeabGrovePort port, EeabGrovePortType type)
koyo_take 0:c6b2a8ace823 244 {
koyo_take 0:c6b2a8ace823 245 switch (port) {
koyo_take 0:c6b2a8ace823 246 case GROVE_CH1:
koyo_take 0:c6b2a8ace823 247 if (type == GROVE_ANALOG) {
koyo_take 0:c6b2a8ace823 248 grv_sel1g = 1;
koyo_take 0:c6b2a8ace823 249 grv_sel1a = 0;
koyo_take 0:c6b2a8ace823 250 } else {
koyo_take 0:c6b2a8ace823 251 grv_sel1g = 0;
koyo_take 0:c6b2a8ace823 252 grv_sel1a = 1;
koyo_take 0:c6b2a8ace823 253 }
koyo_take 0:c6b2a8ace823 254 break;
koyo_take 0:c6b2a8ace823 255 case GROVE_CH2:
koyo_take 0:c6b2a8ace823 256 if (type == GROVE_ANALOG) {
koyo_take 0:c6b2a8ace823 257 grv_sel2g = 1;
koyo_take 0:c6b2a8ace823 258 grv_sel2a = 0;
koyo_take 0:c6b2a8ace823 259 } else {
koyo_take 0:c6b2a8ace823 260 grv_sel2g = 0;
koyo_take 0:c6b2a8ace823 261 grv_sel2a = 1;
koyo_take 0:c6b2a8ace823 262 }
koyo_take 0:c6b2a8ace823 263 break;
koyo_take 0:c6b2a8ace823 264 default:
koyo_take 0:c6b2a8ace823 265 /* do nothing */
koyo_take 0:c6b2a8ace823 266 break;
koyo_take 0:c6b2a8ace823 267 }
koyo_take 0:c6b2a8ace823 268
koyo_take 0:c6b2a8ace823 269 return 0;
koyo_take 0:c6b2a8ace823 270 }
koyo_take 0:c6b2a8ace823 271
koyo_take 0:c6b2a8ace823 272 int Eeabp1::setGroveDioDirection(EeabGrovePort port, EeabGroveDioDirection dir, Callback<void()> f)
koyo_take 0:c6b2a8ace823 273 {
koyo_take 0:c6b2a8ace823 274 switch (port) {
koyo_take 0:c6b2a8ace823 275 case GROVE_CH1:
koyo_take 0:c6b2a8ace823 276 if(dir == GROVE_DIO_OUT) {
koyo_take 0:c6b2a8ace823 277 if (grv_p1s1di) {
koyo_take 0:c6b2a8ace823 278 delete grv_p1s1di;
koyo_take 0:c6b2a8ace823 279 grv_p1s1di = NULL;
koyo_take 0:c6b2a8ace823 280 }
koyo_take 0:c6b2a8ace823 281 grv_p1s1do = new DigitalOut(P0_13);
koyo_take 0:c6b2a8ace823 282
koyo_take 0:c6b2a8ace823 283 if (grv_p1s2di) {
koyo_take 0:c6b2a8ace823 284 delete grv_p1s2di;
koyo_take 0:c6b2a8ace823 285 grv_p1s2di = NULL;
koyo_take 0:c6b2a8ace823 286 }
koyo_take 0:c6b2a8ace823 287 grv_p1s2do = new DigitalOut(P0_12);
koyo_take 0:c6b2a8ace823 288 } else { /* GROVE_DIO_IN */
koyo_take 0:c6b2a8ace823 289 if (grv_p1s1do) {
koyo_take 0:c6b2a8ace823 290 delete grv_p1s1do;
koyo_take 0:c6b2a8ace823 291 grv_p1s1do = NULL;
koyo_take 0:c6b2a8ace823 292 }
koyo_take 0:c6b2a8ace823 293 grv_p1s1di = new InterruptIn(P0_13);
koyo_take 0:c6b2a8ace823 294 if (f)
koyo_take 0:c6b2a8ace823 295 grv_p1s1di->rise(f);
koyo_take 0:c6b2a8ace823 296
koyo_take 0:c6b2a8ace823 297 if (grv_p1s2do) {
koyo_take 0:c6b2a8ace823 298 delete grv_p1s2do;
koyo_take 0:c6b2a8ace823 299 grv_p1s2do = NULL;
koyo_take 0:c6b2a8ace823 300 }
koyo_take 0:c6b2a8ace823 301 grv_p1s2di = new InterruptIn(P0_12);
koyo_take 0:c6b2a8ace823 302 grv_p1s2di->rise(f);
koyo_take 0:c6b2a8ace823 303 }
koyo_take 0:c6b2a8ace823 304 break;
koyo_take 0:c6b2a8ace823 305 case GROVE_CH2:
koyo_take 0:c6b2a8ace823 306 if(dir == GROVE_DIO_OUT) {
koyo_take 0:c6b2a8ace823 307 if (grv_p2s1di) {
koyo_take 0:c6b2a8ace823 308 delete grv_p2s1di;
koyo_take 0:c6b2a8ace823 309 grv_p2s1di = NULL;
koyo_take 0:c6b2a8ace823 310 }
koyo_take 0:c6b2a8ace823 311 grv_p2s1do = new DigitalOut(P0_15);
koyo_take 0:c6b2a8ace823 312
koyo_take 0:c6b2a8ace823 313 if (grv_p2s2di) {
koyo_take 0:c6b2a8ace823 314 delete grv_p2s2di;
koyo_take 0:c6b2a8ace823 315 grv_p2s2di = NULL;
koyo_take 0:c6b2a8ace823 316 }
koyo_take 0:c6b2a8ace823 317 grv_p2s2do = new DigitalOut(P0_14);
koyo_take 0:c6b2a8ace823 318 } else { /* GROVE_DIO_IN */
koyo_take 0:c6b2a8ace823 319 if (grv_p2s1do) {
koyo_take 0:c6b2a8ace823 320 delete grv_p2s1do;
koyo_take 0:c6b2a8ace823 321 grv_p2s1do = NULL;
koyo_take 0:c6b2a8ace823 322 }
koyo_take 0:c6b2a8ace823 323 grv_p2s1di = new InterruptIn(P0_15);
koyo_take 0:c6b2a8ace823 324 if (f)
koyo_take 0:c6b2a8ace823 325 grv_p2s1di->rise(f);
koyo_take 0:c6b2a8ace823 326
koyo_take 0:c6b2a8ace823 327 if (grv_p2s2do) {
koyo_take 0:c6b2a8ace823 328 delete grv_p2s2do;
koyo_take 0:c6b2a8ace823 329 grv_p2s2do = NULL;
koyo_take 0:c6b2a8ace823 330 }
koyo_take 0:c6b2a8ace823 331 grv_p2s2di = new InterruptIn(P0_14);
koyo_take 0:c6b2a8ace823 332 grv_p2s2di->rise(f);
koyo_take 0:c6b2a8ace823 333 }
koyo_take 0:c6b2a8ace823 334 break;
koyo_take 0:c6b2a8ace823 335 default:
koyo_take 0:c6b2a8ace823 336 /* do nothing */
koyo_take 0:c6b2a8ace823 337 break;
koyo_take 0:c6b2a8ace823 338 }
koyo_take 0:c6b2a8ace823 339
koyo_take 0:c6b2a8ace823 340 return 0;
koyo_take 0:c6b2a8ace823 341 }
koyo_take 0:c6b2a8ace823 342
koyo_take 0:c6b2a8ace823 343 int Eeabp1::setGroveDio(EeabGrovePort port, EeabGroveDio val)
koyo_take 0:c6b2a8ace823 344 {
koyo_take 0:c6b2a8ace823 345 switch (port) {
koyo_take 0:c6b2a8ace823 346 case GROVE_CH1:
koyo_take 0:c6b2a8ace823 347 *grv_p1s1do = val;
koyo_take 0:c6b2a8ace823 348 *grv_p1s2do = val;
koyo_take 0:c6b2a8ace823 349 break;
koyo_take 0:c6b2a8ace823 350 case GROVE_CH2:
koyo_take 0:c6b2a8ace823 351 *grv_p2s1do = val;
koyo_take 0:c6b2a8ace823 352 *grv_p2s2do = val;
koyo_take 0:c6b2a8ace823 353 break;
koyo_take 0:c6b2a8ace823 354 default:
koyo_take 0:c6b2a8ace823 355 break;
koyo_take 0:c6b2a8ace823 356 }
koyo_take 0:c6b2a8ace823 357
koyo_take 0:c6b2a8ace823 358 return 0;
koyo_take 0:c6b2a8ace823 359 }
koyo_take 0:c6b2a8ace823 360
koyo_take 0:c6b2a8ace823 361 int Eeabp1::setGroveDio(EeabGrovePort port, EeabGroveSig sig , EeabGroveDio val)
koyo_take 0:c6b2a8ace823 362 {
koyo_take 0:c6b2a8ace823 363 switch (port) {
koyo_take 0:c6b2a8ace823 364 case GROVE_CH1:
koyo_take 0:c6b2a8ace823 365 (sig == GROVE_SIG1) ? *grv_p1s1do = val : *grv_p1s2do = val;
koyo_take 0:c6b2a8ace823 366 break;
koyo_take 0:c6b2a8ace823 367 case GROVE_CH2:
koyo_take 0:c6b2a8ace823 368 (sig == GROVE_SIG1) ? *grv_p2s1do = val : *grv_p2s2do = val;
koyo_take 0:c6b2a8ace823 369 break;
koyo_take 0:c6b2a8ace823 370 default:
koyo_take 0:c6b2a8ace823 371 break;
koyo_take 0:c6b2a8ace823 372 }
koyo_take 0:c6b2a8ace823 373 return 0;
koyo_take 0:c6b2a8ace823 374 }
koyo_take 0:c6b2a8ace823 375
koyo_take 0:c6b2a8ace823 376
koyo_take 0:c6b2a8ace823 377 int Eeabp1::getGroveDio(EeabGrovePort port, EeabGroveSig sig)
koyo_take 0:c6b2a8ace823 378 {
koyo_take 0:c6b2a8ace823 379 switch (port) {
koyo_take 0:c6b2a8ace823 380 case GROVE_CH1:
koyo_take 0:c6b2a8ace823 381 if (grv_p1s1di == NULL)
koyo_take 0:c6b2a8ace823 382 return -1;
koyo_take 0:c6b2a8ace823 383 return (sig == GROVE_SIG1) ?
koyo_take 0:c6b2a8ace823 384 grv_p1s1di->read() : grv_p1s2di->read();
koyo_take 0:c6b2a8ace823 385 case GROVE_CH2:
koyo_take 0:c6b2a8ace823 386 if (grv_p2s1di == NULL)
koyo_take 0:c6b2a8ace823 387 return -1;
koyo_take 0:c6b2a8ace823 388 return (sig == GROVE_SIG1) ?
koyo_take 0:c6b2a8ace823 389 grv_p2s1di->read() : grv_p2s2di->read();
koyo_take 0:c6b2a8ace823 390 default:
koyo_take 0:c6b2a8ace823 391 break;
koyo_take 0:c6b2a8ace823 392 }
koyo_take 0:c6b2a8ace823 393
koyo_take 0:c6b2a8ace823 394 return -1;
koyo_take 0:c6b2a8ace823 395 }
koyo_take 0:c6b2a8ace823 396
koyo_take 0:c6b2a8ace823 397 float Eeabp1::getGroveAnalog(EeabGrovePort port, EeabGroveSig sig)
koyo_take 0:c6b2a8ace823 398 {
koyo_take 0:c6b2a8ace823 399 switch (port) {
koyo_take 0:c6b2a8ace823 400 case GROVE_CH1:
koyo_take 0:c6b2a8ace823 401 return (sig == GROVE_SIG1) ?
koyo_take 0:c6b2a8ace823 402 grv_p1s1a.read() : grv_p1s2a.read();
koyo_take 0:c6b2a8ace823 403 case GROVE_CH2:
koyo_take 0:c6b2a8ace823 404 return (sig == GROVE_SIG1) ?
koyo_take 0:c6b2a8ace823 405 grv_p2s1a.read() : grv_p2s2a.read();
koyo_take 0:c6b2a8ace823 406 default:
koyo_take 0:c6b2a8ace823 407 break;
koyo_take 0:c6b2a8ace823 408 }
koyo_take 0:c6b2a8ace823 409
koyo_take 0:c6b2a8ace823 410 return -1;
koyo_take 0:c6b2a8ace823 411 }
koyo_take 0:c6b2a8ace823 412
koyo_take 0:c6b2a8ace823 413 int Eeabp1::enableTempHumidSensor(void)
koyo_take 0:c6b2a8ace823 414 {
koyo_take 0:c6b2a8ace823 415 temp_humid_sensor = new Sht31(P0_30, P0_7);
koyo_take 0:c6b2a8ace823 416 return 0;
koyo_take 0:c6b2a8ace823 417 }
koyo_take 0:c6b2a8ace823 418
koyo_take 0:c6b2a8ace823 419 float Eeabp1::getTemp(void)
koyo_take 0:c6b2a8ace823 420 {
koyo_take 0:c6b2a8ace823 421 if (!temp_humid_sensor)
koyo_take 0:c6b2a8ace823 422 return -1;
koyo_take 0:c6b2a8ace823 423
koyo_take 0:c6b2a8ace823 424 return temp_humid_sensor->readTemperature();
koyo_take 0:c6b2a8ace823 425 }
koyo_take 0:c6b2a8ace823 426
koyo_take 0:c6b2a8ace823 427 float Eeabp1::getHumid(void)
koyo_take 0:c6b2a8ace823 428 {
koyo_take 0:c6b2a8ace823 429 if (!temp_humid_sensor)
koyo_take 0:c6b2a8ace823 430 return -1;
koyo_take 0:c6b2a8ace823 431
koyo_take 0:c6b2a8ace823 432 return temp_humid_sensor->readHumidity();
koyo_take 0:c6b2a8ace823 433 }
koyo_take 0:c6b2a8ace823 434
koyo_take 0:c6b2a8ace823 435 int Eeabp1::enableAccelerometer(void)
koyo_take 0:c6b2a8ace823 436 {
koyo_take 0:c6b2a8ace823 437 accelerometer = new ADXL345_I2C(P0_30, P0_7);
koyo_take 0:c6b2a8ace823 438
koyo_take 0:c6b2a8ace823 439 this->debug("Device ID is: 0x%02x\n", accelerometer->getDeviceID());
koyo_take 0:c6b2a8ace823 440 wait(.001);
koyo_take 0:c6b2a8ace823 441
koyo_take 0:c6b2a8ace823 442 // These are here to test whether any of the initialization fails. It will print the failure
koyo_take 0:c6b2a8ace823 443 if (accelerometer->setPowerControl(0x00)) {
koyo_take 0:c6b2a8ace823 444 this->debug("didn't intitialize power control\n");
koyo_take 0:c6b2a8ace823 445 return -1;
koyo_take 0:c6b2a8ace823 446 }
koyo_take 0:c6b2a8ace823 447 wait(.001);
koyo_take 0:c6b2a8ace823 448
koyo_take 0:c6b2a8ace823 449 //Full resolution, +/-16g, 4mg/LSB.
koyo_take 0:c6b2a8ace823 450 if(accelerometer->setDataFormatControl(0x0B)) {
koyo_take 0:c6b2a8ace823 451 this->debug("didn't set data format\n");
koyo_take 0:c6b2a8ace823 452 return -1;
koyo_take 0:c6b2a8ace823 453 }
koyo_take 0:c6b2a8ace823 454 wait(.001);
koyo_take 0:c6b2a8ace823 455
koyo_take 0:c6b2a8ace823 456 //3.2kHz data rate.
koyo_take 0:c6b2a8ace823 457 if(accelerometer->setDataRate(ADXL345_3200HZ)) {
koyo_take 0:c6b2a8ace823 458 this->debug("didn't set data rate\n");
koyo_take 0:c6b2a8ace823 459 return -1;
koyo_take 0:c6b2a8ace823 460 }
koyo_take 0:c6b2a8ace823 461 wait(.001);
koyo_take 0:c6b2a8ace823 462
koyo_take 0:c6b2a8ace823 463 //Measurement mode.
koyo_take 0:c6b2a8ace823 464 if(accelerometer->setPowerControl(MeasurementMode)) {
koyo_take 0:c6b2a8ace823 465 this->debug("didn't set the power control to measurement\n");
koyo_take 0:c6b2a8ace823 466 return -1;
koyo_take 0:c6b2a8ace823 467 }
koyo_take 0:c6b2a8ace823 468
koyo_take 0:c6b2a8ace823 469 return 0;
koyo_take 0:c6b2a8ace823 470 }
koyo_take 0:c6b2a8ace823 471
koyo_take 0:c6b2a8ace823 472 int Eeabp1::getAcc(int *x, int *y, int *z)
koyo_take 0:c6b2a8ace823 473 {
koyo_take 0:c6b2a8ace823 474 int readings[3] = {0, 0, 0};
koyo_take 0:c6b2a8ace823 475 accelerometer->getOutput(readings);
koyo_take 0:c6b2a8ace823 476 *x = readings[0];
koyo_take 0:c6b2a8ace823 477 *y = readings[1];
koyo_take 0:c6b2a8ace823 478 *z = readings[2];
koyo_take 0:c6b2a8ace823 479
koyo_take 0:c6b2a8ace823 480 return 0;
koyo_take 0:c6b2a8ace823 481 }
koyo_take 0:c6b2a8ace823 482
koyo_take 0:c6b2a8ace823 483 /* private functions */
koyo_take 0:c6b2a8ace823 484 void Eeabp1::flushSerial()
koyo_take 0:c6b2a8ace823 485 {
koyo_take 0:c6b2a8ace823 486 while(serial->readable() == true) {
koyo_take 0:c6b2a8ace823 487 serial->getc();
koyo_take 0:c6b2a8ace823 488 wait_us(1000);
koyo_take 0:c6b2a8ace823 489 }
koyo_take 0:c6b2a8ace823 490 }
koyo_take 0:c6b2a8ace823 491
koyo_take 2:d48fcae8b5bd 492 inline ssize_t Eeabp1::getline(char *buf, size_t bufsize, int timeout_ms)
koyo_take 2:d48fcae8b5bd 493 {
koyo_take 2:d48fcae8b5bd 494 char c;
koyo_take 2:d48fcae8b5bd 495 size_t receivedChars = 0;
koyo_take 2:d48fcae8b5bd 496 Timer t;
koyo_take 2:d48fcae8b5bd 497
koyo_take 2:d48fcae8b5bd 498 t.start();
koyo_take 2:d48fcae8b5bd 499
koyo_take 2:d48fcae8b5bd 500 *buf = '\0';
koyo_take 2:d48fcae8b5bd 501 do {
koyo_take 2:d48fcae8b5bd 502 if (!serial->readable()) {
koyo_take 2:d48fcae8b5bd 503 wait_us(50);
koyo_take 2:d48fcae8b5bd 504 continue;
koyo_take 2:d48fcae8b5bd 505 }
koyo_take 2:d48fcae8b5bd 506
koyo_take 2:d48fcae8b5bd 507 c = serial->getc();
koyo_take 2:d48fcae8b5bd 508 /*
koyo_take 2:d48fcae8b5bd 509 if (c == '\r' || c == '\n') {
koyo_take 2:d48fcae8b5bd 510 if (receivedChars == 0) {
koyo_take 2:d48fcae8b5bd 511 continue; //Ignore if first character is delimiter
koyo_take 2:d48fcae8b5bd 512 }
koyo_take 2:d48fcae8b5bd 513 if (serial->readable()) {
koyo_take 2:d48fcae8b5bd 514 continue; //continue to read next line
koyo_take 2:d48fcae8b5bd 515 }
koyo_take 2:d48fcae8b5bd 516 break;
koyo_take 2:d48fcae8b5bd 517 }
koyo_take 2:d48fcae8b5bd 518 */
koyo_take 2:d48fcae8b5bd 519 if (receivedChars < bufsize - 1)
koyo_take 2:d48fcae8b5bd 520 {
koyo_take 2:d48fcae8b5bd 521 *buf++ = c;
koyo_take 2:d48fcae8b5bd 522 receivedChars++;
koyo_take 2:d48fcae8b5bd 523 }
koyo_take 2:d48fcae8b5bd 524 } while(t.read_ms() < timeout_ms);
koyo_take 2:d48fcae8b5bd 525 *buf++ = '\0';
koyo_take 2:d48fcae8b5bd 526
koyo_take 2:d48fcae8b5bd 527 t.stop();
koyo_take 2:d48fcae8b5bd 528
koyo_take 2:d48fcae8b5bd 529 return receivedChars;
koyo_take 2:d48fcae8b5bd 530 }
koyo_take 2:d48fcae8b5bd 531
koyo_take 2:d48fcae8b5bd 532 int Eeabp1::chkSerialChar(const char ch, uint16_t timeout_ms)
koyo_take 0:c6b2a8ace823 533 {
koyo_take 0:c6b2a8ace823 534 uint32_t timeoutCount = 0;
koyo_take 0:c6b2a8ace823 535
koyo_take 0:c6b2a8ace823 536 while(serial->readable() == false) {
koyo_take 0:c6b2a8ace823 537 wait_us(50);
koyo_take 0:c6b2a8ace823 538 timeoutCount++;
koyo_take 0:c6b2a8ace823 539 if((timeoutCount / 20) >= timeout_ms)
koyo_take 0:c6b2a8ace823 540 return -2;
koyo_take 0:c6b2a8ace823 541 }
koyo_take 0:c6b2a8ace823 542
koyo_take 0:c6b2a8ace823 543 return (serial->getc() == ch) ? 0 : -1;
koyo_take 0:c6b2a8ace823 544 }
koyo_take 0:c6b2a8ace823 545
koyo_take 0:c6b2a8ace823 546 int Eeabp1::waitSerialChar(const char ch,uint16_t timeout_ms)
koyo_take 0:c6b2a8ace823 547 {
koyo_take 0:c6b2a8ace823 548 uint32_t timeoutCount = 0;
koyo_take 0:c6b2a8ace823 549
koyo_take 0:c6b2a8ace823 550 do {
koyo_take 0:c6b2a8ace823 551 while(serial->readable() == false) {
koyo_take 0:c6b2a8ace823 552 wait_us(50);
koyo_take 0:c6b2a8ace823 553 timeoutCount++;
koyo_take 0:c6b2a8ace823 554 if((timeoutCount / 20) >= timeout_ms)
koyo_take 0:c6b2a8ace823 555 return -2;
koyo_take 0:c6b2a8ace823 556 }
koyo_take 0:c6b2a8ace823 557 } while(serial->getc() != ch);
koyo_take 0:c6b2a8ace823 558
koyo_take 0:c6b2a8ace823 559 return 0;
koyo_take 0:c6b2a8ace823 560 }
koyo_take 0:c6b2a8ace823 561
koyo_take 0:c6b2a8ace823 562 int Eeabp1::chkSerialCharOk()
koyo_take 0:c6b2a8ace823 563 {
koyo_take 0:c6b2a8ace823 564 int ret;
koyo_take 0:c6b2a8ace823 565 ret = waitSerialChar('>',4000);
koyo_take 0:c6b2a8ace823 566 if (ret != 0)
koyo_take 0:c6b2a8ace823 567 return __LINE__;
koyo_take 0:c6b2a8ace823 568
koyo_take 0:c6b2a8ace823 569 ret = chkSerialChar('>',2000);
koyo_take 0:c6b2a8ace823 570 if (ret != 0)
koyo_take 0:c6b2a8ace823 571 return __LINE__;
koyo_take 0:c6b2a8ace823 572
koyo_take 0:c6b2a8ace823 573 ret = chkSerialChar(' ',2000);
koyo_take 0:c6b2a8ace823 574 if (ret != 0)
koyo_take 0:c6b2a8ace823 575 return __LINE__;
koyo_take 0:c6b2a8ace823 576
koyo_take 0:c6b2a8ace823 577 ret = chkSerialChar('O',2000);
koyo_take 0:c6b2a8ace823 578 if (ret != 0)
koyo_take 0:c6b2a8ace823 579 return __LINE__;
koyo_take 0:c6b2a8ace823 580
koyo_take 0:c6b2a8ace823 581 ret = chkSerialChar('k',2000);
koyo_take 0:c6b2a8ace823 582 if (ret != 0)
koyo_take 0:c6b2a8ace823 583 return __LINE__;
koyo_take 0:c6b2a8ace823 584
koyo_take 0:c6b2a8ace823 585 ret = waitSerialChar('>',4000);
koyo_take 0:c6b2a8ace823 586 if (ret != 0)
koyo_take 0:c6b2a8ace823 587 return __LINE__;
koyo_take 0:c6b2a8ace823 588
koyo_take 0:c6b2a8ace823 589 wait_us(1000);
koyo_take 0:c6b2a8ace823 590
koyo_take 0:c6b2a8ace823 591 return 0;
koyo_take 0:c6b2a8ace823 592 }
koyo_take 0:c6b2a8ace823 593
koyo_take 0:c6b2a8ace823 594 int Eeabp1::chkSerialCharRes(char chkchr)
koyo_take 0:c6b2a8ace823 595 {
koyo_take 0:c6b2a8ace823 596 int ret;
koyo_take 0:c6b2a8ace823 597 ret = waitSerialChar('>', 10000);
koyo_take 0:c6b2a8ace823 598 if (ret != 0)
koyo_take 0:c6b2a8ace823 599 return __LINE__;
koyo_take 0:c6b2a8ace823 600
koyo_take 0:c6b2a8ace823 601 ret = chkSerialChar('>',2000);
koyo_take 0:c6b2a8ace823 602 if (ret != 0)
koyo_take 0:c6b2a8ace823 603 return __LINE__;
koyo_take 0:c6b2a8ace823 604
koyo_take 0:c6b2a8ace823 605 ret = chkSerialChar(' ',2000);
koyo_take 0:c6b2a8ace823 606 if (ret != 0)
koyo_take 0:c6b2a8ace823 607 return __LINE__;
koyo_take 0:c6b2a8ace823 608
koyo_take 0:c6b2a8ace823 609 ret = chkSerialChar('O',2000);
koyo_take 0:c6b2a8ace823 610 if (ret != 0)
koyo_take 0:c6b2a8ace823 611 return __LINE__;
koyo_take 0:c6b2a8ace823 612
koyo_take 0:c6b2a8ace823 613 ret = chkSerialChar('k',2000);
koyo_take 0:c6b2a8ace823 614 if (ret != 0)
koyo_take 0:c6b2a8ace823 615 return __LINE__;
koyo_take 0:c6b2a8ace823 616
koyo_take 0:c6b2a8ace823 617 ret = waitSerialChar('>',16000);
koyo_take 0:c6b2a8ace823 618 if (ret != 0)
koyo_take 0:c6b2a8ace823 619 return __LINE__;
koyo_take 0:c6b2a8ace823 620
koyo_take 0:c6b2a8ace823 621 ret = chkSerialChar('>',2000);
koyo_take 0:c6b2a8ace823 622 if (ret != 0)
koyo_take 0:c6b2a8ace823 623 return __LINE__;
koyo_take 0:c6b2a8ace823 624
koyo_take 0:c6b2a8ace823 625 ret = chkSerialChar(' ',2000);
koyo_take 0:c6b2a8ace823 626 if (ret != 0)
koyo_take 0:c6b2a8ace823 627 return __LINE__;
koyo_take 0:c6b2a8ace823 628
koyo_take 0:c6b2a8ace823 629 ret = waitSerialChar(chkchr,4000);
koyo_take 0:c6b2a8ace823 630 if (ret != 0)
koyo_take 0:c6b2a8ace823 631 return __LINE__;
koyo_take 0:c6b2a8ace823 632
koyo_take 0:c6b2a8ace823 633 ret = waitSerialChar('>',4000);
koyo_take 0:c6b2a8ace823 634 if (ret != 0)
koyo_take 0:c6b2a8ace823 635 return __LINE__;
koyo_take 0:c6b2a8ace823 636
koyo_take 0:c6b2a8ace823 637 wait_us(1000);
koyo_take 0:c6b2a8ace823 638
koyo_take 0:c6b2a8ace823 639 return 0;
koyo_take 0:c6b2a8ace823 640 }