Adds run_counter to ble advertising packet

This commit is contained in:
rbaron 2021-03-28 10:44:33 +02:00
parent 37fd1173ec
commit 3c7180fefa
4 changed files with 37 additions and 20 deletions

View file

@ -7,7 +7,7 @@
#define PRST_LED_PIN NRF_GPIO_PIN_MAP(0, 28)
// Deep sleep.
#define PRST_DEEP_SLEEP_IN_SECONDS 3
#define PRST_DEEP_SLEEP_IN_SECONDS 300
// Analog to digital converter (ADC).
// Prints out ADC debug info, such as the values read for battery and soil
@ -17,10 +17,15 @@
// BLE.
// Prints out BLE debug info, such as the final encoded advertisement packet.
#define PRST_BLE_DEBUG 0
#define PRST_BLE_MAC_ADDR_LSB0 0xaa
#define PRST_BLE_MAC_ADDR_LSB1 0xbb
#define PRST_BLE_ADV_TIME_IN_MS 200
#define PRST_BLE_ADV_NAME "prst aabb"
#define PRST_BLE_PROTOCOL_VERSION 1
#define PRST_BLE_MAC_ADDR_LSB1 0x00
#define PRST_BLE_MAC_ADDR_LSB0 0x01
#define PRST_BLE_ADV_NAME "prst"
// Total time spend advertising.
#define PRST_BLE_ADV_TIME_IN_MS 1000
// Interval between advertising packets.
// From the specs, this value has to be greater or equal 20ms.
#define PRST_BLE_ADV_INTERVAL_IN_MS 30
// PWM.
#define PRST_PWM_PIN NRF_GPIO_PIN_MAP(0, 5)

View file

@ -22,12 +22,14 @@
#include "prst/shtc3.h"
#include "prst_config.h"
#define DEAD_BEEF 0xDEADBEEF
// #define DEAD_BEEF 0xDEADBEEF
// void assert_nrf_callback(uint16_t line_num, const uint8_t *p_file_name) {
// app_error_handler(DEAD_BEEF, line_num, p_file_name);
// }
// A small wrap-around counter for deduplicating BLE packets on the receiver.
static uint8_t run_counter = 0;
static void log_init(void) {
ret_code_t err_code = NRF_LOG_INIT(NULL);
APP_ERROR_CHECK(err_code);
@ -68,13 +70,14 @@ static void rtc_callback() {
prst_pwm_stop();
nrf_gpio_pin_clear(PRST_FAST_DISCH_PIN);
prst_ble_update_adv_data(batt_read.millivolts, temp_humi.temp_millicelcius,
temp_humi.humidity, soil_read.relative);
temp_humi.humidity, soil_read.relative, run_counter);
NRF_LOG_FLUSH();
prst_adv_start();
nrf_delay_ms(PRST_BLE_ADV_TIME_IN_MS);
prst_adv_stop();
nrf_gpio_pin_clear(PRST_LED_PIN);
NRF_LOG_FLUSH();
run_counter++;
}
int main(void) {

View file

@ -20,7 +20,8 @@
// The connection to configure. We only have the one.
#define PRST_CONN_CFG_TAG 1
#define NON_CONNECTABLE_ADV_INTERVAL MSEC_TO_UNITS(100, UNIT_0_625_MS)
#define NON_CONNECTABLE_ADV_INTERVAL \
MSEC_TO_UNITS(PRST_BLE_ADV_INTERVAL_IN_MS, UNIT_0_625_MS)
// Sensor data payload that will go into the advertisement message.
#define SERVICE_DATA_LEN 12
@ -93,7 +94,8 @@ static void init_advertisement_data() {
sd_ble_gap_adv_set_configure(&adv_handle_, &gap_adv_data_, &adv_params_);
APP_ERROR_CHECK(err_code);
APP_ERROR_CHECK(sd_ble_gap_addr_set(&gap_addr_));
// Four bits for the protocol version
service_data[0] = (PRST_BLE_PROTOCOL_VERSION << 4) & 0xf0;
}
void prst_ble_init() {
@ -112,23 +114,29 @@ void prst_ble_init() {
err_code = nrf_sdh_ble_enable(&ram_start);
APP_ERROR_CHECK(err_code);
APP_ERROR_CHECK(sd_ble_gap_addr_set(&gap_addr_));
init_advertisement_data();
}
void prst_ble_update_adv_data(uint16_t batt_millivolts,
uint16_t temp_millicelcius, uint16_t humidity,
uint16_t soil_moisture) {
service_data[0] = batt_millivolts >> 8;
service_data[1] = batt_millivolts & 0xff;
uint16_t soil_moisture, uint8_t run_counter) {
// 4 bits for a small wrap-around counter for deduplicating messages on the
// receiver.
service_data[1] = run_counter & 0x0f;
service_data[2] = temp_millicelcius >> 8;
service_data[3] = temp_millicelcius & 0xff;
service_data[2] = batt_millivolts >> 8;
service_data[3] = batt_millivolts & 0xff;
service_data[4] = humidity >> 8;
service_data[5] = humidity & 0xff;
service_data[4] = temp_millicelcius >> 8;
service_data[5] = temp_millicelcius & 0xff;
service_data[6] = soil_moisture >> 8;
service_data[7] = soil_moisture & 0xff;
service_data[6] = humidity >> 8;
service_data[7] = humidity & 0xff;
service_data[8] = soil_moisture >> 8;
service_data[9] = soil_moisture & 0xff;
// Encodes adv_data_ into .gap_adv_data_.
uint32_t err_code = ble_advdata_encode(

View file

@ -13,6 +13,7 @@ void prst_adv_stop();
void prst_ble_update_adv_data(uint16_t batt_millivolts,
uint16_t temp_millicelcius, uint16_t humidity,
uint16_t soil_moisture);
uint16_t soil_moisture,
uint8_t run_counter);
#endif // _PRST_BLE_H_