void Prov_Device_LL_DoWork()

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, &current_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, &current_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, &current_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, &current_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;
                }
            }
        }
    }
}