Image-tuning tool server thread. This thread listens on the TCP port for ITT connection and also coordinates the client side CMD/DATA send & receive.
/** ================================================================== * @file itt_Capture.h * * @path ipnc_mcfw/demos/mcfw_api_demos/itt/ * * @desc This File contains. * =================================================================== * Copyright (c) Texas Instruments Inc 2011, 2012 * * Use of this software is controlled by the terms and conditions found * in the license agreement under which this software has been supplied * ===================================================================*/ /* * Notify from A8 to VPSS M3 */ #ifndef _ITT_CAPTURE_H_ #define _ITT_CAPTURE_H_ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include <osa_thr.h> #define ITT_ERROR(...) \ fprintf(stderr, " ERROR (%s|%s|%d): ", __FILE__, __func__, __LINE__); \ fprintf(stderr, __VA_ARGS__); #define ITT_STATUS_OK 0 // /< Status : OK #define ITT_STATUS_EFAIL -1 // /< Status : // Generic error /* SWOSD Timer Thread priority and stack size */ #define ITT_TSK_PRI (7) #define ITT_TSK_STACK_SIZE (32) typedef Void *(*ThrEntryFunc) (Void *); typedef pthread_t ThrId; typedef struct _TaskCtx { ThrId handle; Int8 exitFlag; } TaskCtx; typedef struct { pthread_t *hndl; pthread_attr_t *thread_attr; // OSAL_TaskEntryFunc entryFunc; unsigned int pri; unsigned int stackSize; } OSAL_TaskHandle; Int32 Itt_thrCreate(TaskCtx * ctx, ThrEntryFunc entryFunc, Uint32 pri, Uint32 stackSize); Int32 Itt_thrDelete(TaskCtx * ctx); Int32 Itt_TaskCreate(); int Itt_TaskDelete(); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* _DM81XX_A8_NOTIFY_H_ */
/** ================================================================== * @file itt_Capture.c * * @path ipnc_mcfw/demos/mcfw_api_demos/itt/ * * @desc This File contains. * =================================================================== * Copyright (c) Texas Instruments Inc 2011, 2012 * * Use of this software is controlled by the terms and conditions found * in the license agreement under which this software has been supplied * ===================================================================*/ /* * Notify from A8 to VIDEO M3 functions */ #include <string.h> #include <mcfw/interfaces/ti_media_std.h> #include <itt_Capture.h> #include <ti/syslink/Std.h> #include <ti/ipc/MultiProc.h> #include <ti/syslink/IpcHost.h> #include <ti/syslink/ProcMgr.h> #include <ti/ipc/MessageQ.h> #include <ti/ipc/SharedRegion.h> #include <ti/syslink/SysLink.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> static TaskCtx ittThrHandle; #define ITT_ASSERT( COND ) // COND #define ITT_PRINTF( MSG ) OSA_printf(MSG) #define ITT_SERVER_MSGQ_NAME "ITT_SERVERQ" #define DCC_SERVER_MSGQ_NAME "DCC_SERVERQ" /** * Handle to the ITT Server Message Queue */ MessageQ_Handle hIttMsgQ = NULL; typedef struct ittServer_Msg { MessageQ_MsgHeader header; Int32 response; Int32 arg1; Int32 arg2; } ittServer_Msg; #define CMD_CKH_CONNECTION (1) #define CMD_SEND_DCC (2) #define CMD_MEM_READ_WORD (3) #define CMD_SAVE_RAW (4) #define CMD_REGS_READ (5) #define CMD_MEM_WRITE_WORD (6) #define CMD_RECV_DCC (7) #define CMD_CAMERA_CNTL (8) #define CMD_SAVE_YUV (9) #define CMD_MEM_READ_BUFF (10) #define CMD_SENSOR_REGS_READ (11) #define CMD_SENSOR_REG_WRITE (12) #define ITT_SHAREDREGION_ID (0) /** ******************************************************************************* * @func RfileServer_cleanup * @brief This function uninitializes the Remote File Server * * @retval Rfile_SUCCESS Remote File Server uninitialization successful * @retval Rfile_FAIL Error in uninitializing Remote File Server * * @remarks After calling RfileServer_cleanup, no further Remote File * operations should be attempted. * ******************************************************************************* */ /* =================================================================== * @func ittServerMsgQ_cleanup * * @desc Function does the following * * @modif This function modifies the following structures * * @inputs This function takes the following inputs * <argument name> * Description of usage * <argument name> * Description of usage * * @outputs <argument name> * Description of usage * * @return Return value of this function if any * ================================================================== */ Int32 ittServerMsgQ_cleanup() { MessageQ_delete(&hIttMsgQ); return (1); } #define ITT_SERVER_DEFAULT_PORT (5000) static int serverPort; static int serverSocketId; /* =================================================================== * @func ittServer_CreateSocket * * @desc Function does the following * * @modif This function modifies the following structures * * @inputs This function takes the following inputs * <argument name> * Description of usage * <argument name> * Description of usage * * @outputs <argument name> * Description of usage * * @return Return value of this function if any * ================================================================== */ int ittServer_CreateSocket(unsigned int port) { struct sockaddr_in server; int status; serverPort = port; serverSocketId = socket(AF_INET, SOCK_STREAM, 0); ITT_ASSERT(serverSocketId < 0) server.sin_family = AF_INET; server.sin_addr.s_addr = INADDR_ANY; server.sin_port = htons(port); memset((void *) &(server.sin_zero), 0, 8); status = bind(serverSocketId, (struct sockaddr *) &server, sizeof(server)); ITT_ASSERT(status == -1); status = listen(serverSocketId, 5); ITT_ASSERT(status < 0); return (0); } /* =================================================================== * @func ittServer_SendData * * @desc Function does the following * * @modif This function modifies the following structures * * @inputs This function takes the following inputs * <argument name> * Description of usage * <argument name> * Description of usage * * @outputs <argument name> * Description of usage * * @return Return value of this function if any * ================================================================== */ int ittServer_SendData(int SocketId, unsigned char *dataBuf, unsigned int dataSize) { int actDataSize = 0; while (dataSize > 0) { actDataSize = send(SocketId, dataBuf, dataSize, 0); OSA_printf(" ITT_Server: Send Data %d (%d)\n", actDataSize, dataSize); if (actDataSize <= 0) break; dataBuf += actDataSize; dataSize -= actDataSize; } if (dataSize > 0) { ITT_ERROR(" ITT_Server: Failed to send the data\n"); return (-1); } return (0); } /* =================================================================== * @func ittServer_RecvData * * @desc Function does the following * * @modif This function modifies the following structures * * @inputs This function takes the following inputs * <argument name> * Description of usage * <argument name> * Description of usage * * @outputs <argument name> * Description of usage * * @return Return value of this function if any * ================================================================== */ int ittServer_RecvData(int SocketId, unsigned char *dataBuf, unsigned int dataSize) { int actDataSize = 0; while (dataSize > 0) { actDataSize = recv(SocketId, dataBuf, dataSize, 0); OSA_printf(" ITT_Server: Recived Data %d (%d)\n", actDataSize, dataSize); if (actDataSize <= 0) break; dataBuf += actDataSize; dataSize -= actDataSize; } if (dataSize > 0) { ITT_ERROR(" ITT_Server: Failed to recicve the data\n"); return (-1); } return (0); } /* =================================================================== * @func ittServer_run * * @desc Function does the following * * @modif This function modifies the following structures * * @inputs This function takes the following inputs * <argument name> * Description of usage * <argument name> * Description of usage * * @outputs <argument name> * Description of usage * * @return Return value of this function if any * ================================================================== */ MessageQ_QueueId remoteQ; Int32 ittServer_run() { Int32 status = 0; Bits16 cmd = 1; ittServer_Msg *ittMsg = NULL; remoteQ = 0; MessageQ_Msg msg = NULL; Ptr srHeap = NULL; MessageQ_Params msgQParams; //int cmdCounter = 1; unsigned int sin_size; struct sockaddr_in client; int connectedSocketId; int dataSize; // unsigned char dataBuf[100*1024]; Int32 recvData[5]; Int32 payLoadSize; Bits32 srPtr = 0; Ptr buf = NULL; OSA_printf("\n ITT ittServer_run\n"); /*-------------------------------------------------------------------------- * Get the heap associated with the Shared Region for Message Queue. This * heap is used to create Message Queues, allocate Messages subsequently. *------------------------------------------------------------------------*/ srHeap = SharedRegion_getHeap(ITT_SHAREDREGION_ID); ITT_ASSERT(srHeap != NULL); /*-------------------------------------------------------------------------- * Create a message queue for Remote File Server. The client modules send * their requests to this message queue *------------------------------------------------------------------------*/ MessageQ_Params_init(&msgQParams); hIttMsgQ = MessageQ_create(ITT_SERVER_MSGQ_NAME, &msgQParams); ITT_ASSERT(hIttMsgQ != NULL); if(hIttMsgQ == NULL) { goto EXIT; } msg = MessageQ_alloc(ITT_SHAREDREGION_ID, sizeof(ittServer_Msg)); if (msg == NULL) { OSA_printf("ERROR: Can't allocate message for [%s]\n", ITT_SERVER_MSGQ_NAME); MessageQ_delete(&hIttMsgQ); return (0); } ittMsg = (ittServer_Msg *) msg; OSA_printf("ITT Server Message initialization successful\n"); do { status = MessageQ_open(DCC_SERVER_MSGQ_NAME, &remoteQ); } while (status == MessageQ_E_NOTFOUND); OSA_printf("DCC server Message ques is open succefully\n"); // while (1) { ittMsg->arg1 = 1024 * 1024; /*-------------------------------------------------------------------------- * Specify the command to be used *------------------------------------------------------------------------*/ OSA_printf("Setting cmd <%d> in message <%x>\n", cmd, (UInt32)msg); MessageQ_setMsgId(msg, cmd); /*-------------------------------------------------------------------------- * Specify the MessageQ owned by this Task as the reply queue. The Remote * File Server will reply to the queue embedded in this message *------------------------------------------------------------------------*/ MessageQ_setReplyQueue(hIttMsgQ, msg); /*-------------------------------------------------------------------------- * Send the command to the Remote File Server *------------------------------------------------------------------------*/ OSA_printf("Posting message <%x> in QId <%x> \n", (UInt32)msg, (UInt32)remoteQ); status = MessageQ_put(remoteQ, msg); ITT_ASSERT(status == MessageQ_S_SUCCESS); /*-------------------------------------------------------------------------- * Wait for a response from the Remote File Server *------------------------------------------------------------------------*/ status = MessageQ_get(hIttMsgQ, &msg, MessageQ_FOREVER); ITT_ASSERT(status == MessageQ_S_SUCCESS); if(msg == NULL) { goto EXIT; } OSA_printf("Response from M3 is : %d\n", ittMsg->response); srPtr = (Bits32) ittMsg->arg1; /*-------------------------------------------------------------------------- * Check if shared region pointer is valid *------------------------------------------------------------------------*/ if (srPtr == 0) { OSA_printf("Invalid sr Pointer \n"); goto EXIT; } /*-------------------------------------------------------------------------- * Check if SR pointer can be translated to a valid local pointer *------------------------------------------------------------------------*/ else if ((buf = SharedRegion_getPtr(srPtr)) == NULL) { OSA_printf("Invalid sr translation \n"); goto EXIT; } } #if 1 /* send the default dcc data if exists to M3 */ { FILE *fp; int lSize, result; fp = fopen("/opt/ipnc/dcc/dcc_default.bin", "rb"); if (fp == NULL) { OSA_printf ("Default dcc profile does not exists. Using system defaults ... \n"); } else /* Default profile * exists */ { // obtain file size: fseek(fp, 0, SEEK_END); lSize = ftell(fp); rewind(fp); result = fread(buf, 1, lSize, fp); if (result != lSize) { OSA_printf("Unable to read complete dcc file ... \n"); } else { /* Send a message to M3 asking to read the dcc data */ cmd = 2; // 2 is for dcc // TODO nee to // make it enum ittMsg->arg1 = lSize; MessageQ_setMsgId(msg, cmd); MessageQ_setReplyQueue(hIttMsgQ, msg); status = MessageQ_put(remoteQ, msg); ITT_ASSERT(status == MessageQ_S_SUCCESS); status = MessageQ_get(hIttMsgQ, &msg, MessageQ_FOREVER); ITT_ASSERT(status == MessageQ_S_SUCCESS); if(msg == NULL) { goto EXIT; } OSA_printf("Response from M3 is : %d\n", ittMsg->response); OSA_printf("Default parameters were sent sucessfully \n"); } fclose(fp); } } #endif ittServer_CreateSocket(ITT_SERVER_DEFAULT_PORT); OSA_printf("Server Socket created with ID <%d> \n", serverSocketId); while (1) { sin_size = sizeof(struct sockaddr_in); connectedSocketId = accept(serverSocketId, (struct sockaddr *) &client, &sin_size); if (connectedSocketId < 0) { ITT_ERROR("Illegal client socket ID\n"); goto EXIT; } OSA_printf(" ITT Server: Connected to client\n"); while (1) { dataSize = 20; status = ittServer_RecvData(connectedSocketId, (unsigned char *)recvData, dataSize); if (status == -1) { break; } // recvData = (Int32 * )buf; /* Checking connectivity */ if (recvData[0] == CMD_CKH_CONNECTION) { OSA_printf("Client checking the connectivity \n"); break; } /* dcc data */ else if (recvData[0] == CMD_SEND_DCC) { int updateDefault; cmd = recvData[0]; payLoadSize = recvData[1]; updateDefault = recvData[2]; /* Get the dcc data into buffer */ status = ittServer_RecvData(connectedSocketId, buf, payLoadSize); if (status != -1) { OSA_printf("Server recived <%d> bytes from client \n", payLoadSize); } if (updateDefault == 1) { FILE *fp = fopen("./dcc/dcc_default.bin", "wb"); if (fp == NULL) { OSA_printf ("error in opening the default file dcc_default.bin. Unable to update \n"); } else { fwrite(buf, 1, payLoadSize, fp); OSA_printf("default update is sucessful \n"); fclose(fp); } } ittMsg->arg1 = payLoadSize; MessageQ_setMsgId(msg, cmd); MessageQ_setReplyQueue(hIttMsgQ, msg); status = MessageQ_put(remoteQ, msg); ITT_ASSERT(status == MessageQ_S_SUCCESS); status = MessageQ_get(hIttMsgQ, &msg, MessageQ_FOREVER); ITT_ASSERT(status == MessageQ_S_SUCCESS); if(msg == NULL) { goto EXIT; } OSA_printf("Response from M3 is : %d\n", ittMsg->response); recvData[0] = ittMsg->response; recvData[1] = 0; recvData[2] = 0; recvData[3] = 0; recvData[4] = 0; status = ittServer_SendData(connectedSocketId, (unsigned char *)recvData, dataSize); break; } /* Reg read */ else if (recvData[0] == CMD_MEM_READ_WORD) { cmd = recvData[0]; ittMsg->arg1 = recvData[1]; MessageQ_setMsgId(msg, cmd); MessageQ_setReplyQueue(hIttMsgQ, msg); status = MessageQ_put(remoteQ, msg); ITT_ASSERT(status == MessageQ_S_SUCCESS); status = MessageQ_get(hIttMsgQ, &msg, MessageQ_FOREVER); ITT_ASSERT(status == MessageQ_S_SUCCESS); if(msg == NULL) { goto EXIT; } OSA_printf("Response from M3 is : %d\n", ittMsg->response); recvData[0] = ittMsg->response; recvData[1] = ittMsg->arg1; recvData[2] = 0; recvData[3] = 0; recvData[4] = 0; status = ittServer_SendData(connectedSocketId, (unsigned char *)recvData, dataSize); break; } /* Request for RAW data */ else if (recvData[0] == CMD_SAVE_RAW) { //int i; //int *buf_ptr = (int *) buf; cmd = recvData[0]; MessageQ_setMsgId(msg, cmd); MessageQ_setReplyQueue(hIttMsgQ, msg); status = MessageQ_put(remoteQ, msg); ITT_ASSERT(status == MessageQ_S_SUCCESS); do { status = MessageQ_get(hIttMsgQ, &msg, MessageQ_FOREVER); OSA_printf("Got a new message \n"); ITT_ASSERT(status == MessageQ_S_SUCCESS); if(msg == NULL) { goto EXIT; } recvData[0] = ittMsg->response; recvData[1] = ittMsg->arg1; recvData[2] = 0; recvData[3] = 0; recvData[4] = 0; if (ittMsg->arg1 != -1) { OSA_printf("Response from M3 is : %d\n", ittMsg->response); OSA_printf("Data to transfer = %d\n", ittMsg->arg1); status = ittServer_SendData(connectedSocketId, (unsigned char *)recvData, dataSize); status = ittServer_SendData(connectedSocketId, buf, ittMsg->arg1); /* { int i; for (i = 0; i < 10; i++) { OSA_printf("%x", * ((int*)buf)[i]); } } */ // Put status = MessageQ_put(remoteQ, msg); ITT_ASSERT(status == MessageQ_S_SUCCESS); } else { break; } } while (1); recvData[1] = -1; status = ittServer_SendData(connectedSocketId, (unsigned char *)recvData, dataSize); break; } else if (recvData[0] == CMD_REGS_READ) { //int i; //int *buf_ptr = (int *) buf; cmd = recvData[0]; ittMsg->arg1 = recvData[1]; ittMsg->arg2 = recvData[2]; MessageQ_setMsgId(msg, cmd); MessageQ_setReplyQueue(hIttMsgQ, msg); status = MessageQ_put(remoteQ, msg); ITT_ASSERT(status == MessageQ_S_SUCCESS); status = MessageQ_get(hIttMsgQ, &msg, MessageQ_FOREVER); ITT_ASSERT(status == MessageQ_S_SUCCESS); if(msg == NULL) { goto EXIT; } OSA_printf("Response from M3 is : %d\n", ittMsg->response); if (ittMsg->arg1 > 0) { recvData[0] = ittMsg->response; recvData[1] = ittMsg->arg1; recvData[2] = ittMsg->arg2; recvData[3] = 0; recvData[4] = 0; OSA_printf("Data to transfer = %d\n", ittMsg->arg1); status = ittServer_SendData(connectedSocketId, (unsigned char *)recvData, dataSize); status = ittServer_SendData(connectedSocketId, buf, ittMsg->arg1); } break; } else if ((recvData[0] == CMD_MEM_READ_BUFF) || (recvData[0] == CMD_SENSOR_REGS_READ)) { //int i; //int *buf_ptr = (int *) buf; cmd = recvData[0]; ittMsg->arg1 = recvData[1]; ittMsg->arg2 = recvData[2]; MessageQ_setMsgId(msg, cmd); MessageQ_setReplyQueue(hIttMsgQ, msg); status = MessageQ_put(remoteQ, msg); ITT_ASSERT(status == MessageQ_S_SUCCESS); status = MessageQ_get(hIttMsgQ, &msg, MessageQ_FOREVER); ITT_ASSERT(status == MessageQ_S_SUCCESS); if(msg == NULL) { goto EXIT; } OSA_printf("Response from M3 is : %d\n", ittMsg->response); if (ittMsg->arg1 > 0) { recvData[0] = ittMsg->response; recvData[1] = ittMsg->arg1; recvData[2] = ittMsg->arg2; recvData[3] = 0; recvData[4] = 0; OSA_printf("Data to transfer = %d\n", ittMsg->arg1); status = ittServer_SendData(connectedSocketId, (unsigned char *)recvData, dataSize); status = ittServer_SendData(connectedSocketId, buf, ittMsg->arg1); } break; } /* Reg Write */ else if ((recvData[0] == CMD_MEM_WRITE_WORD) || (recvData[0] == CMD_SENSOR_REG_WRITE)) { cmd = recvData[0]; ittMsg->arg1 = recvData[1]; ittMsg->arg2 = recvData[2]; MessageQ_setMsgId(msg, cmd); MessageQ_setReplyQueue(hIttMsgQ, msg); status = MessageQ_put(remoteQ, msg); ITT_ASSERT(status == MessageQ_S_SUCCESS); status = MessageQ_get(hIttMsgQ, &msg, MessageQ_FOREVER); ITT_ASSERT(status == MessageQ_S_SUCCESS); if(msg == NULL) { goto EXIT; } OSA_printf("Response from M3 is : %d\n", ittMsg->response); recvData[0] = ittMsg->response; recvData[1] = 0; recvData[2] = 0; recvData[3] = 0; recvData[4] = 0; status = ittServer_SendData(connectedSocketId, (unsigned char *)recvData, dataSize); break; } else if (recvData[0] == CMD_RECV_DCC) { cmd = recvData[0]; MessageQ_setMsgId(msg, cmd); MessageQ_setReplyQueue(hIttMsgQ, msg); status = MessageQ_put(remoteQ, msg); ITT_ASSERT(status == MessageQ_S_SUCCESS); status = MessageQ_get(hIttMsgQ, &msg, MessageQ_FOREVER); ITT_ASSERT(status == MessageQ_S_SUCCESS); if(msg == NULL) { goto EXIT; } OSA_printf("Response from M3 is : %d\n", ittMsg->response); recvData[0] = ittMsg->response; recvData[1] = ittMsg->arg1; recvData[2] = 0; recvData[3] = 0; recvData[4] = 0; status = ittServer_SendData(connectedSocketId, (unsigned char *)recvData, dataSize); status = ittServer_SendData(connectedSocketId, buf, ittMsg->arg1); break; } else if (recvData[0] == CMD_CAMERA_CNTL) { cmd = recvData[0]; payLoadSize = recvData[1]; /* Control Parameters into buffer */ status = ittServer_RecvData(connectedSocketId, buf, payLoadSize); if (status != -1) { OSA_printf("Server recived <%d> bytes from client \n", payLoadSize); } ittMsg->arg1 = payLoadSize; MessageQ_setMsgId(msg, cmd); MessageQ_setReplyQueue(hIttMsgQ, msg); status = MessageQ_put(remoteQ, msg); ITT_ASSERT(status == MessageQ_S_SUCCESS); status = MessageQ_get(hIttMsgQ, &msg, MessageQ_FOREVER); ITT_ASSERT(status == MessageQ_S_SUCCESS); if(msg == NULL) { goto EXIT; } OSA_printf("Response from M3 is : %d\n", ittMsg->response); recvData[0] = ittMsg->response; recvData[1] = 0; recvData[2] = 0; recvData[3] = 0; recvData[4] = 0; status = ittServer_SendData(connectedSocketId, (unsigned char *)recvData, dataSize); break; } else if (recvData[0] == CMD_SAVE_YUV) { //int i; //int *buf_ptr = (int *) buf; cmd = recvData[0]; MessageQ_setMsgId(msg, cmd); MessageQ_setReplyQueue(hIttMsgQ, msg); status = MessageQ_put(remoteQ, msg); ITT_ASSERT(status == MessageQ_S_SUCCESS); do { status = MessageQ_get(hIttMsgQ, &msg, MessageQ_FOREVER); OSA_printf("Got a new message \n"); ITT_ASSERT(status == MessageQ_S_SUCCESS); if(msg == NULL) { goto EXIT; } recvData[0] = ittMsg->response; recvData[1] = ittMsg->arg1; recvData[2] = 0; recvData[3] = 0; recvData[4] = 0; if (ittMsg->arg1 != -1) { OSA_printf("Response from M3 is : %d\n", ittMsg->response); OSA_printf("Data to transfer = %d\n", ittMsg->arg1); status = ittServer_SendData(connectedSocketId, (unsigned char *)recvData, dataSize); status = ittServer_SendData(connectedSocketId, buf, ittMsg->arg1); status = MessageQ_put(remoteQ, msg); ITT_ASSERT(status == MessageQ_S_SUCCESS); } else { break; } } while (1); recvData[1] = -1; status = ittServer_SendData(connectedSocketId, (unsigned char *)recvData, dataSize); break; } else { OSA_printf("Un-supported command \n"); break; } } OSA_printf(" ITT Server: Disconnected from client\n"); } return (1); EXIT: ITT_ERROR("ITT server exiting with erro\n"); return (0); } /* =================================================================== * @func IttServer_Task * * @desc Function does the following * * @modif This function modifies the following structures * * @inputs This function takes the following inputs * <argument name> * Description of usage * <argument name> * Description of usage * * @outputs <argument name> * Description of usage * * @return Return value of this function if any * ================================================================== */ void *IttServer_Task(void *taskHndl) { OSA_printf("ITT server task running !!!\n"); ittServer_run(); OSA_printf("ITT server task Exiting \n"); return NULL; } /* =================================================================== * @func Itt_TaskCreate * * @desc Function does the following * * @modif This function modifies the following structures * * @inputs This function takes the following inputs * <argument name> * Description of usage * <argument name> * Description of usage * * @outputs <argument name> * Description of usage * * @return Return value of this function if any * ================================================================== */ Int32 Itt_TaskCreate() { Int32 status = ITT_STATUS_OK; status = Itt_thrCreate(&ittThrHandle, (ThrEntryFunc) IttServer_Task, ITT_TSK_PRI, ITT_TSK_STACK_SIZE); OSA_printf("\n ITT capture task created\n"); UTILS_assert(status == ITT_STATUS_OK); return status; } /* Date Time task delete */ /* =================================================================== * @func Itt_TaskDelete * * @desc Function does the following * * @modif This function modifies the following structures * * @inputs This function takes the following inputs * <argument name> * Description of usage * <argument name> * Description of usage * * @outputs <argument name> * Description of usage * * @return Return value of this function if any * ================================================================== */ int Itt_TaskDelete() { Itt_thrDelete(&ittThrHandle); return 0; } /* =================================================================== * @func Itt_thrCreate * * @desc Function does the following * * @modif This function modifies the following structures * * @inputs This function takes the following inputs * <argument name> * Description of usage * <argument name> * Description of usage * * @outputs <argument name> * Description of usage * * @return Return value of this function if any * ================================================================== */ Int32 Itt_thrCreate(TaskCtx * ctx, ThrEntryFunc entryFunc, Uint32 pri, Uint32 stackSize) { Int32 status = ITT_STATUS_OK; pthread_attr_t thread_attr; struct sched_param schedprm; if (ctx == NULL || entryFunc == NULL) { ITT_ERROR("Input param error\n"); return ITT_STATUS_EFAIL; } // initialize thread attributes structure status = pthread_attr_init(&thread_attr); if (status != ITT_STATUS_OK) { ITT_ERROR("Itt_thrCreate() - Could not initialize thread attributes\n"); return status; } if (stackSize != 0) pthread_attr_setstacksize(&thread_attr, stackSize); status |= pthread_attr_setinheritsched(&thread_attr, PTHREAD_EXPLICIT_SCHED); status |= pthread_attr_setschedpolicy(&thread_attr, SCHED_FIFO); if (pri > sched_get_priority_max(SCHED_FIFO)) pri = sched_get_priority_max(SCHED_FIFO); else if (pri < sched_get_priority_min(SCHED_FIFO)) pri = sched_get_priority_min(SCHED_FIFO); schedprm.sched_priority = pri; status |= pthread_attr_setschedparam(&thread_attr, &schedprm); if (status != ITT_STATUS_OK) { ITT_ERROR("Itt_thrCreate() - Could not initialize thread attributes\n"); goto error_exit; } ctx->exitFlag = 0; status = pthread_create(&ctx->handle, &thread_attr, entryFunc, ctx); if (status != ITT_STATUS_OK) { ITT_ERROR("Itt_thrCreate() - Could not create thread [%d]\n", status); } error_exit: pthread_attr_destroy(&thread_attr); return status; } /* =================================================================== * @func Itt_thrDelete * * @desc Function does the following * * @modif This function modifies the following structures * * @inputs This function takes the following inputs * <argument name> * Description of usage * <argument name> * Description of usage * * @outputs <argument name> * Description of usage * * @return Return value of this function if any * ================================================================== */ Int32 Itt_thrDelete(TaskCtx * ctx) { Int32 status = ITT_STATUS_OK; void *retVal; if (NULL == ctx) { ITT_ERROR("Itt_thrDelete() - handle is NULL\n"); return ITT_STATUS_EFAIL; } status = close(serverSocketId); UTILS_assert(status == MessageQ_S_SUCCESS); status = MessageQ_close(&remoteQ); UTILS_assert(status == MessageQ_S_SUCCESS); MessageQ_unblock(hIttMsgQ); status = MessageQ_delete(&hIttMsgQ); UTILS_assert(status == MessageQ_S_SUCCESS); status |= pthread_cancel(ctx->handle); ctx->exitFlag = 1; if (pthread_join(ctx->handle, &retVal)) { ITT_ERROR("Itt_thrDelete() - handle is NULL\n"); } return status; }