send GPS data via LoRaWAN

Dependencies:   TinyGPS mbed ADXL345_I2C Sht31

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;
}