Загрузка данных


#include "srtm_camera_client.h"
#include "srtm_heap.h"
#include "srtm_dispatcher.h"
#include "srtm_message.h"
#include "srtm_service_struct.h"
#include "fsl_debug_console.h"
#include <assert.h>

/* Internal client service structure */
typedef struct _srtm_camera_client
{
    struct _srtm_service service;
} *srtm_camera_client_t;

/* Forward declarations of required SRTM lifecycle functions */
static srtm_status_t SRTM_CameraClient_Request(srtm_service_t service, srtm_request_t request);
static srtm_status_t SRTM_CameraClient_Notify(srtm_service_t service, srtm_notification_t notif);

/**
 * @brief Handles responses (ACKs) sent back from Linux (A55) after a command is processed
 */
static srtm_status_t SRTM_CameraClient_ResponseHandler(srtm_dispatcher_t dispatcher,
                                                       srtm_peercore_t peer,
                                                       srtm_packet_t packet,
                                                       void *userParam)
{
    struct _srtm_camera_payload *camResp;
    uint8_t command;

    command = SRTM_CommMessage_GetCommand((srtm_response_t)packet);
    camResp = (struct _srtm_camera_payload *)(void *)SRTM_CommMessage_GetPayload((srtm_response_t)packet);
    
    assert(camResp);

    /* Log the execution result received from Linux */
    if (camResp->retCode == SRTM_CAMERA_RETURN_CODE_SUCCESS)
    {
        PRINTF("[SRTM Camera Client] Linux successfully executed command %d for cameraID %d\r\n", 
               command, camResp->cameraID);
    }
    else
    {
        PRINTF("[SRTM Camera Client] Linux FAILED command %d for cameraID %d (Error code: %d)\r\n", 
               command, camResp->cameraID, camResp->retCode);
    }

    return SRTM_Status_Success;
}

/**
 * @brief Helper function to construct and deliver an SRTM request packet to Linux
 */
static srtm_status_t SRTM_CameraClient_SendCmd(srtm_service_t service, srtm_peercore_t core, uint8_t cmd, uint8_t cameraID)
{
    srtm_channel_t channel;
    srtm_request_t request;
    struct _srtm_camera_payload *camReq;

    assert(service);
    assert(service->dispatcher);

    if (!core || !SRTM_PeerCore_IsConnected(core))
    {
        PRINTF("[SRTM Camera Client] Error: Linux peer core is not connected yet!\r\n");
        return SRTM_Status_InvalidParameter;
    }

    /* Get the communication channel associated with this peer core */
    channel = SRTM_PeerCore_GetChannel(core, SRTM_CAMERA_CATEGORY);
    if (!channel)
    {
        PRINTF("[SRTM Camera Client] Error: No channel found for Camera category!\r\n");
        return SRTM_Status_InvalidParameter;
    }

    /* Allocate an SRTM Request message */
    request = SRTM_Request_Create(channel, SRTM_CAMERA_CATEGORY, SRTM_CAMERA_VERSION, cmd, 
                                  (uint16_t)sizeof(struct _srtm_camera_payload));
    if (request == NULL)
    {
        return SRTM_Status_OutOfMemory;
    }

    /* Fill the message payload data */
    camReq = (struct _srtm_camera_payload *)(void *)SRTM_CommMessage_GetPayload(request);
    camReq->cameraID = cameraID;
    camReq->retCode  = 0; /* Clear return code field before sending */

    PRINTF("[SRTM Camera Client] Sending command %d for cameraID %d to Linux...\r\n", cmd, cameraID);

    /* Hand over the request packet to the SRTM dispatcher to send it over RPMsg */
    return SRTM_Dispatcher_DeliverRequest(service->dispatcher, request);
}

/**
 * @brief Public API to send a START camera request
 */
srtm_status_t SRTM_CameraClient_SendStart(srtm_service_t service, srtm_peercore_t core, uint8_t cameraID)
{
    return SRTM_CameraClient_SendCmd(service, core, SRTM_CAMERA_CMD_START, cameraID);
}

/**
 * @brief Public API to send a STOP camera request
 */
srtm_status_t SRTM_CameraClient_SendStop(srtm_service_t service, srtm_peercore_t core, uint8_t cameraID)
{
    return SRTM_CameraClient_SendCmd(service, core, SRTM_CAMERA_CMD_STOP, cameraID);
}

/**
 * @brief Allocates and initializes the Camera Client service
 */
srtm_service_t SRTM_CameraClient_Create(void)
{
    srtm_camera_client_t handle;

    handle = (srtm_camera_client_t)SRTM_Heap_Malloc(sizeof(struct _srtm_camera_client));
    assert(handle);

    /* Standard SRTM service baseline configuration */
    SRTM_List_Init(&handle->service.node);
    handle->service.dispatcher = NULL;
    handle->service.category   = SRTM_CAMERA_CATEGORY;
    handle->service.destroy    = SRTM_CameraService_Destroy; /* Handled by implementation below */
    handle->service.request    = SRTM_CameraClient_Request;
    handle->service.notify     = SRTM_CameraClient_Notify;

    /* Register the handler to process async responses coming back from Linux server */
    SRTM_Service_RegisterResponseHandler(&handle->service, SRTM_CAMERA_CATEGORY, 
                                         SRTM_CameraClient_ResponseHandler, NULL);

    return &handle->service;
}

void SRTM_CameraService_Destroy(srtm_service_t service)
{
    srtm_camera_client_t handle = (srtm_camera_client_t)(void *)service;
    assert(service);
    assert(SRTM_List_IsEmpty(&service->node));
    SRTM_Heap_Free(handle);
}

void SRTM_CameraService_Reset(srtm_service_t service, srtm_peercore_t core)
{
    assert(service);
}

/* Unused for client architecture since M7 only sends requests, doesn't handle inbound requests */
static srtm_status_t SRTM_CameraClient_Request(srtm_service_t service, srtm_request_t request)
{
    return SRTM_Status_ServiceNotFound;
}

/* Unused for client architecture */
static srtm_status_t SRTM_CameraClient_Notify(srtm_service_t service, srtm_notification_t notif)
{
    return SRTM_Status_ServiceNotFound;
}