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

How to do pstorage store after advertising

Hello,

I try to perform an pstorage store action after I'm done advertising just beform the devices goes in system OFF mode. Pstorage works fine before I start advertising but when I have started advertising the pstorage store doesn't get it's callback anymore.

Now I read in a couple of questions you can't perform a store action on a advertising event because the callback will not be received.

My question is how or where can I do a store action when the devices goes into IDLE mode/stops advertising. I tried triggering it on a timer, putting it in the scheduler I'm kind of out of options.

Parents
  • Thank you for your answer! I checked and my device isn't advertising when I try to do the pstorage update just before system goes in system_off mode. Because this is triggered when device is in IDLE and not advertising. On start-up before advertising is started the pstorage update works fine but after it doesn't.

    And I don't get why it is not getting the callback.

    This is my code:

    Init Function:

    void livit_pstorage_init(void)
    {
    uint32_t               err_code;
    
    pstorage_module_param_t param;
    param.block_size  = BLOCKS;
    param.block_count = 1;
    param.cb          = livit_pstorage_cb_handler;
    
    err_code = pstorage_init();
    APP_ERROR_CHECK(err_code);
    err_code = pstorage_register(&param, &base_handle);
    APP_ERROR_CHECK(err_code);	
    }
    

    Handler:

    static void livit_pstorage_cb_handler(pstorage_handle_t * p_handle,
                                   uint8_t             op_code,
                                   uint32_t            result,
                                   uint8_t           * p_data,
                                   uint32_t            data_len)
    {
    pstorage_flag = 0;
    }
    

    Update Function:

    void livit_pstorage_update(void)
    {
    pstorage_handle_t       block_handle;
    uint8_t 								index;
    uint32_t               	err_code;
    uint16_t								i = 0;
    uint8_t									k = 0;
    
    __align(4) uint8_t 		  pstorage_data[BLOCKS];
    
    pstorage_data[i++] = m_first_boot;
    
    pstorage_data[i++] = m_config.toggle_settings;
    pstorage_data[i++] = m_config.step_ths;
    pstorage_data[i++] = m_config.step_debounce;
    pstorage_data[i++] = m_config.wear_time_ths;
    pstorage_data[i++] = m_config.amount_sync_days;
    pstorage_data[i++] = m_config.amount_of_filled_entries;
        ....... (deleded some code for better overview)
    
    index = 0; //we will write to the second block
    err_code = pstorage_block_identifier_get(&base_handle, index,&block_handle);
    APP_ERROR_CHECK(err_code);
    
    err_code = pstorage_store(&block_handle, pstorage_data, BLOCKS,0);
    APP_ERROR_CHECK(err_code);
    
    }
    

    Waiting for callback:

    void pstorage_write_alldata(void)
    {	
    pstorage_flag = 1;	
    livit_pstorage_update(); //Note if you use livit_pstorage_update, you don't have to erase before storing
    
    while(pstorage_flag) 
    { 
    	power_manage();
    }   
    }
    

    SOLUTION: Call the write function in the main by checking the advertising status.

  • This should not have happened, getting BLE_ADV_EVT_IDLE means that advertising event has ended. But as many threads here mentioned that calling this way from other interrupt priority might mess up with pstorage.It is best the way you are doing now.

Reply Children
No Data
Related