This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Nordic Thingy:52 Simple thingy models

I had manged to deploy and configure mesh networks on Nordic Thingy devices based on these 2 examples separately.
1. Generic OnOff models
https://github.com/NordicPlayground/thingy52-mesh-provisioning-demo
(based on nRF Mesh SDK 3.2.0 and nRF5 SDK v 15.3)

2. Simple Thingy models
https://github.com/NordicPlayground/Nordic-Thingy52-mesh-demo
(based on nRF Mesh SDK 1.0.1 and nRF5 SDK v15.3

I would like to include the Simple Thingy models with the OnOff Generic models.
I managed to add the Simple Thingy models into the first example to perform the following:
1. Use simple_thingy_client to set on/off LED on simple_thingy_server.
2. Use simple_thingy_client to set sensor configuration to report sensor readings every 1s. The humidity and temperature readings are retrieved and printed in debug window of simple_thingy_server.

However, I noted that the led status and sensor status messages are not received at the simple_thingy_client.
(The status messages are received for app_generic_onoff_client_status_cb.)
I wonder if there is anything missing for the implementation of the Simple Thingy models or my code:
https://github.com/NordicPlayground/Nordic-Thingy52-mesh-demo/tree/master/simple_thingy

Code snippets for my implementation of simple_thingy_server:

simple_thingy_server_t m_server2;

static ble_uis_led_t led_get_cb()
{
    return m_server2.present_led_status;
    __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "get led status\r\n");
}

static ble_uis_led_t led_set_cb(const simple_thingy_server_t * server, ble_uis_led_t led_config)
{
    __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "set led status\r\n");
    uint32_t status = publish_led_state(&m_server2, led_config); //ADDED
    __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "publish_led_state: %d\r\n", status);
    thingy_led_set(&m_server2, led_config);
    return led_config;
}

static void sensor_set_cb(const simple_thingy_server_t * server, sensor_config_t sensor_cfg)
{
    __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "set sensor status, cfg = %x\r\n", sensor_cfg.report_timer);
    
    switch(sensor_cfg.report_timer)
    {
        case SENSOR_REPORT_NONE:
            app_timer_stop(m_sensor_timer_id);
            break;
        case SENSOR_REPORT_EVERY_1S:
            app_timer_stop(m_sensor_timer_id);
            app_timer_start(m_sensor_timer_id, APP_TIMER_TICKS(1000), NULL);
            break;
        case SENSOR_REPORT_EVERY_5S:
            app_timer_stop(m_sensor_timer_id);
            app_timer_start(m_sensor_timer_id, APP_TIMER_TICKS(5000), NULL);
            break;
        case SENSOR_REPORT_EVERY_10S:
            app_timer_stop(m_sensor_timer_id);
            app_timer_start(m_sensor_timer_id, APP_TIMER_TICKS(10000), NULL);
            break;
        case SENSOR_REPORT_MANUAL:
            app_timer_stop(m_sensor_timer_id);
            sensor_timer_handler();
            break;
        
        default:
        
        break;
    
    }

}

Inside app_model_init():

m_server2.led_get_cb = led_get_cb;
m_server2.led_set_cb = led_set_cb;
m_server2.sensor_set_cb = sensor_set_cb;
ERROR_CHECK(simple_thingy_server_init(&m_server2, APP_ONOFF_ELEMENT_INDEX));
ERROR_CHECK(access_model_subscription_list_alloc(m_server2.model_handle));
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Server2 Model Handle: %d\n", m_server2.model_handle);


static void sensor_timer_handler()
{
    //__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "sensor log start\r\n");
    drv_humidity_sample();
    float humidity = drv_humidity_get();
    float temperature = drv_humidity_temp_get();
    sensor_reading_t sensor_data = {
        .humidity = humidity,
        .temperature = temperature
    };
    __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Humidity:" NRF_LOG_FLOAT_MARKER "\t Temperature:" NRF_LOG_FLOAT_MARKER "\r\n", NRF_LOG_FLOAT(humidity), NRF_LOG_FLOAT(temperature));
    simple_thingy_sensor_report(&m_server2, sensor_data);
}

Code snippets for my implementation of simple_thingy_client:

simple_thingy_client_t m_client2;

static void led_status_cb(const simple_thingy_client_t * p_self, ble_uis_led_t status, uint16_t src)
{
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Led status received!");
}

static void sensor_status_cb(const simple_thingy_client_t * p_self, sensor_reading_t status, uint16_t src)
{
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Sensor status received!");
}

Inside models_init_cb():

m_client2.led_status_cb = led_status_cb;
m_client2.sensor_status_cb = sensor_status_cb;
ERROR_CHECK(simple_thingy_client_init(&m_client2, APP_ONOFF_ELEMENT_INDEX+1));
ERROR_CHECK(access_model_subscription_list_alloc(m_client2.model_handle));
__LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Client2 Model Handle: %d\n", m_client2.model_handle);


Inside button_event_handler():

sensor_config_t sensor_config;
sensor_config.report_timer = SENSOR_REPORT_EVERY_1S;
ERROR_CHECK(simple_thingy_client_sensor_set(&m_client2, sensor_config));

Any insights would be greatly appreciated! Thank you!

Related