IoT - Kubus / Mbed 2 deprecated Kubus

Dependencies:   mbed nRF24L01P

sensor_board.cpp

Committer:
pannaannap
Date:
2017-01-10
Revision:
29:c2838405fa5c
Parent:
28:80bc5ebf3ae0
Child:
37:1251e35fe43e

File content as of revision 29:c2838405fa5c:

#include "sensor_board.h"

#include <ctime>

bool send_from_digital_sensor = false;
bool send_from_analog_sensor = false;

void setSentFromDigitalSensor() {
    send_from_digital_sensor = true;
}

void setSentFromAnalogSensor() {
    send_from_analog_sensor = true;
}

const int Board::MAX_RETRY = 3;

Board::Board(unsigned long long rx_address, DigitalSensor* digital_sensor,
             AnalogSensor* analog_sensor, unsigned long long tx_address) :
                pc_(USBTX, USBRX), radio_(PB_15, PB_14, PB_13, PB_12, PB_1, PB_2),
                analog_sensor_(analog_sensor), digital_sensor_(digital_sensor),
                analog_ticker_(Ticker()), digital_ticker_(Ticker()) {
                    
    std::srand(std::time(0));
    pc_.baud(115200);
    radio_init(&radio_, rx_address, tx_address);
    displayRadioSetup();
    analog_ticker_.attach(&setSentFromAnalogSensor, analog_sensor->SEND_INTERVAL);
    digital_ticker_.attach(&setSentFromDigitalSensor, digital_sensor->SEND_INTERVAL);
}

void Board::updateSensor(Sensor* sensor, bool* should_send_data) {
    if (sensor != NULL) {
        sensor->updateState();
        if (*should_send_data) {
            Data data_to_send = sensor->dataToSend();
            if (send(data_to_send)) {
                *should_send_data = false;
                sensor->resetState();
            }
        }
    }
}

void Board::run() {
    while(true) {
        updateSensor(analog_sensor_, &send_from_analog_sensor);
        updateSensor(digital_sensor_, &send_from_digital_sensor);
    }
}

void Board::displayRadioSetup() {
    // Display the (default) setup of the nRF24L01+ chip
    pc_.printf( "nRF24L01+ Frequency    : %d MHz\r\n",  radio_.getRfFrequency() );
    pc_.printf( "nRF24L01+ Output power : %d dBm\r\n",  radio_.getRfOutputPower() );
    pc_.printf( "nRF24L01+ Data Rate    : %d kbps\r\n", radio_.getAirDataRate() );
    pc_.printf( "nRF24L01+ TX Address   : 0x%010llX\r\n", radio_.getTxAddress() );
    pc_.printf( "nRF24L01+ RX0 Address   : 0x%010llX\r\n", radio_.getRxAddress(NRF24L01P_PIPE_P0) );
    pc_.printf( "nRF24L01+ RX1 Address   : 0x%010llX\r\n", radio_.getRxAddress(NRF24L01P_PIPE_P1) );
}

int Board::getRandomWaitMs() {
    return std::rand() % 500;
}

bool Board::sendByRadio(char message[TRANSFER_SIZE]) {
    int retry_counter = 0;
    while (retry_counter < Board::MAX_RETRY) {
        wait_ms(getRandomWaitMs());
        int tx_bytes = radio_.write(NRF24L01P_PIPE_P0, message, TRANSFER_SIZE);
        if (tx_bytes >= 0) {
            pc_.printf("Board retry %d,  radio retry %d\r\n", retry_counter, radio_.getRetrCount());
            return true;
        }
        retry_counter++;
    }
    return false;
}

bool Board::send(Data data) {
    std::string serialized_data = data.serialize();
    pc_.printf("string data '%s', len %d\r\n", serialized_data.c_str(), serialized_data.size());

    char message[TRANSFER_SIZE];
    memset(message, 0, sizeof(message));
    memcpy(message, serialized_data.c_str(), serialized_data.length());
    return sendByRadio(message);
}