library for enebular edge agent board(version p1)

Dependents:   ina-hack-2nd

Committer:
koyo_take
Date:
Sat Oct 21 07:26:52 2017 +0000
Revision:
1:da9fd2252ed5
Parent:
0:c6b2a8ace823
Child:
2:d48fcae8b5bd
retry lora join process

Who changed what in which revision?

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