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 Chainable_RGB_LED EEAB-P1 MMA8652FC Sht31 TinyGPS mbed
Fork of ina-hack-test by
EEAB-P1/Eeabp1.cpp
- Committer:
- koyo_take
- Date:
- 2017-06-24
- Revision:
- 0:97a57be77fbb
- Child:
- 1:195da8230785
File content as of revision 0:97a57be77fbb:
#include "Eeabp1.h"
//#include "rtos.h"
//Thread thread;
static const int lora_msg_max_len = 11;
Eeabp1::Eeabp1() : pwr_en(P0_0), led(P0_23), lora_reset(P0_22), lora_power(P0_5), grove_power(P0_6)
{
this->led_state = LED_OFF;
this->led = 0;
this->serial = new RawSerial(P0_9, P0_11);
this->serial->baud(9600); /* use for LoRa */
this->pwr_en = 1; // メイン電源投入
this->lora_power = 0;
this->lora_reset = 0;
this->grove_power = 0;
this->lora_enabled = false;
this->grove_enabled = false;
}
int Eeabp1::setLedState(EeabLedState state)
{
this->led_state = state;
if (this->led_state == LED_OFF) {
this->led = 0;
} else {
this->led = 1;
}
return 0;
}
void Eeabp1::loop(void)
{
switch (this->led_state) {
case LED_OFF:
/* fall through */
case LED_ON:
break;
case LED_BLINK_FAST:
case LED_BLINK_MID:
case LED_BLINK_SLOW:
this->led = !this->led;
break;
}
}
int Eeabp1::debug(const char * format, ...)
{
char tmp[80];
int ret;
std::va_list arg;
va_start(arg, format);
vsnprintf(tmp, sizeof(tmp), format, arg);
va_end(arg);
delete this->serial;
this->serial = new RawSerial(P0_8, P0_10);
ret = this->serial->puts(tmp);
delete this->serial;
this->serial = new RawSerial(P0_9, P0_11);
return ret;
}
int Eeabp1::setLoRaPower(bool on)
{
int ret;
if (on) {
if (lora_enabled)
return 0; /* power is already on, do nothing */
this->lora_power= 1;
this->lora_reset = 1;
wait_us(500000);
serial->printf("mod set_echo off\r\n"); // ローカルエコー:無効
wait(1);
flushSerial();
serial->printf("lorawan join otaa\r\n"); // Gatewayに接続(OTAA)
ret = chkSerialCharRes('a'); // 成功 ">> accepted" 失敗 ">> unsuccess"
if (ret != 0)
return ret;
serial->printf("lorawan set_dr 2\r\n"); // データレートの設定(11byte)
ret = chkSerialCharOk();
if (ret != 0)
return ret;
this->lora_enabled = true;
} else { /* off */
if (!lora_enabled)
return 0; /* power is already off, do nothing */
lora_power= 0;
lora_enabled = false;
}
return 0;
}
int Eeabp1::sendLoRaString(const char * format, ...)
{
char str[lora_msg_max_len+1] = {0x00, };
char msg[64];
char *p = msg;
std::va_list arg;
va_start(arg, format);
vsnprintf(str, sizeof(str), format, arg);
va_end(arg);
p += sprintf(msg, "lorawan tx ucnf 16 ");
for (unsigned int i = 0; i < strlen(str); i++) {
p += sprintf(p, "%02x", str[i]);
}
sprintf(p, "\r\n");
flushSerial();
serial->puts(msg);
//serial->printf("lorawan tx ucnf 16 74657374\r\n");
return 0;
}
void Eeabp1::setGrovePower(bool on)
{
if (on) {
if (grove_enabled)
return; /* power is already on, do nothing */
grove_power = 1;
} else {
if (!grove_enabled)
return; /* power is already off, do nothing */
grove_power = 0;
}
}
/* private functions */
void Eeabp1::flushSerial()
{
while(serial->readable() == true) {
serial->getc();
wait_us(1000);
}
}
int Eeabp1::chkSerialChar(const char ch,uint16_t timeout_ms)
{
uint32_t timeoutCount = 0;
while(serial->readable() == false) {
wait_us(50);
timeoutCount++;
if((timeoutCount / 20) >= timeout_ms)
return -2;
}
return (serial->getc() == ch) ? 0 : -1;
}
int Eeabp1::waitSerialChar(const char ch,uint16_t timeout_ms)
{
uint32_t timeoutCount = 0;
do {
while(serial->readable() == false) {
wait_us(50);
timeoutCount++;
if((timeoutCount / 20) >= timeout_ms)
return -2;
}
} while(serial->getc() != ch);
return 0;
}
int Eeabp1::chkSerialCharOk()
{
int ret;
ret = waitSerialChar('>',4000);
if (ret != 0)
return __LINE__;
ret = chkSerialChar('>',2000);
if (ret != 0)
return __LINE__;
ret = chkSerialChar(' ',2000);
if (ret != 0)
return __LINE__;
ret = chkSerialChar('O',2000);
if (ret != 0)
return __LINE__;
ret = chkSerialChar('k',2000);
if (ret != 0)
return __LINE__;
ret = waitSerialChar('>',4000);
if (ret != 0)
return __LINE__;
wait_us(1000);
return 0;
}
int Eeabp1::chkSerialCharRes(char chkchr)
{
int ret;
ret = waitSerialChar('>', 10000);
if (ret != 0)
return __LINE__;
ret = chkSerialChar('>',2000);
if (ret != 0)
return __LINE__;
ret = chkSerialChar(' ',2000);
if (ret != 0)
return __LINE__;
ret = chkSerialChar('O',2000);
if (ret != 0)
return __LINE__;
ret = chkSerialChar('k',2000);
if (ret != 0)
return __LINE__;
ret = waitSerialChar('>',16000);
if (ret != 0)
return __LINE__;
ret = chkSerialChar('>',2000);
if (ret != 0)
return __LINE__;
ret = chkSerialChar(' ',2000);
if (ret != 0)
return __LINE__;
ret = chkSerialChar(chkchr,2000);
if (ret != 0)
return ret * __LINE__;
ret = waitSerialChar('>',4000);
if (ret != 0)
return __LINE__;
wait_us(1000);
return 0;
}
