IoT - Kubus / Mbed 2 deprecated Kubus

Dependencies:   mbed nRF24L01P

Committer:
pannaannap
Date:
Tue Jan 10 16:40:04 2017 +0000
Revision:
29:c2838405fa5c
Parent:
28:80bc5ebf3ae0
Child:
37:1251e35fe43e
retry multiple times, random time

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pannaannap 27:27cffdb2e9d3 1 #include "sensor_board.h"
pannaannap 27:27cffdb2e9d3 2
pannaannap 29:c2838405fa5c 3 #include <ctime>
pannaannap 29:c2838405fa5c 4
pannaannap 27:27cffdb2e9d3 5 bool send_from_digital_sensor = false;
pannaannap 27:27cffdb2e9d3 6 bool send_from_analog_sensor = false;
pannaannap 27:27cffdb2e9d3 7
pannaannap 27:27cffdb2e9d3 8 void setSentFromDigitalSensor() {
pannaannap 27:27cffdb2e9d3 9 send_from_digital_sensor = true;
pannaannap 27:27cffdb2e9d3 10 }
pannaannap 27:27cffdb2e9d3 11
pannaannap 27:27cffdb2e9d3 12 void setSentFromAnalogSensor() {
pannaannap 27:27cffdb2e9d3 13 send_from_analog_sensor = true;
pannaannap 27:27cffdb2e9d3 14 }
pannaannap 27:27cffdb2e9d3 15
pannaannap 29:c2838405fa5c 16 const int Board::MAX_RETRY = 3;
pannaannap 29:c2838405fa5c 17
pannaannap 27:27cffdb2e9d3 18 Board::Board(unsigned long long rx_address, DigitalSensor* digital_sensor,
pannaannap 27:27cffdb2e9d3 19 AnalogSensor* analog_sensor, unsigned long long tx_address) :
pannaannap 27:27cffdb2e9d3 20 pc_(USBTX, USBRX), radio_(PB_15, PB_14, PB_13, PB_12, PB_1, PB_2),
pannaannap 27:27cffdb2e9d3 21 analog_sensor_(analog_sensor), digital_sensor_(digital_sensor),
pannaannap 27:27cffdb2e9d3 22 analog_ticker_(Ticker()), digital_ticker_(Ticker()) {
pannaannap 29:c2838405fa5c 23
pannaannap 29:c2838405fa5c 24 std::srand(std::time(0));
pannaannap 27:27cffdb2e9d3 25 pc_.baud(115200);
pannaannap 27:27cffdb2e9d3 26 radio_init(&radio_, rx_address, tx_address);
pannaannap 27:27cffdb2e9d3 27 displayRadioSetup();
pannaannap 27:27cffdb2e9d3 28 analog_ticker_.attach(&setSentFromAnalogSensor, analog_sensor->SEND_INTERVAL);
pannaannap 27:27cffdb2e9d3 29 digital_ticker_.attach(&setSentFromDigitalSensor, digital_sensor->SEND_INTERVAL);
pannaannap 27:27cffdb2e9d3 30 }
pannaannap 27:27cffdb2e9d3 31
pannaannap 27:27cffdb2e9d3 32 void Board::updateSensor(Sensor* sensor, bool* should_send_data) {
sbarzowski 28:80bc5ebf3ae0 33 if (sensor != NULL) {
pannaannap 27:27cffdb2e9d3 34 sensor->updateState();
pannaannap 27:27cffdb2e9d3 35 if (*should_send_data) {
pannaannap 27:27cffdb2e9d3 36 Data data_to_send = sensor->dataToSend();
pannaannap 27:27cffdb2e9d3 37 if (send(data_to_send)) {
pannaannap 27:27cffdb2e9d3 38 *should_send_data = false;
pannaannap 27:27cffdb2e9d3 39 sensor->resetState();
pannaannap 27:27cffdb2e9d3 40 }
pannaannap 27:27cffdb2e9d3 41 }
pannaannap 27:27cffdb2e9d3 42 }
pannaannap 27:27cffdb2e9d3 43 }
pannaannap 27:27cffdb2e9d3 44
pannaannap 27:27cffdb2e9d3 45 void Board::run() {
pannaannap 27:27cffdb2e9d3 46 while(true) {
pannaannap 27:27cffdb2e9d3 47 updateSensor(analog_sensor_, &send_from_analog_sensor);
pannaannap 27:27cffdb2e9d3 48 updateSensor(digital_sensor_, &send_from_digital_sensor);
pannaannap 27:27cffdb2e9d3 49 }
pannaannap 27:27cffdb2e9d3 50 }
pannaannap 27:27cffdb2e9d3 51
pannaannap 27:27cffdb2e9d3 52 void Board::displayRadioSetup() {
pannaannap 27:27cffdb2e9d3 53 // Display the (default) setup of the nRF24L01+ chip
pannaannap 27:27cffdb2e9d3 54 pc_.printf( "nRF24L01+ Frequency : %d MHz\r\n", radio_.getRfFrequency() );
pannaannap 27:27cffdb2e9d3 55 pc_.printf( "nRF24L01+ Output power : %d dBm\r\n", radio_.getRfOutputPower() );
pannaannap 27:27cffdb2e9d3 56 pc_.printf( "nRF24L01+ Data Rate : %d kbps\r\n", radio_.getAirDataRate() );
pannaannap 27:27cffdb2e9d3 57 pc_.printf( "nRF24L01+ TX Address : 0x%010llX\r\n", radio_.getTxAddress() );
pannaannap 27:27cffdb2e9d3 58 pc_.printf( "nRF24L01+ RX0 Address : 0x%010llX\r\n", radio_.getRxAddress(NRF24L01P_PIPE_P0) );
pannaannap 27:27cffdb2e9d3 59 pc_.printf( "nRF24L01+ RX1 Address : 0x%010llX\r\n", radio_.getRxAddress(NRF24L01P_PIPE_P1) );
pannaannap 27:27cffdb2e9d3 60 }
pannaannap 27:27cffdb2e9d3 61
pannaannap 29:c2838405fa5c 62 int Board::getRandomWaitMs() {
pannaannap 29:c2838405fa5c 63 return std::rand() % 500;
pannaannap 29:c2838405fa5c 64 }
pannaannap 29:c2838405fa5c 65
pannaannap 29:c2838405fa5c 66 bool Board::sendByRadio(char message[TRANSFER_SIZE]) {
pannaannap 29:c2838405fa5c 67 int retry_counter = 0;
pannaannap 29:c2838405fa5c 68 while (retry_counter < Board::MAX_RETRY) {
pannaannap 29:c2838405fa5c 69 wait_ms(getRandomWaitMs());
pannaannap 29:c2838405fa5c 70 int tx_bytes = radio_.write(NRF24L01P_PIPE_P0, message, TRANSFER_SIZE);
pannaannap 29:c2838405fa5c 71 if (tx_bytes >= 0) {
pannaannap 29:c2838405fa5c 72 pc_.printf("Board retry %d, radio retry %d\r\n", retry_counter, radio_.getRetrCount());
pannaannap 29:c2838405fa5c 73 return true;
pannaannap 29:c2838405fa5c 74 }
pannaannap 29:c2838405fa5c 75 retry_counter++;
pannaannap 29:c2838405fa5c 76 }
pannaannap 29:c2838405fa5c 77 return false;
pannaannap 29:c2838405fa5c 78 }
pannaannap 29:c2838405fa5c 79
pannaannap 27:27cffdb2e9d3 80 bool Board::send(Data data) {
pannaannap 27:27cffdb2e9d3 81 std::string serialized_data = data.serialize();
pannaannap 27:27cffdb2e9d3 82 pc_.printf("string data '%s', len %d\r\n", serialized_data.c_str(), serialized_data.size());
pannaannap 27:27cffdb2e9d3 83
pannaannap 27:27cffdb2e9d3 84 char message[TRANSFER_SIZE];
pannaannap 27:27cffdb2e9d3 85 memset(message, 0, sizeof(message));
pannaannap 27:27cffdb2e9d3 86 memcpy(message, serialized_data.c_str(), serialized_data.length());
pannaannap 29:c2838405fa5c 87 return sendByRadio(message);
pannaannap 27:27cffdb2e9d3 88 }