in provisioning_client/src/prov_device_ll_client.c [1085:1210]
void Prov_Device_LL_DoWork(PROV_DEVICE_LL_HANDLE handle)
{
if (handle != NULL)
{
PROV_INSTANCE_INFO* prov_info = (PROV_INSTANCE_INFO*)handle;
if (prov_info->prov_state != CLIENT_STATE_ERROR)
{
prov_info->prov_transport_protocol->prov_transport_dowork(prov_info->transport_handle);
}
if (prov_info->is_connected || prov_info->prov_state == CLIENT_STATE_ERROR)
{
tickcounter_ms_t current_time = 0;
switch (prov_info->prov_state)
{
case CLIENT_STATE_REGISTER_SEND:
if (tickcounter_get_current_ms(prov_info->tick_counter, ¤t_time) != 0)
{
LogError("Failure getting the current time");
prov_info->error_reason = PROV_DEVICE_RESULT_ERROR;
prov_info->prov_state = CLIENT_STATE_ERROR;
}
else
{
if ((current_time - prov_info->last_send_time_ms) > prov_info->retry_after_ms)
{
if (prov_info->prov_transport_protocol->prov_transport_register(prov_info->transport_handle, prov_transport_process_json_reply, prov_transport_create_json_payload, prov_info) != 0)
{
LogError("Failure registering device");
if (prov_info->error_reason == PROV_DEVICE_RESULT_OK)
{
prov_info->error_reason = PROV_DEVICE_RESULT_TRANSPORT;
}
prov_info->prov_state = CLIENT_STATE_ERROR;
}
else
{
(void)tickcounter_get_current_ms(prov_info->tick_counter, &prov_info->timeout_value);
prov_info->prov_state = CLIENT_STATE_REGISTER_SENT;
}
prov_info->last_send_time_ms = current_time;
}
}
break;
case CLIENT_STATE_STATUS_SEND:
{
if (tickcounter_get_current_ms(prov_info->tick_counter, ¤t_time) != 0)
{
LogError("Failure getting the current time");
prov_info->error_reason = PROV_DEVICE_RESULT_ERROR;
prov_info->prov_state = CLIENT_STATE_ERROR;
}
else
{
if ((current_time - prov_info->last_send_time_ms) > prov_info->retry_after_ms)
{
if (prov_info->prov_transport_protocol->prov_transport_get_op_status(prov_info->transport_handle) != 0)
{
LogError("Failure sending operation status");
if (prov_info->error_reason == PROV_DEVICE_RESULT_OK)
{
prov_info->error_reason = PROV_DEVICE_RESULT_TRANSPORT;
}
prov_info->prov_state = CLIENT_STATE_ERROR;
}
else
{
prov_info->prov_state = CLIENT_STATE_STATUS_SENT;
if (tickcounter_get_current_ms(prov_info->tick_counter, &prov_info->timeout_value) != 0)
{
LogError("Failure getting the current time");
prov_info->error_reason = PROV_DEVICE_RESULT_ERROR;
prov_info->prov_state = CLIENT_STATE_ERROR;
}
}
prov_info->last_send_time_ms = current_time;
}
}
break;
}
case CLIENT_STATE_REGISTER_SENT:
case CLIENT_STATE_STATUS_SENT:
{
if (prov_info->prov_timeout > 0)
{
(void)tickcounter_get_current_ms(prov_info->tick_counter, ¤t_time);
if ((current_time - prov_info->timeout_value) / 1000 > prov_info->prov_timeout)
{
LogError("Timeout waiting for reply");
prov_info->error_reason = PROV_DEVICE_RESULT_TIMEOUT;
prov_info->prov_state = CLIENT_STATE_ERROR;
}
}
break;
}
case CLIENT_STATE_READY:
break;
case CLIENT_STATE_ERROR:
default:
prov_info->register_callback(prov_info->error_reason, NULL, NULL, prov_info->user_context);
prov_info->prov_state = CLIENT_STATE_READY;
cleanup_prov_info(prov_info);
break;
}
}
else
{
// Check the connection
if ((prov_info->prov_state != CLIENT_STATE_READY) && (prov_info->prov_timeout > 0))
{
tickcounter_ms_t current_time = 0;
(void)tickcounter_get_current_ms(prov_info->tick_counter, ¤t_time);
if ((current_time - prov_info->timeout_value) / 1000 > prov_info->prov_timeout)
{
LogError("Timed out connecting to provisioning service");
prov_info->error_reason = PROV_DEVICE_RESULT_TIMEOUT;
prov_info->prov_state = CLIENT_STATE_ERROR;
}
}
}
}
}