Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: ADXL345_I2C MMA8652FC Sht31 TinyGPS mbed Chainable_RGB_LED
Fork of ina-hack-test by
Eeabp1.cpp
00001 #include "Eeabp1.h" 00002 //#include "rtos.h" 00003 00004 //Thread thread; 00005 static const int lora_msg_max_len = 11; 00006 00007 Eeabp1::Eeabp1() : pwr_en(P0_0), led(P0_23), 00008 lora_power(P0_5), lora_reset(P0_22), grove_power(P0_6), 00009 grv_sel2a(P0_19), grv_sel2g(P0_18), grv_sel1a(P0_17), grv_sel1g(P0_16), 00010 grv_p1s1a(P0_2), grv_p1s2a(P0_1), 00011 grv_p2s1a(P0_4), grv_p2s2a(P0_3) 00012 { 00013 this->led_state = LED_OFF; 00014 this->led = 0; 00015 this->serial = new RawSerial(P0_9, P0_11); 00016 this->serial->baud(9600); /* use for LoRa */ 00017 this->pwr_en = 1; // メイン電源投入 00018 this->lora_power = 0; 00019 this->lora_reset = 0; 00020 this->grove_power = 0; 00021 this->lora_enabled = false; 00022 this->grove_enabled = false; 00023 // Grove端子をHiZに 00024 this->grv_sel1g = 1; 00025 this->grv_sel1a = 1; 00026 this->grv_sel2g = 1; 00027 this->grv_sel2a = 1; 00028 grv_p1s1do = NULL, grv_p1s2do = NULL, grv_p1s1di = NULL, grv_p1s2di = NULL; 00029 grv_p2s1do = NULL, grv_p2s2do = NULL, grv_p2s1di = NULL, grv_p2s2di = NULL; 00030 temp_humid_sensor = NULL; 00031 } 00032 00033 int Eeabp1::setLedState(EeabLedState state) 00034 { 00035 this->led_state = state; 00036 00037 if (this->led_state == LED_OFF) { 00038 this->led = 0; 00039 } else { 00040 this->led = 1; 00041 } 00042 00043 return 0; 00044 } 00045 00046 void Eeabp1::loop(void) 00047 { 00048 switch (this->led_state) { 00049 case LED_OFF: 00050 /* fall through */ 00051 case LED_ON: 00052 break; 00053 case LED_BLINK_FAST: 00054 case LED_BLINK_MID: 00055 case LED_BLINK_SLOW: 00056 this->led = !this->led; 00057 break; 00058 } 00059 } 00060 00061 int Eeabp1::debug(const char * format, ...) 00062 { 00063 char tmp[80]; 00064 int ret; 00065 00066 std::va_list arg; 00067 va_start(arg, format); 00068 vsnprintf(tmp, sizeof(tmp), format, arg); 00069 va_end(arg); 00070 00071 delete this->serial; 00072 this->serial = new RawSerial(P0_8, P0_10); 00073 ret = this->serial->puts(tmp); 00074 delete this->serial; 00075 this->serial = new RawSerial(P0_9, P0_11); 00076 00077 return ret; 00078 } 00079 00080 int Eeabp1::setLoRaPower(bool on) 00081 { 00082 int ret; 00083 00084 if (on) { 00085 if (lora_enabled) 00086 return 0; /* power is already on, do nothing */ 00087 00088 this->lora_power= 1; 00089 this->lora_reset = 1; 00090 wait_us(500000); 00091 serial->printf("mod set_echo off\r\n"); // ローカルエコー:無効 00092 wait(1); 00093 flushSerial(); 00094 serial->printf("mod factory_reset\r\n"); // ファクトリーリセットを行い鍵をリフレッシュ 00095 ret = chkSerialCharOk(); 00096 if (ret != 0) 00097 return ret; 00098 serial->printf("mod set_echo off\r\n"); // ローカルエコー:無効 00099 wait(1); 00100 serial->printf("lorawan join otaa\r\n"); // Gatewayに接続(OTAA) 00101 ret = chkSerialCharRes('a'); // 成功 ">> accepted" 失敗 ">> unsuccess" 00102 if (ret != 0) 00103 return ret; 00104 serial->printf("lorawan set_dr 2\r\n"); // データレートの設定(11byte) 00105 ret = chkSerialCharOk(); 00106 if (ret != 0) 00107 return ret; 00108 00109 this->lora_enabled = true; 00110 } else { /* off */ 00111 if (!lora_enabled) 00112 return 0; /* power is already off, do nothing */ 00113 00114 lora_power= 0; 00115 lora_enabled = false; 00116 } 00117 00118 return 0; 00119 } 00120 00121 int Eeabp1::sendLoRaString(const char * format, ...) 00122 { 00123 char str[lora_msg_max_len+1] = {0x00, }; 00124 char msg[64]; 00125 char *p = msg; 00126 00127 std::va_list arg; 00128 va_start(arg, format); 00129 vsnprintf(str, sizeof(str), format, arg); 00130 va_end(arg); 00131 00132 p += sprintf(msg, "lorawan tx ucnf 16 "); 00133 for (unsigned int i = 0; i < strlen(str); i++) { 00134 p += sprintf(p, "%02x", str[i]); 00135 } 00136 sprintf(p, "\r\n"); 00137 00138 flushSerial(); 00139 serial->puts(msg); 00140 00141 return 0; 00142 } 00143 00144 void Eeabp1::setGrovePower(bool on) 00145 { 00146 if (on) { 00147 if (grove_enabled) 00148 return; /* power is already on, do nothing */ 00149 00150 grove_power = 1; 00151 } else { 00152 if (!grove_enabled) 00153 return; /* power is already off, do nothing */ 00154 00155 // Grove端子をHiZに 00156 grv_sel1g = 1; 00157 grv_sel1a = 1; 00158 grv_sel2g = 1; 00159 grv_sel2a = 1; 00160 grove_power = 0; 00161 } 00162 } 00163 00164 int Eeabp1::setGrovePortType(EeabGrovePort port, EeabGrovePortType type) 00165 { 00166 switch (port) { 00167 case GROVE_CH1: 00168 if (type == GROVE_ANALOG) { 00169 grv_sel1g = 1; 00170 grv_sel1a = 0; 00171 } else { 00172 grv_sel1g = 0; 00173 grv_sel1a = 1; 00174 } 00175 break; 00176 case GROVE_CH2: 00177 if (type == GROVE_ANALOG) { 00178 grv_sel2g = 1; 00179 grv_sel2a = 0; 00180 } else { 00181 grv_sel2g = 0; 00182 grv_sel2a = 1; 00183 } 00184 break; 00185 default: 00186 /* do nothing */ 00187 break; 00188 } 00189 00190 return 0; 00191 } 00192 00193 int Eeabp1::setGroveDioDirection(EeabGrovePort port, EeabGroveDioDirection dir, Callback<void()> f) 00194 { 00195 switch (port) { 00196 case GROVE_CH1: 00197 if(dir == GROVE_DIO_OUT) { 00198 if (grv_p1s1di) { 00199 delete grv_p1s1di; 00200 grv_p1s1di = NULL; 00201 } 00202 grv_p1s1do = new DigitalOut(P0_13); 00203 00204 if (grv_p1s2di) { 00205 delete grv_p1s2di; 00206 grv_p1s2di = NULL; 00207 } 00208 grv_p1s2do = new DigitalOut(P0_12); 00209 } else { /* GROVE_DIO_IN */ 00210 if (grv_p1s1do) { 00211 delete grv_p1s1do; 00212 grv_p1s1do = NULL; 00213 } 00214 grv_p1s1di = new InterruptIn(P0_13); 00215 if (f) 00216 grv_p1s1di->rise(f); 00217 00218 if (grv_p1s2do) { 00219 delete grv_p1s2do; 00220 grv_p1s2do = NULL; 00221 } 00222 grv_p1s2di = new InterruptIn(P0_12); 00223 grv_p1s2di->rise(f); 00224 } 00225 break; 00226 case GROVE_CH2: 00227 if(dir == GROVE_DIO_OUT) { 00228 if (grv_p2s1di) { 00229 delete grv_p2s1di; 00230 grv_p2s1di = NULL; 00231 } 00232 grv_p2s1do = new DigitalOut(P0_15); 00233 00234 if (grv_p2s2di) { 00235 delete grv_p2s2di; 00236 grv_p2s2di = NULL; 00237 } 00238 grv_p2s2do = new DigitalOut(P0_14); 00239 } else { /* GROVE_DIO_IN */ 00240 if (grv_p2s1do) { 00241 delete grv_p2s1do; 00242 grv_p2s1do = NULL; 00243 } 00244 grv_p2s1di = new InterruptIn(P0_15); 00245 if (f) 00246 grv_p2s1di->rise(f); 00247 00248 if (grv_p2s2do) { 00249 delete grv_p2s2do; 00250 grv_p2s2do = NULL; 00251 } 00252 grv_p2s2di = new InterruptIn(P0_14); 00253 grv_p2s2di->rise(f); 00254 } 00255 break; 00256 default: 00257 /* do nothing */ 00258 break; 00259 } 00260 00261 return 0; 00262 } 00263 00264 int Eeabp1::setGroveDio(EeabGrovePort port, EeabGroveDio val) 00265 { 00266 switch (port) { 00267 case GROVE_CH1: 00268 *grv_p1s1do = val; 00269 *grv_p1s2do = val; 00270 break; 00271 case GROVE_CH2: 00272 *grv_p2s1do = val; 00273 *grv_p2s2do = val; 00274 break; 00275 default: 00276 break; 00277 } 00278 00279 return 0; 00280 } 00281 00282 int Eeabp1::setGroveDio(EeabGrovePort port, EeabGroveSig sig , EeabGroveDio val) 00283 { 00284 switch (port) { 00285 case GROVE_CH1: 00286 (sig == GROVE_SIG1) ? *grv_p1s1do = val : *grv_p1s2do = val; 00287 break; 00288 case GROVE_CH2: 00289 (sig == GROVE_SIG1) ? *grv_p2s1do = val : *grv_p2s2do = val; 00290 break; 00291 default: 00292 break; 00293 } 00294 return 0; 00295 } 00296 00297 00298 int Eeabp1::getGroveDio(EeabGrovePort port, EeabGroveSig sig) 00299 { 00300 switch (port) { 00301 case GROVE_CH1: 00302 if (grv_p1s1di == NULL) 00303 return -1; 00304 return (sig == GROVE_SIG1) ? 00305 grv_p1s1di->read() : grv_p1s2di->read(); 00306 case GROVE_CH2: 00307 if (grv_p2s1di == NULL) 00308 return -1; 00309 return (sig == GROVE_SIG1) ? 00310 grv_p2s1di->read() : grv_p2s2di->read(); 00311 default: 00312 break; 00313 } 00314 00315 return -1; 00316 } 00317 00318 float Eeabp1::getGroveAnalog(EeabGrovePort port, EeabGroveSig sig) 00319 { 00320 switch (port) { 00321 case GROVE_CH1: 00322 return (sig == GROVE_SIG1) ? 00323 grv_p1s1a.read() : grv_p1s2a.read(); 00324 case GROVE_CH2: 00325 return (sig == GROVE_SIG1) ? 00326 grv_p2s1a.read() : grv_p2s2a.read(); 00327 default: 00328 break; 00329 } 00330 00331 return -1; 00332 } 00333 00334 int Eeabp1::enableTempHumidSensor(void) 00335 { 00336 temp_humid_sensor = new Sht31(P0_30, P0_7); 00337 return 0; 00338 } 00339 00340 float Eeabp1::getTemp(void) 00341 { 00342 if (!temp_humid_sensor) 00343 return -1; 00344 00345 return temp_humid_sensor->readTemperature(); 00346 } 00347 00348 float Eeabp1::getHumid(void) 00349 { 00350 if (!temp_humid_sensor) 00351 return -1; 00352 00353 return temp_humid_sensor->readHumidity(); 00354 } 00355 00356 int Eeabp1::enableAccelerometer(void) 00357 { 00358 accelerometer = new ADXL345_I2C(P0_30, P0_7); 00359 00360 this->debug("Device ID is: 0x%02x\n", accelerometer->getDeviceID()); 00361 wait(.001); 00362 00363 // These are here to test whether any of the initialization fails. It will print the failure 00364 if (accelerometer->setPowerControl(0x00)) { 00365 this->debug("didn't intitialize power control\n"); 00366 return -1; 00367 } 00368 wait(.001); 00369 00370 //Full resolution, +/-16g, 4mg/LSB. 00371 if(accelerometer->setDataFormatControl(0x0B)) { 00372 this->debug("didn't set data format\n"); 00373 return -1; 00374 } 00375 wait(.001); 00376 00377 //3.2kHz data rate. 00378 if(accelerometer->setDataRate(ADXL345_3200HZ)) { 00379 this->debug("didn't set data rate\n"); 00380 return -1; 00381 } 00382 wait(.001); 00383 00384 //Measurement mode. 00385 if(accelerometer->setPowerControl(MeasurementMode)) { 00386 this->debug("didn't set the power control to measurement\n"); 00387 return -1; 00388 } 00389 00390 return 0; 00391 } 00392 00393 int Eeabp1::getAcc(int *x, int *y, int *z) 00394 { 00395 int readings[3] = {0, 0, 0}; 00396 accelerometer->getOutput(readings); 00397 *x = readings[0]; 00398 *y = readings[1]; 00399 *z = readings[2]; 00400 00401 return 0; 00402 } 00403 00404 /* private functions */ 00405 void Eeabp1::flushSerial() 00406 { 00407 while(serial->readable() == true) { 00408 serial->getc(); 00409 wait_us(1000); 00410 } 00411 } 00412 00413 int Eeabp1::chkSerialChar(const char ch,uint16_t timeout_ms) 00414 { 00415 uint32_t timeoutCount = 0; 00416 00417 while(serial->readable() == false) { 00418 wait_us(50); 00419 timeoutCount++; 00420 if((timeoutCount / 20) >= timeout_ms) 00421 return -2; 00422 } 00423 00424 return (serial->getc() == ch) ? 0 : -1; 00425 } 00426 00427 int Eeabp1::waitSerialChar(const char ch,uint16_t timeout_ms) 00428 { 00429 uint32_t timeoutCount = 0; 00430 00431 do { 00432 while(serial->readable() == false) { 00433 wait_us(50); 00434 timeoutCount++; 00435 if((timeoutCount / 20) >= timeout_ms) 00436 return -2; 00437 } 00438 } while(serial->getc() != ch); 00439 00440 return 0; 00441 } 00442 00443 int Eeabp1::chkSerialCharOk() 00444 { 00445 int ret; 00446 ret = waitSerialChar('>',4000); 00447 if (ret != 0) 00448 return __LINE__; 00449 00450 ret = chkSerialChar('>',2000); 00451 if (ret != 0) 00452 return __LINE__; 00453 00454 ret = chkSerialChar(' ',2000); 00455 if (ret != 0) 00456 return __LINE__; 00457 00458 ret = chkSerialChar('O',2000); 00459 if (ret != 0) 00460 return __LINE__; 00461 00462 ret = chkSerialChar('k',2000); 00463 if (ret != 0) 00464 return __LINE__; 00465 00466 ret = waitSerialChar('>',4000); 00467 if (ret != 0) 00468 return __LINE__; 00469 00470 wait_us(1000); 00471 00472 return 0; 00473 } 00474 00475 int Eeabp1::chkSerialCharRes(char chkchr) 00476 { 00477 int ret; 00478 ret = waitSerialChar('>', 10000); 00479 if (ret != 0) 00480 return __LINE__; 00481 00482 ret = chkSerialChar('>',2000); 00483 if (ret != 0) 00484 return __LINE__; 00485 00486 ret = chkSerialChar(' ',2000); 00487 if (ret != 0) 00488 return __LINE__; 00489 00490 ret = chkSerialChar('O',2000); 00491 if (ret != 0) 00492 return __LINE__; 00493 00494 ret = chkSerialChar('k',2000); 00495 if (ret != 0) 00496 return __LINE__; 00497 00498 ret = waitSerialChar('>',16000); 00499 if (ret != 0) 00500 return __LINE__; 00501 00502 ret = chkSerialChar('>',2000); 00503 if (ret != 0) 00504 return __LINE__; 00505 00506 ret = chkSerialChar(' ',2000); 00507 if (ret != 0) 00508 return __LINE__; 00509 00510 ret = waitSerialChar(chkchr,4000); 00511 if (ret != 0) 00512 return __LINE__; 00513 00514 ret = waitSerialChar('>',4000); 00515 if (ret != 0) 00516 return __LINE__; 00517 00518 wait_us(1000); 00519 00520 return 0; 00521 }
Generated on Thu Jul 14 2022 02:04:38 by
1.7.2
