I thought I would be able to do the following, but when FDS_ERR_NO_SPACE_IN_QUEUES occurs m_fds_no_space_in_queue never becomes false. Is there any way I can wait for space in the FDS queue or do I have to handle it asynchronously?
static bool volatile m_fds_no_space_in_queue = false; static void fds_evt_handler(fds_evt_t const * p_evt) { #if FDS_EVENT_LOGGING NRF_LOG_INFO("Event: %s received (%s)", fds_evt_str[p_evt->id], fds_err_str[p_evt->result]); #endif m_fds_no_space_in_queue = false; // other event handling removed } void write_something() { ret_code_t err_code; // some code ommitted here err_code = FDS_SUCCESS + 1; while(err_code != FDS_SUCCESS) { NRF_LOG_DEBUG("Creating record"); err_code = fds_record_write(&m_blister_fds_descriptors[cell], &new_record); switch(err_code) { case FDS_SUCCESS: NRF_LOG_INFO("Cell state storing..."); break; case FDS_ERR_NOT_INITIALIZED: APP_ERROR_CHECK(NRF_ERROR_MODULE_NOT_INITIALIZED); err_code = FDS_SUCCESS; break; case FDS_ERR_NULL_ARG: // shouldn't happen since we set it above err_code = FDS_SUCCESS; break; case FDS_ERR_INVALID_ARG: // shouldn't happen since file id is fixed and record key is within a fixed range err_code = FDS_SUCCESS; break; case FDS_ERR_UNALIGNED_ADDR: // shouldn't happen since we compute length to be aligned to 4 byte words err_code = FDS_SUCCESS; break; case FDS_ERR_RECORD_TOO_LARGE: // shouldn't happen since record is fixed size err_code = FDS_SUCCESS; break; case FDS_ERR_NO_SPACE_IN_QUEUES: // probably will happen. Wait for an operation to complete and try again m_fds_no_space_in_queue = true; while(m_fds_no_space_in_queue) { nrf_pwr_mgmt_run(); } break; case FDS_ERR_NO_SPACE_IN_FLASH: // will happen after some time while(1) { err_code = fds_gc(); if(err_code == FDS_ERR_NO_SPACE_IN_QUEUES) { m_fds_no_space_in_queue = true; while(m_fds_no_space_in_queue) { nrf_pwr_mgmt_run(); } } else { m_fds_gc_in_progress = true; while(m_fds_gc_in_progress) { nrf_pwr_mgmt_run(); } // retry write now err_code = FDS_SUCCESS + 1; break; } } break; default: // unknown error err_code = FDS_SUCCESS; break; } }