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.
sensor_board.cpp@29:c2838405fa5c, 2017-01-10 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |