Add gitreview file for Lucky Lamprey branch
[apps/agl-service-unicens.git] / ucs2-interface / ucs_lib_interf.c
index 59bed75..f7376c3 100644 (file)
@@ -73,6 +73,7 @@ static void OnUcsGpioTriggerEventStatus(uint16_t node_address, uint16_t gpio_por
     uint16_t rising_edges, uint16_t falling_edges, uint16_t levels, void * user_ptr);
 static void OnUcsI2CWrite(uint16_t node_address, uint16_t i2c_port_handle,
     uint8_t i2c_slave_address, uint8_t data_len, Ucs_I2c_Result_t result, void *user_ptr);
+static void OnUcsAmsWrite(Ucs_AmsTx_Msg_t* msg_ptr, Ucs_AmsTx_Result_t result, Ucs_AmsTx_Info_t info, void *user_ptr);
 
 /************************************************************************/
 /* Public Function Implementations                                      */
@@ -220,7 +221,7 @@ void UCSI_Service(UCSI_Data_t *my)
                 UCSI_CB_OnUserMessage(my->tag, true, "UnicensCmd_GpioWritePort failed", 0);
             break;
         case UnicensCmd_I2CWrite:
-            ret = Ucs_I2c_WritePort(my->unicens, e->val.I2CWrite.destination, 0x0F00, 
+            ret = Ucs_I2c_WritePort(my->unicens, e->val.I2CWrite.destination, 0x0F00,
                 (e->val.I2CWrite.isBurst ? UCS_I2C_BURST_MODE : UCS_I2C_DEFAULT_MODE), e->val.I2CWrite.blockCount,
                 e->val.I2CWrite.slaveAddr, e->val.I2CWrite.timeout, e->val.I2CWrite.dataLen, e->val.I2CWrite.data, OnUcsI2CWrite);
             if (UCS_RET_SUCCESS == ret)
@@ -231,6 +232,37 @@ void UCSI_Service(UCSI_Data_t *my)
                 e->val.I2CWrite.result_fptr(NULL /*processing error*/, e->val.I2CWrite.request_ptr);
             }
             break;
+        case UnicensCmd_SendAmsMessage:
+        {
+            Ucs_AmsTx_Msg_t *msg;
+            msg = Ucs_AmsTx_AllocMsg(my->unicens, e->val.SendAms.payloadLen);
+            if (NULL == msg)
+            {
+                /* Try again later */
+                popEntry = false;
+                break;
+            }
+            if (0 != e->val.SendAms.payloadLen)
+            {
+                assert(NULL != msg->data_ptr);
+                memcpy(msg->data_ptr, e->val.SendAms.pPayload, e->val.SendAms.payloadLen);
+            }
+            msg->custom_info_ptr = NULL;
+            msg->data_size = e->val.SendAms.payloadLen;
+            msg->destination_address = e->val.SendAms.targetAddress;
+            msg->llrbc = 10;
+            msg->msg_id = e->val.SendAms.msgId;
+            if (UCS_RET_SUCCESS == Ucs_AmsTx_SendMsg(my->unicens, msg, OnUcsAmsWrite))
+            {
+                popEntry = false;
+            }
+            else
+            {
+                Ucs_AmsTx_FreeUnusedMsg(my->unicens, msg);
+                UCSI_CB_OnUserMessage(my->tag, true, "Ucs_AmsTx_SendMsg failed", 0);
+            }
+            break;
+        }
         default:
             assert(false);
             break;
@@ -251,26 +283,20 @@ void UCSI_Timeout(UCSI_Data_t *my)
 
 bool UCSI_SendAmsMessage(UCSI_Data_t *my, uint16_t msgId, uint16_t targetAddress, uint8_t *pPayload, uint32_t payloadLen)
 {
-    Ucs_AmsTx_Msg_t *msg;
-    Ucs_Return_t result;
+    UnicensCmdEntry_t entry;
     assert(MAGIC == my->magic);
-    if (NULL == my->unicens) return false;
-    msg = Ucs_AmsTx_AllocMsg(my->unicens, payloadLen);
-    if (NULL == msg) return false;
-    if (0 != payloadLen)
+    if (NULL == my) return false;
+    if (payloadLen > UCS_AMS_SIZE_TX_MSG)
     {
-        assert(NULL != msg->data_ptr);
-        memcpy(msg->data_ptr, pPayload, payloadLen);
+        UCSI_CB_OnUserMessage(my->tag, true, "SendAms was called with payload length=%d, allowed is=%d", 2, payloadLen, UCS_AMS_SIZE_TX_MSG);
+        return false;
     }
-    msg->custom_info_ptr = NULL;
-    msg->data_size = payloadLen;
-    msg->destination_address = targetAddress;
-    msg->llrbc = 10;
-    msg->msg_id = msgId;
-    result = Ucs_AmsTx_SendMsg(my->unicens, msg, NULL);
-    if (UCS_RET_SUCCESS != result)
-        Ucs_AmsTx_FreeUnusedMsg(my->unicens, msg);
-    return UCS_RET_SUCCESS == result;
+    entry.cmd = UnicensCmd_SendAmsMessage;
+    entry.val.SendAms.msgId = msgId;
+    entry.val.SendAms.targetAddress = targetAddress;
+    entry.val.SendAms.payloadLen = payloadLen;
+    memcpy(entry.val.SendAms.pPayload, pPayload, payloadLen);
+    return EnqueueCommand(my, &entry);
 }
 
 bool UCSI_GetAmsMessage(UCSI_Data_t *my, uint16_t *pMsgId, uint16_t *pSourceAddress, uint8_t **pPayload, uint32_t *pPayloadLen)
@@ -314,7 +340,7 @@ bool UCSI_SetRouteActive(UCSI_Data_t *my, uint16_t routeId, bool isActive)
 }
 
 bool UCSI_I2CWrite(UCSI_Data_t *my, uint16_t targetAddress, bool isBurst, uint8_t blockCount,
-    uint8_t slaveAddr, uint16_t timeout, uint8_t dataLen, uint8_t *pData, 
+    uint8_t slaveAddr, uint16_t timeout, uint8_t dataLen, uint8_t *pData,
     Ucsi_ResultCb_t result_fptr, void *request_ptr)
 {
     UnicensCmdEntry_t entry;
@@ -765,11 +791,6 @@ static void OnUcsMgrReport(Ucs_MgrReport_t code, uint16_t node_address, Ucs_Rm_N
     {
         UnicensCmdEntry_t e;
         UCSI_CB_OnUserMessage(my->tag, false, "Node=%X: Available", 1, node_address);
-        /* Enable usage of remote GPIO ports */
-        e.cmd = UnicensCmd_GpioCreatePort;
-        e.val.GpioCreatePort.destination = node_address;
-        e.val.GpioCreatePort.debounceTime = 20;
-        EnqueueCommand(my, &e);
         /* Execute scripts, if there are any */
         if (node_ptr && node_ptr->script_list_ptr && node_ptr->script_list_size)
         {
@@ -786,7 +807,7 @@ static void OnUcsMgrReport(Ucs_MgrReport_t code, uint16_t node_address, Ucs_Rm_N
         UCSI_CB_OnUserMessage(my->tag, true, "Node=%X: unknown code", 1, node_address);
         break;
     }
-    
+
     UCSI_CB_OnMgrReport(my->tag, code, node_address, node_ptr);
 }
 
@@ -833,21 +854,30 @@ static void OnUcsI2CWrite(uint16_t node_address, uint16_t i2c_port_handle,
 {
     UCSI_Data_t *my = (UCSI_Data_t *)user_ptr;
     assert(MAGIC == my->magic);
-    
-    if ((my->currentCmd->cmd == UnicensCmd_I2CWrite) 
+
+    if ((my->currentCmd->cmd == UnicensCmd_I2CWrite)
         && (my->currentCmd->val.I2CWrite.result_fptr)) {
-        
+
         my->currentCmd->val.I2CWrite.result_fptr(&result.code, my->currentCmd->val.I2CWrite.request_ptr);
     }
     else {
         assert(false);
     }
-    
+
     OnCommandExecuted(my, UnicensCmd_I2CWrite);
     if (UCS_I2C_RES_SUCCESS != result.code)
         UCSI_CB_OnUserMessage(my->tag, true, "Remote I2C Write to node=0x%X failed", 1, node_address);
 }
 
+static void OnUcsAmsWrite(Ucs_AmsTx_Msg_t* msg_ptr, Ucs_AmsTx_Result_t result, Ucs_AmsTx_Info_t info, void *user_ptr)
+{
+    UCSI_Data_t *my = (UCSI_Data_t *)user_ptr;
+    assert(MAGIC == my->magic);
+    OnCommandExecuted(my, UnicensCmd_SendAmsMessage);
+    if (UCS_AMSTX_RES_SUCCESS != result)
+        UCSI_CB_OnUserMessage(my->tag, true, "SendAms failed with result=0x%x, info=0x%X", 2, result, info);
+}
+
 /************************************************************************/
 /* Debug Message output from UNICENS stack:                             */
 /************************************************************************/
@@ -858,7 +888,7 @@ void App_TraceError(void *ucs_user_ptr, const char module_str[], const char entr
 {
     va_list argptr;
     char outbuf[TRACE_BUFFER_SZ];
-    void *tag;
+    void *tag = NULL;
     UCSI_Data_t *my = (UCSI_Data_t *)ucs_user_ptr;
     if (my)
     {
@@ -866,7 +896,7 @@ void App_TraceError(void *ucs_user_ptr, const char module_str[], const char entr
         tag = my->tag;
     }
     va_start(argptr, vargs_cnt);
-    vsprintf(outbuf, entry_str, argptr);
+    vsnprintf(outbuf, sizeof(outbuf), entry_str, argptr);
     va_end(argptr);
     UCSI_CB_OnUserMessage(tag, true, "Error | %s | %s", 2, module_str, outbuf);
 }
@@ -875,7 +905,7 @@ void App_TraceInfo(void *ucs_user_ptr, const char module_str[], const char entry
 {
     va_list argptr;
     char outbuf[TRACE_BUFFER_SZ];
-    void *tag;
+    void *tag = NULL;
     UCSI_Data_t *my = (UCSI_Data_t *)ucs_user_ptr;
     if (my)
     {
@@ -883,7 +913,7 @@ void App_TraceInfo(void *ucs_user_ptr, const char module_str[], const char entry
         tag = my->tag;
     }
     va_start(argptr, vargs_cnt);
-    vsprintf(outbuf, entry_str, argptr);
+    vsnprintf(outbuf, sizeof(outbuf), entry_str, argptr);
     va_end(argptr);
     UCSI_CB_OnUserMessage(tag, false, "Info | %s | %s", 2, module_str, outbuf);
 }