diff --git a/prj.conf b/prj.conf index 5352717..45d26d3 100755 --- a/prj.conf +++ b/prj.conf @@ -1,3 +1,5 @@ +CONFIG_RUUVITAG_NFC_SENSOR_DATA=y +CONFIG_RUUVITAG_NFC_SENSOR_DATA_FREQUENCY=1 # Enable rebooting CONFIG_REBOOT=y @@ -27,14 +29,11 @@ CONFIG_BT=y CONFIG_BT_BROADCASTER=y CONFIG_BT_PERIPHERAL=y CONFIG_BT_GATT_CLIENT=y - +CONFIG_BT_GATT_CACHING=n CONFIG_BT_CTLR=y CONFIG_BT_CTLR_TX_PWR_PLUS_4=y CONFIG_BT_DEVICE_NAME="Ruuvi" -# Remove warning -CONFIG_BT_GATT_CACHING=n - # NFC CONFIG_NFC_T2T_NRFXLIB=y CONFIG_NFC_NDEF=y diff --git a/src/board_info/board_info.c b/src/board_info/board_info.c index b1d0a04..1a4b2d9 100644 --- a/src/board_info/board_info.c +++ b/src/board_info/board_info.c @@ -27,7 +27,7 @@ void get_id(char *serial_number) /* Expand binary device ID to hex string */ len = bin2hex(device_id, sizeof(device_id), serial_number, RUUVI_DSN_LENGTH_CHAR + 1); - __ASSERT_NO_MSG(len == GADGETSRUUVI_DSN_LENGTH_CHAR_DSN_LENGTH_CHARS); + __ASSERT_NO_MSG(len == RUUVI_DSN_LENGTH_CHAR); LOG_INF("Serial: %s", log_strdup(serial_number)); } diff --git a/src/bt_handler/bt_handler.c b/src/bt_handler/bt_handler.c index ffe8f60..ca62a28 100644 --- a/src/bt_handler/bt_handler.c +++ b/src/bt_handler/bt_handler.c @@ -41,7 +41,7 @@ static struct k_work ble_work; BT_GAP_ADV_SLOW_INT_MIN, \ BT_GAP_ADV_SLOW_INT_MIN, NULL) -static uint8_t mfg_data[RUUVI_MFG_OFFSET + RUUVI_RAWv2_LEN +1]; +static uint8_t mfg_data[RUUVI_MFG_OFFSET + RUUVI_RAWv2_LEN]; /* Set Scan Response data */ static const struct bt_data sd[] = { @@ -57,13 +57,6 @@ static const struct bt_data bc[] = { BT_DATA(BT_DATA_MANUFACTURER_DATA, mfg_data, sizeof(mfg_data)), }; -static struct bt_conn_cb m_conn_callbacks = { - .connected = connected, - .disconnected = disconnected, - .le_param_req = le_param_req, - .le_param_updated = le_param_updated -}; - static void connected(struct bt_conn *conn, uint8_t err) { if (err) { @@ -77,6 +70,23 @@ static void disconnected(struct bt_conn *conn, uint8_t reason) LOG_INF("disconnected (reason: %u)", reason); } +static bool le_param_req(struct bt_conn *conn, struct bt_le_conn_param *param) +{ + return true; +} + +static void le_param_updated(struct bt_conn *conn, uint16_t interval, uint16_t latency, uint16_t timeout) +{ + +} + +static struct bt_conn_cb m_conn_callbacks = { + .connected = connected, + .disconnected = disconnected, + .le_param_req = le_param_req, + .le_param_updated = le_param_updated +}; + static void advertise(struct k_work *work) { int rc; @@ -97,20 +107,11 @@ static void advertise(struct k_work *work) LOG_INF("Ruuvitag is now beaconing."); } -static bool le_param_req(struct bt_conn *conn, struct bt_le_conn_param *param) -{ - return true; -} - -static void le_param_updated(struct bt_conn *conn, uint16_t interval, uint16_t latency, uint16_t timeout) -{ - -} - void bt_update_packet(void){ ruuvi_update_endpoint(mfg_data); /* Update advertisement data */ bt_le_adv_update_data(bc, ARRAY_SIZE(bc), sd, ARRAY_SIZE(sd)); + LOG_DBG("Updating BLE packet"); } void bt_init(void) @@ -134,7 +135,7 @@ void bt_init(void) #endif - LOG_DBG("Bluetooth initialized"); + LOG_INF("Bluetooth initialized"); } void bt_adv_stop(void) diff --git a/src/main.c b/src/main.c index 5929c4f..d538b61 100755 --- a/src/main.c +++ b/src/main.c @@ -70,6 +70,9 @@ static void dfu_init(void){ #endif } +#if CONFIG_RUUVITAG_NFC_SENSOR_DATA +static int64_t last_nfc_update = 0; +#endif static int64_t lastPressed = 0; static int64_t btn_time = 0; @@ -90,15 +93,14 @@ void main(void) { LOG_INF("Ruuvitag Started"); LOG_INF("Version: %s", log_strdup(CONFIG_RUUVITAG_APP_VERSION)); + led_init(); button_init(); /* - * If button B is pressed, the device will be connectable - * and ready for a DFU. This state will be reverted after a specific - * amount of time, controllable by using CONFIG_RUUVITAG_DFU_TIMEOUT. - * Default is 2 minutes. + * This could be used in the future to perform any numbers + * of tasks. */ if(button_pressed_state()){ LOG_INF("Button Pressed at boot.\n"); @@ -112,8 +114,8 @@ void main(void) ruuvi_endpoint_sensor_check(); /* - * This is required to allow the application to easily toggle - * between BT modes. + * Enables the filsesystem and mgmt groups that are required to + * enable dfu functionality. */ dfu_init(); @@ -122,12 +124,21 @@ void main(void) /* NFC must be done after BT so that MAC can be received. */ ruuvi_nfc_init(); +#if CONFIG_RUUVITAG_NFC_SENSOR_DATA + last_nfc_update = k_uptime_get(); +#endif while (true) { toggle_green(1); bt_update_packet(); /* Turn LEDs off */ toggle_green(0); - +#if CONFIG_RUUVITAG_NFC_SENSOR_DATA + if(k_uptime_get() - last_nfc_update > RUUVI_NFC_REFRESH){ + ruuvi_nfc_update(); + last_nfc_update = k_uptime_get(); + } +#endif + k_sleep(K_MSEC(980)); } } diff --git a/src/nfc_handler/nfc_handler.c b/src/nfc_handler/nfc_handler.c index 5d91962..ed34d9a 100644 --- a/src/nfc_handler/nfc_handler.c +++ b/src/nfc_handler/nfc_handler.c @@ -8,9 +8,11 @@ #include #include #include + #include #include #include + #include #include #include @@ -23,14 +25,15 @@ #include LOG_MODULE_REGISTER(nfc_handler, CONFIG_RUUVITAG_LOG_LEVEL); -/* Create NFC NDEF message description, capacity - MAX_REC_COUNT - * records - */ -NFC_NDEF_MSG_DEF(nfc_text_msg, MAX_REC_COUNT); +static struct k_work nfc_work; +atomic_t nfc_setup = ATOMIC_INIT(0); /* Buffer used to hold an NFC NDEF message. */ -static uint8_t ndef_msg_buf[NDEF_MSG_BUF_SIZE]; +static uint8_t ndef_msg_buf[RUUVI_NDEF_MSG_BUF_SIZE]; +/** + * @brief Code for each record. + */ static const uint8_t os_code[] = {'O', 'S'}; static const uint8_t ncs_code[] = {'N', 'C', 'S'}; static const uint8_t fw_code[] = {'F', 'W'}; @@ -38,14 +41,16 @@ static const uint8_t ad_code[] = {'A', 'D'}; static const uint8_t id_code[] = {'I', 'D'}; static const uint8_t data_code[] = {'D', 'A'}; -char os_payload[NFC_ZEPHYR_VERSION_LEN]; -char ncs_payload[NFC_NCS_VERSION_LEN]; -char fw_payload[NFC_FW_VERSION_LEN]; -char ad_payload[NFC_AD_LEN]; -char id_payload[NFC_SERIAL_LEN]; -uint8_t data_payload[RUUVI_RAWv2_LEN]; - -static bool first_setup = false; +/** + * @brief Buffers for each record.r. + */ +char os_payload[RUUVI_NFC_ZEPHYR_VERSION_LEN]; +char ncs_payload[RUUVI_NFC_NCS_VERSION_LEN]; +char fw_payload[RUUVI_NFC_FW_VERSION_LEN]; +char ad_payload[RUUVI_NFC_AD_LEN]; +char id_payload[RUUVI_NFC_SERIAL_LEN]; +char data_payload[RUUVI_NFC_DATA_LEN]; +uint8_t data_payload_raw[RUUVI_RAWv2_LEN]; static void nfc_callback(void *context, enum nfc_t2t_event event, @@ -68,6 +73,9 @@ static void nfc_callback(void *context, } } +/** + * @brief Function for filling the static data buffers. + */ static void ruuvi_nfc_fill_static_data(void){ strcpy(os_payload, "Zephyr: "); strcat(os_payload, "2.4.0"); @@ -78,8 +86,9 @@ static void ruuvi_nfc_fill_static_data(void){ mac_address_bin_t device_mac; get_mac(&device_mac); - sprintf(ad_payload, "MAC: %02X:%02X:%02X:%02X:%02X:%02X", device_mac.mac[5], device_mac.mac[4], device_mac.mac[3], - device_mac.mac[2], device_mac.mac[1], device_mac.mac[0]); + sprintf(ad_payload, "MAC: %02X:%02X:%02X:%02X:%02X:%02X", + device_mac.mac[5], device_mac.mac[4], device_mac.mac[3], + device_mac.mac[2], device_mac.mac[1], device_mac.mac[0]); char device_id[RUUVI_DSN_LENGTH_CHAR]; get_id(device_id); @@ -98,9 +107,19 @@ static void ruuvi_nfc_fill_static_data(void){ fragments[2], fragments[3],fragments[4], fragments[5], fragments[6], fragments[7]); } -static void ruuvi_nfc_update_sensor_data(void){ - - ruuvi_update_nfc_endpoint(data_payload); +/** + * @brief Function for filling the RAWv2 data buffer. + */ +static void ruuvi_nfc_fill_sensor_data(void){ + ruuvi_update_nfc_endpoint(data_payload_raw); + sprintf(data_payload, + "Data: %02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", + data_payload_raw[0], data_payload_raw[1], data_payload_raw[2], data_payload_raw[4], + data_payload_raw[5], data_payload_raw[6], data_payload_raw[7], data_payload_raw[8], + data_payload_raw[9], data_payload_raw[10], data_payload_raw[11], data_payload_raw[12], + data_payload_raw[13], data_payload_raw[14], data_payload_raw[15], data_payload_raw[16], + data_payload_raw[17], data_payload_raw[18], data_payload_raw[19], data_payload_raw[20], + data_payload_raw[21], data_payload_raw[22], data_payload_raw[23]); } /** @@ -110,20 +129,18 @@ static int ruuvi_nfc_msg_encode(uint8_t *buffer, uint32_t *len) { int err; - if (!first_setup){ + if (!atomic_get(&nfc_setup)){ ruuvi_nfc_fill_static_data(); - first_setup = true; + atomic_set(&nfc_setup, 1); } -#ifdef CONFIG_RUUVITAG_NFC_SENSOR_DATA - ruuvi_nfc_update_sensor_data(); -#endif - - /* Create NFC NDEF text record for FW version */ + ruuvi_nfc_fill_sensor_data(); + + /* Create NFC NDEF text record for Zephyr version */ NFC_NDEF_TEXT_RECORD_DESC_DEF(nfc_os_text_rec, UTF_8, os_code, sizeof(os_code), os_payload,sizeof(os_payload)); - /* Create NFC NDEF text record for FW version */ + /* Create NFC NDEF text record for NCS version */ NFC_NDEF_TEXT_RECORD_DESC_DEF(nfc_ncs_text_rec, UTF_8, ncs_code, sizeof(ncs_code), ncs_payload,sizeof(ncs_payload)); @@ -131,19 +148,24 @@ static int ruuvi_nfc_msg_encode(uint8_t *buffer, uint32_t *len) NFC_NDEF_TEXT_RECORD_DESC_DEF(nfc_sw_text_rec, UTF_8, fw_code, sizeof(fw_code), fw_payload, sizeof(fw_payload)); - /* Create NFC NDEF text record for FW version */ + /* Create NFC NDEF text record for tags MAC */ NFC_NDEF_TEXT_RECORD_DESC_DEF(nfc_ad_text_rec, UTF_8, ad_code, sizeof(ad_code), ad_payload, sizeof(ad_payload)); - /* Create NFC NDEF text record for FW version */ + /* Create NFC NDEF text record for tags serial */ NFC_NDEF_TEXT_RECORD_DESC_DEF(nfc_id_text_rec, UTF_8, id_code, sizeof(id_code), id_payload, sizeof(id_payload)); - //NFC_NDEF_GENERIC_RECORD_DESC_DEF(data_id, TNF_EMPTY, data_code, sizeof(data_code), ); - - + /* Create NFC NDEF text record for Ruuvi RAWv2 data */ + NFC_NDEF_TEXT_RECORD_DESC_DEF(nfc_data_text_rec, UTF_8, + data_code, sizeof(data_code), data_payload, sizeof(data_payload)); - /* Add text records to NDEF text message */ + /* Create NFC NDEF message description, capacity - RUUVI_MAX_REC_COUNT + * records + */ + NFC_NDEF_MSG_DEF(nfc_text_msg, RUUVI_MAX_REC_COUNT); + + /* Add text records to NDEF text messages */ err = nfc_ndef_msg_record_add(&NFC_NDEF_MSG(nfc_text_msg), &NFC_NDEF_TEXT_RECORD_DESC(nfc_os_text_rec)); if (err < 0) { @@ -151,7 +173,6 @@ static int ruuvi_nfc_msg_encode(uint8_t *buffer, uint32_t *len) return err; } - /* Add text records to NDEF text message */ err = nfc_ndef_msg_record_add(&NFC_NDEF_MSG(nfc_text_msg), &NFC_NDEF_TEXT_RECORD_DESC(nfc_ncs_text_rec)); if (err < 0) { @@ -167,7 +188,6 @@ static int ruuvi_nfc_msg_encode(uint8_t *buffer, uint32_t *len) return err; } - /* Add text records to NDEF text message */ err = nfc_ndef_msg_record_add(&NFC_NDEF_MSG(nfc_text_msg), &NFC_NDEF_TEXT_RECORD_DESC(nfc_ad_text_rec)); if (err < 0) { @@ -175,7 +195,6 @@ static int ruuvi_nfc_msg_encode(uint8_t *buffer, uint32_t *len) return err; } - /* Add text records to NDEF text message */ err = nfc_ndef_msg_record_add(&NFC_NDEF_MSG(nfc_text_msg), &NFC_NDEF_TEXT_RECORD_DESC(nfc_id_text_rec)); if (err < 0) { @@ -183,6 +202,13 @@ static int ruuvi_nfc_msg_encode(uint8_t *buffer, uint32_t *len) return err; } + err = nfc_ndef_msg_record_add(&NFC_NDEF_MSG(nfc_text_msg), + &NFC_NDEF_TEXT_RECORD_DESC(nfc_data_text_rec)); + if (err < 0) { + LOG_ERR("Cannot add data record!\n"); + return err; + } + err = nfc_ndef_msg_encode(&NFC_NDEF_MSG(nfc_text_msg), buffer, len); @@ -193,48 +219,63 @@ static int ruuvi_nfc_msg_encode(uint8_t *buffer, uint32_t *len) return err; } -int ruuvi_nfc_init(void){ - uint32_t len = sizeof(ndef_msg_buf); - - if (!first_setup){ - /* Set up NFC */ - if (nfc_t2t_setup(nfc_callback, NULL) < 0) { - LOG_ERR("Cannot setup NFC T2T library!\n"); - goto fail; - } - } - else{ +/** + * @brief Function allow the controlling of the NFC records on + * INIT and UPDATE calls. + */ +static void ruuvi_update_nfc_records(struct k_work *work){ + uint32_t len = sizeof(ndef_msg_buf); + uint8_t nfc_update = atomic_get(&nfc_setup); + if(nfc_update){ /* Stop sensing NFC field */ if (nfc_t2t_emulation_stop() < 0) { - LOG_ERR("Cannot stop emulation!\n"); - goto fail; + LOG_ERR("Cannot stop emulation!"); + return; } memset(ndef_msg_buf, 0, sizeof(ndef_msg_buf)); } - /* Encode welcome message */ + /* Encode messages */ if (ruuvi_nfc_msg_encode(ndef_msg_buf, &len) < 0) { - LOG_ERR("Cannot encode message!\n"); - goto fail; + LOG_ERR("Cannot encode message!"); } - /* Set created message as the NFC payload */ if (nfc_t2t_payload_set(ndef_msg_buf, len) < 0) { - LOG_ERR("Cannot set payload!\n"); - goto fail; + LOG_ERR("Cannot set payload!"); } - /* Start sensing NFC field */ if (nfc_t2t_emulation_start() < 0) { - LOG_ERR("Cannot start emulation!\n"); - goto fail; + LOG_ERR("Cannot start emulation!"); + } + + if (!nfc_update){ + LOG_INF("NFC configuration done"); + } + else{ + LOG_DBG("NFC Updated"); + } +} + +/** + * @brief Function for updating NFC records.. + */ +void ruuvi_nfc_update(void){ + k_work_submit(&nfc_work); +} + +/** + * @brief Function for setting up NFC. + */ +void ruuvi_nfc_init(void){ + /* Set up NFC */ + if (nfc_t2t_setup(nfc_callback, NULL) < 0) { + LOG_ERR("Cannot setup NFC T2T library!\n"); + return; } - LOG_INF("NFC configuration done\n"); - return 0; + k_work_init(&nfc_work, ruuvi_update_nfc_records); -fail: - return -EIO; -} \ No newline at end of file + k_work_submit(&nfc_work); +} diff --git a/src/nfc_handler/nfc_handler.h b/src/nfc_handler/nfc_handler.h index ecefe5e..97359d7 100644 --- a/src/nfc_handler/nfc_handler.h +++ b/src/nfc_handler/nfc_handler.h @@ -6,8 +6,7 @@ #ifndef NFC_HANDLER_H_ #define NFC_HANDLER_H_ -//void ruuvi_nfc_update_sensor_data(void); - -int ruuvi_nfc_init(void); +void ruuvi_nfc_update(void); +void ruuvi_nfc_init(void); #endif /* NFC_HANDLER_H_ */ diff --git a/src/ruuvi.h b/src/ruuvi.h index 231a2ff..2b86727 100755 --- a/src/ruuvi.h +++ b/src/ruuvi.h @@ -20,25 +20,44 @@ #define RUUVI_MFG_OFFSET 2 #define RUUVI_RAWv2 0x05 #define RUUVI_ZEPHYR_PACKET 0x09 -#define RUUVI_RAWv2_LEN 23 +#define RUUVI_RAWv2_LEN 24 #define RUUVI_DSN_LENGTH_BYTES 8 #define RUUVI_DSN_LENGTH_CHAR RUUVI_DSN_LENGTH_BYTES*2 +#define RUUVI_BLE_PASSKEY 9904 -#define RUUVI_TX_POWER 0x04 +#ifdef CONFIG_BT_CTLR_TX_PWR_PLUS_4 +#define RUUVI_TX_POWER 4 +#endif +#ifdef CONFIG_BT_CTLR_TX_PWR_0 +#define RUUVI_TX_POWER 0 +#endif +#ifdef CONFIG_BT_CTLR_TX_PWR_MINUS_4 +#define RUUVI_TX_POWER -4 +#endif +#ifdef CONFIG_BT_CTLR_TX_PWR_MINUS_8 +#define RUUVI_TX_POWER -8 +#endif +#ifdef CONFIG_BT_CTLR_TX_PWR_MINUS_12 +#define RUUVI_TX_POWER -12 +#endif +#ifdef CONFIG_BT_CTLR_TX_PWR_MINUS_16 +#define RUUVI_TX_POWER -16 +#endif +#ifdef CONFIG_BT_CTLR_TX_PWR_MINUS_20 +#define RUUVI_TX_POWER -20 +#endif /* * NFC Variables */ -#define MAX_REC_COUNT 6 -#define NFC_ZEPHYR_VERSION_LEN 15 -#define NFC_NCS_VERSION_LEN 11 -#define NFC_FW_VERSION_LEN 10 -#define NFC_AD_LEN 24 -#define NFC_SERIAL_LEN 29 -#define NFC_TEMP_LEN 12 -#define NFC_HUM_LEN 19 -#define NFC_BAT_LEN 18 -#define NDEF_MSG_BUF_SIZE 160 +#define RUUVI_MAX_REC_COUNT 7 +#define RUUVI_NFC_ZEPHYR_VERSION_LEN 15 +#define RUUVI_NFC_NCS_VERSION_LEN 11 +#define RUUVI_NFC_FW_VERSION_LEN 10 +#define RUUVI_NFC_AD_LEN 24 +#define RUUVI_NFC_SERIAL_LEN 29 +#define RUUVI_NFC_DATA_LEN 150 +#define RUUVI_NDEF_MSG_BUF_SIZE 300 typedef struct mac_address_bin { diff --git a/src/ruuvi_endpoint/ruuvi_endpoint.c b/src/ruuvi_endpoint/ruuvi_endpoint.c index bec16ae..3e3c343 100644 --- a/src/ruuvi_endpoint/ruuvi_endpoint.c +++ b/src/ruuvi_endpoint/ruuvi_endpoint.c @@ -28,33 +28,7 @@ static int16_t x = 0, y= 0, z = 0, vbatt = 0; static uint16_t humidity = 0, pressure = 0, acceleration_events = 0; static int64_t battery_check = 0, time = 0; static uint32_t packet_counter = 0; -static bool tx_pwr_rx = false; -static int8_t tx_pwr = 0; - -static int get_tx_power() -{ - if(IS_ENABLED(CONFIG_BT_CTLR_TX_PWR_PLUS_4)){ - return 4; - } - else if(IS_ENABLED(CONFIG_BT_CTLR_TX_PWR_MINUS_4)){ - return -4; - } - else if(IS_ENABLED(CONFIG_BT_CTLR_TX_PWR_MINUS_8)){ - return -8; - } - else if(IS_ENABLED(CONFIG_BT_CTLR_TX_PWR_MINUS_12)){ - return -12; - } - else if(IS_ENABLED(CONFIG_BT_CTLR_TX_PWR_MINUS_16)){ - return -16; - } - else if(IS_ENABLED(CONFIG_BT_CTLR_TX_PWR_MINUS_20)){ - return -20; - } - else{ - return 0; - } -} +static int8_t tx_pwr = RUUVI_TX_POWER; /* * Adjusted from: @@ -82,13 +56,11 @@ static void ruuvi_raw_v2_encode(uint8_t *data, uint8_t offset){ vbatt <<= 5; //Shift by 5 to fit TX PWR in data[13 + offset] = (vbatt)>>8; data[14 + offset] = (vbatt)&0xFF; //Zeroes tx-pwr bits - if (!tx_pwr_rx){ - get_tx_power(); - } + int8_t tx = tx_pwr; /* Prepare TX power for packet */ - tx_pwr += 40; - tx_pwr /= 2; - data[14 + offset] |= ((uint8_t)tx_pwr)&0x1F; //5 lowest bits for TX pwr + tx += 40; + tx /= 2; + data[14 + offset] |= ((uint8_t)tx)&0x1F; //5 lowest bits for TX pwr data[15 + offset] = acceleration_events % 256; data[16 + offset] = (packet_counter>>8); data[17 + offset] = (packet_counter&0xFF); @@ -129,13 +101,11 @@ static void ruuvi_zephyr_encode(uint8_t *data, uint8_t offset){ vbatt <<= 5; //Shift by 5 to fit TX PWR in data[13 + offset] = (vbatt)>>8; data[14 + offset] = (vbatt)&0xFF; //Zeroes tx-pwr bits - if (!tx_pwr_rx){ - get_tx_power(); - } /* Prepare TX power for packet */ - tx_pwr += 40; - tx_pwr /= 2; - data[14 + offset] |= ((uint8_t)tx_pwr)&0x1F; //5 lowest bits for TX pwr + int8_t tx = tx_pwr; + tx += 40; + tx /= 2; + data[14 + offset] |= ((uint8_t)tx)&0x1F; //5 lowest bits for TX pwr data[15 + offset] = acceleration_events % 256; data[16 + offset] = (packet_counter>>8); data[17 + offset] = (packet_counter&0xFF);