650 lines
19 KiB
C
650 lines
19 KiB
C
|
|
/**
|
||
|
|
* NOTICE
|
||
|
|
*
|
||
|
|
* Copyright 2020 Tile Inc. All Rights Reserved.
|
||
|
|
* All code or other information included in the accompanying files ("Tile Source Material")
|
||
|
|
* is PROPRIETARY information of Tile Inc. ("Tile") and access and use of the Tile Source Material
|
||
|
|
* is subject to these terms. The Tile Source Material may only be used for demonstration purposes,
|
||
|
|
* and may not be otherwise distributed or made available to others, including for commercial purposes.
|
||
|
|
* Without limiting the foregoing , you understand and agree that no production use
|
||
|
|
* of the Tile Source Material is allowed without a Tile ID properly obtained under a separate
|
||
|
|
* agreement with Tile.
|
||
|
|
* You also understand and agree that Tile may terminate the limited rights granted under these terms
|
||
|
|
* at any time in its discretion.
|
||
|
|
* All Tile Source Material is provided AS-IS without warranty of any kind.
|
||
|
|
* Tile does not warrant that the Tile Source Material will be error-free or fit for your purposes.
|
||
|
|
* Tile will not be liable for any damages resulting from your use of or inability to use
|
||
|
|
* the Tile Source Material.
|
||
|
|
*
|
||
|
|
* Support: firmware_support@tile.com
|
||
|
|
*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @file tile_features.c
|
||
|
|
* @brief Support for features in Tile Lib
|
||
|
|
*/
|
||
|
|
#include "sdk_common.h"
|
||
|
|
#if NRF_MODULE_ENABLED(TILE_SUPPORT)
|
||
|
|
#include "nrf_drv_rng.h"
|
||
|
|
#include "ble.h"
|
||
|
|
#include "ble_hci.h"
|
||
|
|
#include "nrf_delay.h"
|
||
|
|
#include "app_timer.h"
|
||
|
|
#include "app_scheduler.h"
|
||
|
|
#include "app_button.h"
|
||
|
|
#include <string.h>
|
||
|
|
|
||
|
|
#include "nrf_log.h"
|
||
|
|
#include "nrf_log_ctrl.h"
|
||
|
|
|
||
|
|
// TileLib includes
|
||
|
|
#include "tile_config.h"
|
||
|
|
#include "tile_features.h"
|
||
|
|
#include "tile_lib.h"
|
||
|
|
#include "drivers/tile_gap_driver.h"
|
||
|
|
#include "drivers/tile_timer_driver.h"
|
||
|
|
#include "drivers/tile_button_driver.h"
|
||
|
|
#include "drivers/tile_random_driver.h"
|
||
|
|
#include "modules/tile_tdi_module.h"
|
||
|
|
#include "modules/tile_toa_module.h"
|
||
|
|
#include "modules/tile_tmd_module.h"
|
||
|
|
#include "modules/tile_tpi_module.h"
|
||
|
|
#include "modules/tile_tdt_module.h"
|
||
|
|
#include "modules/tile_tdg_module.h"
|
||
|
|
#include "tile_storage/tile_storage.h"
|
||
|
|
#include "tile_player/tile_player.h"
|
||
|
|
#include "tile_assert/tile_assert.h"
|
||
|
|
#include "tile_bdaddr/tile_bdaddr.h"
|
||
|
|
|
||
|
|
/*******************************************************************************
|
||
|
|
* Global variables
|
||
|
|
******************************************************************************/
|
||
|
|
tile_ble_env_t tile_ble_env;
|
||
|
|
app_timer_id_t tile_timer_id[TILE_MAX_TIMERS];
|
||
|
|
|
||
|
|
const char tile_model_number[] = TILE_MODEL_NUMBER;
|
||
|
|
const char tile_hw_version[] = TILE_HARDWARE_VERSION;
|
||
|
|
|
||
|
|
/*******************************************************************************
|
||
|
|
* Local variables
|
||
|
|
******************************************************************************/
|
||
|
|
static toa_channel_t tile_toa_channels[NUM_TOA_CHANNELS] __attribute__((section("retention_mem_area0"), zero_init));
|
||
|
|
static uint8_t toa_queue_buffer[TOA_QUEUE_BUFFER_SIZE];
|
||
|
|
|
||
|
|
/*******************************************************************************
|
||
|
|
* Forward declarations
|
||
|
|
******************************************************************************/
|
||
|
|
void advertising_update(void);
|
||
|
|
|
||
|
|
/* gap module*/
|
||
|
|
static int tile_disconnect(void);
|
||
|
|
|
||
|
|
/* timer module*/
|
||
|
|
static int tile_timer_start(uint8_t timer_id, uint32_t duration);
|
||
|
|
static int tile_timer_cancel(uint8_t timer_id);
|
||
|
|
|
||
|
|
/* random module*/
|
||
|
|
static int tile_random_bytes(uint8_t *dst, uint8_t len);
|
||
|
|
|
||
|
|
/* toa module*/
|
||
|
|
static int tile_send_toa_response(uint8_t *data, uint16_t len);
|
||
|
|
static int tile_associate(uint8_t* tile_id, uint8_t* tile_auth_key, uint8_t* authorization_type);
|
||
|
|
|
||
|
|
/* tmd module*/
|
||
|
|
static int tile_mode_set(uint8_t mode);
|
||
|
|
static int tile_mode_get(uint8_t *mode);
|
||
|
|
|
||
|
|
/* tdg module*/
|
||
|
|
static int tile_get_diagnostics_cb(void);
|
||
|
|
|
||
|
|
/* song module*/
|
||
|
|
// Refer tile_player.c
|
||
|
|
|
||
|
|
/* test module*/
|
||
|
|
static void test_process_reboot(uint8_t reboot_type);
|
||
|
|
static void test_process_storage(uint8_t test_type, uint8_t *payload, uint8_t payload_length);
|
||
|
|
static int test_process(uint8_t code, uint8_t *data, uint8_t datalen);
|
||
|
|
|
||
|
|
/* button driver */
|
||
|
|
int tile_read_button_state(uint8_t *button_state);
|
||
|
|
static void tile_hdc_cb(void);
|
||
|
|
static int tile_hdc_config_written(tdt_config_t *config);
|
||
|
|
/* TPI module */
|
||
|
|
static int tile_tileID_counter_updated(void);
|
||
|
|
|
||
|
|
/*******************************************************************************
|
||
|
|
* Defines & types
|
||
|
|
******************************************************************************/
|
||
|
|
|
||
|
|
/*******************************************************************************
|
||
|
|
* Tile configuration structures
|
||
|
|
******************************************************************************/
|
||
|
|
|
||
|
|
/* gap register struct */
|
||
|
|
static struct tile_gap_driver gap_driver =
|
||
|
|
{
|
||
|
|
.gap_disconnect = tile_disconnect,
|
||
|
|
.auth_disconnect_count = &tile_persist.unchecked.s.auth_disconnect_count,
|
||
|
|
};
|
||
|
|
|
||
|
|
/* timer driver struct */
|
||
|
|
struct tile_timer_driver timer_driver =
|
||
|
|
{
|
||
|
|
.start = tile_timer_start,
|
||
|
|
.cancel = tile_timer_cancel,
|
||
|
|
};
|
||
|
|
|
||
|
|
/* random driver struct */
|
||
|
|
static struct tile_random_driver random_driver =
|
||
|
|
{
|
||
|
|
.random_bytes = tile_random_bytes,
|
||
|
|
};
|
||
|
|
|
||
|
|
/* device information struct */
|
||
|
|
struct tile_tdi_module tdi_module =
|
||
|
|
{
|
||
|
|
.tile_id = tile_persist.checked.s.tile_id,
|
||
|
|
.model_number = tile_persist.checked.s.model_number,
|
||
|
|
.hardware_version = tile_persist.checked.s.hardware_version,
|
||
|
|
.bdaddr = bdaddr, // RAM Variable, Not stored in Flash
|
||
|
|
.firmware_version = TILE_FIRMWARE_VERSION,
|
||
|
|
};
|
||
|
|
|
||
|
|
/* tile over the air struct */
|
||
|
|
struct tile_toa_module toa_module =
|
||
|
|
{
|
||
|
|
.tile_id = tile_persist.checked.s.tile_id,
|
||
|
|
.auth_key = tile_persist.checked.s.tile_auth_key,
|
||
|
|
.channels = tile_toa_channels,
|
||
|
|
.queue = toa_queue_buffer,
|
||
|
|
.queue_size = TOA_QUEUE_BUFFER_SIZE,
|
||
|
|
.num_channels = NUM_TOA_CHANNELS,
|
||
|
|
.mic_failure_count = &tile_persist.unchecked.s.micFailures,
|
||
|
|
.auth_failure_count = &tile_persist.unchecked.s.auth_fail_count,
|
||
|
|
.channel_open_count = &tile_persist.unchecked.s.toa_channel_open_count,
|
||
|
|
.authenticate_count = &tile_persist.unchecked.s.toa_authenticate_count,
|
||
|
|
.tka_closed_channel_count = &tile_persist.unchecked.s.tka_closed_channel_count,
|
||
|
|
.send_response = tile_send_toa_response,
|
||
|
|
.associate = tile_associate
|
||
|
|
};
|
||
|
|
|
||
|
|
/* tile mode struct */
|
||
|
|
struct tile_tmd_module tmd_module =
|
||
|
|
{
|
||
|
|
.get = tile_mode_get,
|
||
|
|
.set = tile_mode_set,
|
||
|
|
};
|
||
|
|
|
||
|
|
/* tile mode struct */
|
||
|
|
static struct tile_tdg_module tdg_module =
|
||
|
|
{
|
||
|
|
.get_diagnostics = tile_get_diagnostics_cb,
|
||
|
|
};
|
||
|
|
|
||
|
|
/* tile song module struct */
|
||
|
|
static struct tile_song_module song_module =
|
||
|
|
{
|
||
|
|
.play = PlaySong,
|
||
|
|
.stop = StopSong
|
||
|
|
};
|
||
|
|
|
||
|
|
/* tile test module struct */
|
||
|
|
static struct tile_test_module test_module =
|
||
|
|
{
|
||
|
|
.process = test_process,
|
||
|
|
};
|
||
|
|
|
||
|
|
/* tile button driver struct */
|
||
|
|
static struct tile_button_driver button_driver =
|
||
|
|
{
|
||
|
|
.read_state = tile_read_button_state,
|
||
|
|
};
|
||
|
|
|
||
|
|
struct tile_tpi_module tpi_module =
|
||
|
|
{
|
||
|
|
.tileID_key = tile_persist.checked.s.tileIDkey,
|
||
|
|
.hashed_tileID = tile_env.hashedTileID,
|
||
|
|
.tileID_counter = &tile_persist.unchecked.s.tileIDcounter,
|
||
|
|
.tileID_counter_updated = tile_tileID_counter_updated,
|
||
|
|
};
|
||
|
|
|
||
|
|
/* tile double tap struct */
|
||
|
|
struct tile_tdt_module tdt_module =
|
||
|
|
{
|
||
|
|
.hdc_status = TDT_HDC_STATUS_NORMAL,
|
||
|
|
.single_tap = NULL,
|
||
|
|
.long_tap = NULL,
|
||
|
|
.double_tap_detect = NULL,
|
||
|
|
.double_tap_notify = NULL,
|
||
|
|
.double_tap_failure2 = NULL,
|
||
|
|
|
||
|
|
.hdc_cb = tile_hdc_cb,
|
||
|
|
.config_written = tile_hdc_config_written,
|
||
|
|
};
|
||
|
|
/*******************************************************************************
|
||
|
|
* Functions
|
||
|
|
******************************************************************************/
|
||
|
|
void tile_features_init(void)
|
||
|
|
{
|
||
|
|
/****************************************************************/
|
||
|
|
/**** Minimum Features required for TileLib Interoperability ****/
|
||
|
|
/****************************************************************/
|
||
|
|
/* Initialize GAP driver */
|
||
|
|
(void) tile_gap_register(&gap_driver);
|
||
|
|
|
||
|
|
/* Initialize timer driver */
|
||
|
|
(void) tile_timer_register(&timer_driver);
|
||
|
|
|
||
|
|
/* Initialize random driver */
|
||
|
|
(void) tile_random_register(&random_driver);
|
||
|
|
|
||
|
|
/* Initialize device information module */
|
||
|
|
/* Obtain default Bdaddr from device register at 0x100000A4*/
|
||
|
|
get_default_macAddr();
|
||
|
|
set_new_macAddr();
|
||
|
|
(void) tile_tdi_register(&tdi_module);
|
||
|
|
|
||
|
|
/* Initialize tile over the air module */
|
||
|
|
(void) tile_toa_register(&toa_module);
|
||
|
|
|
||
|
|
/* Initialize tile mode module */
|
||
|
|
(void) tile_tmd_register(&tmd_module);
|
||
|
|
|
||
|
|
/* Initialize button driver module */
|
||
|
|
(void) tile_button_register(&button_driver);
|
||
|
|
|
||
|
|
/* Initialize tile PrivateID module */
|
||
|
|
(void) tile_tpi_register(&tpi_module);
|
||
|
|
|
||
|
|
/* Initialize tile double tap module */
|
||
|
|
memcpy(&tdt_module.config, &tile_checked->tdt_configuration, sizeof(tdt_config_t));
|
||
|
|
|
||
|
|
(void) tile_tdt_register(&tdt_module);
|
||
|
|
|
||
|
|
/****************************************************************/
|
||
|
|
/**** Additional Features ****/
|
||
|
|
/****************************************************************/
|
||
|
|
/* Initialize tile diagnbostics module */
|
||
|
|
(void) tile_tdg_register(&tdg_module);
|
||
|
|
|
||
|
|
/* Initialize song module */
|
||
|
|
(void) tile_song_register(&song_module);
|
||
|
|
|
||
|
|
/* Initialize test module */
|
||
|
|
(void) tile_test_register(&test_module);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
/*******************************************************************************
|
||
|
|
* Callback functions for Tile Lib
|
||
|
|
******************************************************************************/
|
||
|
|
|
||
|
|
/***************************** gap module *******************************/
|
||
|
|
/**
|
||
|
|
* @brief Disconnect current connection
|
||
|
|
*/
|
||
|
|
static int tile_disconnect(void)
|
||
|
|
{
|
||
|
|
if(BLE_CONN_HANDLE_INVALID == tile_ble_env.conn_handle)
|
||
|
|
{
|
||
|
|
return TILE_ERROR_ILLEGAL_OPERATION;
|
||
|
|
}
|
||
|
|
|
||
|
|
(void) sd_ble_gap_disconnect(tile_ble_env.conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
|
||
|
|
|
||
|
|
return TILE_ERROR_SUCCESS;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Update the TileID Char
|
||
|
|
*/
|
||
|
|
void tile_update_tileID_char(void)
|
||
|
|
{
|
||
|
|
ret_code_t err_code;
|
||
|
|
ble_gatts_value_t gatts_value;
|
||
|
|
|
||
|
|
// Initialize value struct.
|
||
|
|
memset(&gatts_value, 0, sizeof(gatts_value));
|
||
|
|
|
||
|
|
gatts_value.len = TILE_ID_LEN;
|
||
|
|
gatts_value.offset = 0;
|
||
|
|
gatts_value.p_value = tile_persist.checked.s.tile_id;
|
||
|
|
|
||
|
|
// Update database
|
||
|
|
err_code = sd_ble_gatts_value_set(tile_ble_env.conn_handle, tile_ble_env.service.characteristic_handles[TILE_ID_CHAR], &gatts_value);
|
||
|
|
APP_ERROR_CHECK(err_code);
|
||
|
|
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/************************************************************************/
|
||
|
|
|
||
|
|
/***************************** timer module *****************************/
|
||
|
|
/**
|
||
|
|
* @brief Start a Tile timer
|
||
|
|
*
|
||
|
|
* @param[in] timer_id ID for timer, as specified by Tile Lib
|
||
|
|
* @param[in] duration Duration (in 10ms increments) for the timer
|
||
|
|
*/
|
||
|
|
static int tile_timer_start(uint8_t timer_id, uint32_t duration)
|
||
|
|
{
|
||
|
|
ret_code_t err_code;
|
||
|
|
if(duration < 1)
|
||
|
|
{
|
||
|
|
duration++;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* The new timer takes priority, so stop any existing timer */
|
||
|
|
err_code = app_timer_stop(tile_timer_id[timer_id]);
|
||
|
|
APP_ERROR_CHECK(err_code);
|
||
|
|
|
||
|
|
err_code = app_timer_start(tile_timer_id[timer_id], APP_TIMER_TICKS((uint64_t) duration * 10), (void *)(uint32_t)timer_id);
|
||
|
|
APP_ERROR_CHECK(err_code);
|
||
|
|
|
||
|
|
return TILE_ERROR_SUCCESS;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Cancel a Tile timer
|
||
|
|
*
|
||
|
|
* @param[in] timer_id ID for timer, as specified by Tile Lib
|
||
|
|
*/
|
||
|
|
static int tile_timer_cancel(uint8_t timer_id)
|
||
|
|
{
|
||
|
|
uint32_t err_code = app_timer_stop(tile_timer_id[timer_id]);
|
||
|
|
|
||
|
|
err_code = (err_code == NRF_SUCCESS) ? TILE_ERROR_SUCCESS : err_code;
|
||
|
|
|
||
|
|
return (int) err_code;
|
||
|
|
}
|
||
|
|
/************************************************************************/
|
||
|
|
|
||
|
|
/****************************random module *******************************/
|
||
|
|
/**
|
||
|
|
* @brief Generate some random bytes
|
||
|
|
*
|
||
|
|
* @param[out] dst Destination address for the random bytes
|
||
|
|
* @param[in] len Number of bytes requested
|
||
|
|
*/
|
||
|
|
static int tile_random_bytes(uint8_t *dst, uint8_t len)
|
||
|
|
{
|
||
|
|
uint8_t num;
|
||
|
|
uint32_t err_code;
|
||
|
|
|
||
|
|
/* Check if enough random bytes are available */
|
||
|
|
nrf_drv_rng_bytes_available(&num);
|
||
|
|
while(num < len)
|
||
|
|
{
|
||
|
|
/* Wait for enough random bytes to be available */
|
||
|
|
nrf_delay_us(200);
|
||
|
|
nrf_drv_rng_bytes_available(&num);
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Copy over random bytes */
|
||
|
|
err_code = nrf_drv_rng_rand(dst, len);
|
||
|
|
|
||
|
|
err_code = (err_code == NRF_SUCCESS) ? TILE_ERROR_SUCCESS : err_code;
|
||
|
|
|
||
|
|
return (int) err_code;
|
||
|
|
}
|
||
|
|
|
||
|
|
/************************************************************************/
|
||
|
|
|
||
|
|
/***************************** tpi module *******************************/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Update TileID counter for TPI generation
|
||
|
|
*
|
||
|
|
* @param[out] int TILE_ERROR_TYPE
|
||
|
|
*/
|
||
|
|
|
||
|
|
static int tile_tileID_counter_updated(void)
|
||
|
|
{
|
||
|
|
if((BLE_CONN_HANDLE_INVALID == tile_ble_env.conn_handle))
|
||
|
|
{
|
||
|
|
advertising_update();
|
||
|
|
}
|
||
|
|
return TILE_ERROR_SUCCESS;
|
||
|
|
}
|
||
|
|
|
||
|
|
/************************************************************************/
|
||
|
|
|
||
|
|
/***************************** toa module *******************************/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Send notification on a characteristic in TOA_RSP
|
||
|
|
*
|
||
|
|
* @param[in] data Data to set attribute to.
|
||
|
|
* @param[in] len Length of data.
|
||
|
|
*/
|
||
|
|
static int tile_send_toa_response(uint8_t *data, uint16_t len)
|
||
|
|
{
|
||
|
|
ret_code_t err_code;
|
||
|
|
|
||
|
|
if(BLE_CONN_HANDLE_INVALID == tile_ble_env.conn_handle)
|
||
|
|
{
|
||
|
|
return TILE_ERROR_ILLEGAL_OPERATION;
|
||
|
|
}
|
||
|
|
uint16_t handle = tile_ble_env.service.characteristic_handles[TILE_TOA_RSP_CHAR];
|
||
|
|
|
||
|
|
ble_gatts_hvx_params_t hvx_params =
|
||
|
|
{
|
||
|
|
.handle = handle,
|
||
|
|
.type = BLE_GATT_HVX_NOTIFICATION,
|
||
|
|
.offset = 0,
|
||
|
|
.p_len = &len,
|
||
|
|
.p_data = data
|
||
|
|
};
|
||
|
|
|
||
|
|
err_code = sd_ble_gatts_hvx(tile_ble_env.conn_handle, &hvx_params);
|
||
|
|
APP_ERROR_CHECK(err_code);
|
||
|
|
return TILE_ERROR_SUCCESS;
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Set the new Tile Id/Auth Key during Commissioning Process if in Shipping Modes
|
||
|
|
*/
|
||
|
|
static int tile_associate(uint8_t* tile_id, uint8_t* tile_auth_key, uint8_t* authorization_type)
|
||
|
|
{
|
||
|
|
int retcode = TOA_ERROR_OK;
|
||
|
|
#ifdef INTERIM_TILE_ID
|
||
|
|
if(TILE_MODE_SHIPPING == tile_checked->mode)
|
||
|
|
{
|
||
|
|
memcpy(tile_checked->tile_id, tile_id, sizeof(tile_checked->tile_id));
|
||
|
|
memcpy(tile_checked->tile_auth_key, tile_auth_key, sizeof(tile_checked->tile_auth_key));
|
||
|
|
// Update the TileID Char
|
||
|
|
tile_update_tileID_char();
|
||
|
|
NRF_LOG_INFO("tile_associate in Shipping Mode Successful\r\n");
|
||
|
|
}
|
||
|
|
else // Do not allow to set new Tile id/Auth key for an already Activated Tile. We should never come here ideally
|
||
|
|
{
|
||
|
|
retcode = TOA_RSP_SERVICE_UNAVAILABLE;
|
||
|
|
NRF_LOG_INFO("tile_associate in Activated Mode Not Allowed, returning TOA_RSP_SERVICE_UNAVAILABLE \r\n");
|
||
|
|
}
|
||
|
|
return retcode;
|
||
|
|
#else
|
||
|
|
return retcode;
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
/************************************************************************/
|
||
|
|
|
||
|
|
/***************************** mode module *******************************/
|
||
|
|
/**
|
||
|
|
* @brief Set the mode of the device.
|
||
|
|
*
|
||
|
|
* @param[in] mode Mode, as specified by the TMD module.
|
||
|
|
*/
|
||
|
|
static int tile_mode_set(uint8_t mode)
|
||
|
|
{
|
||
|
|
if(TILE_MODE_ACTIVATED != mode)
|
||
|
|
{
|
||
|
|
/* Disregard any mode besides Shipping and Activated
|
||
|
|
* If mode being set is not Activated, Make it Shipping
|
||
|
|
*/
|
||
|
|
mode = TILE_MODE_SHIPPING;
|
||
|
|
/* When the Tile is not activated, the Interim TileID, Key is used. */
|
||
|
|
memcpy(tile_checked->tile_id, interim_tile_id, 8);
|
||
|
|
memcpy(tile_checked->tile_auth_key, interim_tile_key, 16);
|
||
|
|
// Update the TileID Char
|
||
|
|
tile_update_tileID_char();
|
||
|
|
}
|
||
|
|
tile_checked->mode = mode;
|
||
|
|
set_new_macAddr();
|
||
|
|
// tile_set_params_for_mode();
|
||
|
|
tile_store_app_data();
|
||
|
|
return TILE_ERROR_SUCCESS;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @brief Get the current mode of the device.
|
||
|
|
*
|
||
|
|
* @param[out] mode Mode, as specified by the TMD module.
|
||
|
|
*/
|
||
|
|
static int tile_mode_get(uint8_t *mode)
|
||
|
|
{
|
||
|
|
*mode = tile_checked->mode;
|
||
|
|
|
||
|
|
return TILE_ERROR_SUCCESS;
|
||
|
|
}
|
||
|
|
|
||
|
|
/************************************************************************/
|
||
|
|
|
||
|
|
/***************************** tdg module *******************************/
|
||
|
|
static int tile_get_diagnostics_cb(void)
|
||
|
|
{
|
||
|
|
uint8_t version = DIAGNOSTIC_VERSION;
|
||
|
|
|
||
|
|
(void) tdg_add_data(&version, 1);
|
||
|
|
(void) tdg_add_data(&tile_checked->mode, 1);
|
||
|
|
(void) tdg_add_data(&tile_unchecked->reset_count, 1);
|
||
|
|
(void) tdg_add_data(&tile_unchecked->piezoMs, 4);
|
||
|
|
(void) tdg_add_data(&tile_unchecked->connection_count, 3);
|
||
|
|
(void) tdg_add_data(&tile_unchecked->auth_fail_count, 1);
|
||
|
|
(void) tdg_add_data(&tile_unchecked->micFailures, 1);
|
||
|
|
(void) tdg_add_data(&tile_unchecked->disconnect_count, 3);
|
||
|
|
(void) tdg_add_data(&tile_unchecked->toa_channel_open_count, 3);
|
||
|
|
(void) tdg_add_data(&tile_unchecked->toa_authenticate_count, 3);
|
||
|
|
(void) tdg_add_data(&tile_unchecked->tka_closed_channel_count, 2);
|
||
|
|
(void) tdg_add_data(&tile_unchecked->auth_disconnect_count, 2);
|
||
|
|
|
||
|
|
(void) tdg_finish();
|
||
|
|
|
||
|
|
return TILE_ERROR_SUCCESS;
|
||
|
|
}
|
||
|
|
/************************************************************************/
|
||
|
|
|
||
|
|
/***************************** song module ******************************/
|
||
|
|
// Refer tile_player.c
|
||
|
|
/************************************************************************/
|
||
|
|
|
||
|
|
void tile_button_was_pressed(void)
|
||
|
|
{
|
||
|
|
/* Abort SONG if Find Song is currently playing*/
|
||
|
|
if (CheckFindSong())
|
||
|
|
{
|
||
|
|
(void) StopSong();
|
||
|
|
}
|
||
|
|
|
||
|
|
if(TILE_MODE_ACTIVATED == tile_checked->mode)
|
||
|
|
{
|
||
|
|
// Forward to TileLib
|
||
|
|
(void) tile_button_pressed();
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
/* Play the right Song according to Mode */
|
||
|
|
if(TILE_MODE_SHIPPING == tile_checked->mode)
|
||
|
|
{
|
||
|
|
(void) PlaySong(TILE_SONG_WAKEUP_PART, 3, TILE_SONG_DURATION_ONCE);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
int tile_read_button_state(uint8_t *button_state)
|
||
|
|
{
|
||
|
|
bool is_button_pushed = app_button_is_pushed(0);
|
||
|
|
|
||
|
|
|
||
|
|
/* pin is pulled high */
|
||
|
|
if(true == is_button_pushed)
|
||
|
|
{
|
||
|
|
*button_state = TILE_BUTTON_PRESSED;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
*button_state = TILE_BUTTON_RELEASED;
|
||
|
|
}
|
||
|
|
|
||
|
|
return TILE_ERROR_SUCCESS;
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
void tile_hdc_cb(void)
|
||
|
|
{
|
||
|
|
/* Currently Disconnected, Update Advertising Data and Parameters based on the TDT State */
|
||
|
|
if(BLE_CONN_HANDLE_INVALID == tile_ble_env.conn_handle)
|
||
|
|
{
|
||
|
|
advertising_update();
|
||
|
|
}
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
int tile_hdc_config_written(tdt_config_t *config)
|
||
|
|
{
|
||
|
|
return TILE_ERROR_SUCCESS;
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
/***************************** test module ******************************/
|
||
|
|
|
||
|
|
static int test_process(uint8_t code, uint8_t *data, uint8_t datalen)
|
||
|
|
{
|
||
|
|
switch(code) {
|
||
|
|
case TEST_CMD_REBOOT:
|
||
|
|
test_process_reboot(data[0]);
|
||
|
|
break;
|
||
|
|
case TEST_CMD_STORAGE:
|
||
|
|
test_process_storage(data[0], data+1, datalen-1);
|
||
|
|
break;
|
||
|
|
default:
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
return TILE_ERROR_SUCCESS;
|
||
|
|
}
|
||
|
|
|
||
|
|
static void test_process_reboot(uint8_t reboot_type)
|
||
|
|
{
|
||
|
|
switch(reboot_type) {
|
||
|
|
case TEST_CMD_REBOOT_RESET:
|
||
|
|
(void) sd_nvic_SystemReset();
|
||
|
|
break;
|
||
|
|
case TEST_CMD_REBOOT_WATCHDOG:
|
||
|
|
while(1);
|
||
|
|
//break;
|
||
|
|
case TEST_CMD_REBOOT_MEMORY_FAULT:
|
||
|
|
*((uint8_t*)0xFFFFFFFF) = 0;
|
||
|
|
break;
|
||
|
|
case TEST_CMD_REBOOT_OTHER:
|
||
|
|
/* ? */
|
||
|
|
break;
|
||
|
|
case TEST_CMD_REBOOT_ASSERT:
|
||
|
|
TILE_ASSERT(0);
|
||
|
|
/* TODO */
|
||
|
|
break;
|
||
|
|
case TEST_CMD_REBOOT_DURING_FLASH:
|
||
|
|
/* TODO */
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
static void test_process_storage(uint8_t test_type, uint8_t *payload, uint8_t payload_length)
|
||
|
|
{
|
||
|
|
/* TODO */
|
||
|
|
}
|
||
|
|
/************************************************************************/
|
||
|
|
|
||
|
|
#endif // NRF_MODULE_ENABLED(TILE_SUPPORT)
|