]> rtime.felk.cvut.cz Git - arc.git/blobdiff - communication/Com/Com_Com.c
more work on dynamic signals
[arc.git] / communication / Com / Com_Com.c
index 1e22299411efa3bbcaf210bcdef2f562ac0f37a8..d0814d6296e7dd8158c5852f501838d6a1e3049d 100644 (file)
@@ -85,23 +85,40 @@ uint8 Com_ReceiveSignal(Com_SignalIdType SignalId, void* SignalDataPtr) {
        return E_OK;\r
 }\r
 \r
-uint8 Com_ReceiveDynSignal(ComSignalIdType SignalId, void* SignalDataPtr, uint16* Length) {\r
+uint8 Com_ReceiveDynSignal(Com_SignalIdType SignalId, void* SignalDataPtr, uint16* Length) {\r
+       const ComSignal_type * Signal = GET_Signal(SignalId);\r
+       Com_Arc_Signal_type * Arc_Signal = GET_ArcSignal(Signal->ComHandleId);\r
+       Com_Arc_IPdu_type    *Arc_IPdu   = GET_ArcIPdu(Arc_Signal->ComIPduHandleId);\r
+       const ComIPdu_type   *IPdu       = GET_IPdu(Arc_Signal->ComIPduHandleId);\r
 \r
+       Com_SignalType signalType = Signal->ComSignalType;\r
+       if (signalType != UINT8_DYN || isPduBufferLocked(getPduId(IPdu))) {\r
+               return COM_SERVICE_NOT_AVAILABLE;\r
+       }\r
+\r
+       if (*Length > Arc_IPdu->Com_Arc_DynSignalLength) {\r
+               *Length = Arc_IPdu->Com_Arc_DynSignalLength;\r
+       }\r
+       uint8 startFromPduByte = (Signal->ComBitPosition) / 8;\r
+       memcpy(SignalDataPtr, Arc_IPdu->ComIPduDataPtr + startFromPduByte, *Length);\r
+       return E_OK;\r
 }\r
-uint8 Com_SendDynSignal(ComSignalIdType SignalId, const void* SignalDataPtr, uint16 Length) {\r
-       Com_Arc_Signal_type * Arc_Signal = GET_ArcSignal(Signal->ComHandleId);\r
+\r
+uint8 Com_SendDynSignal(Com_SignalIdType SignalId, const void* SignalDataPtr, uint16 Length) {\r
        const ComSignal_type * Signal = GET_Signal(SignalId);\r
+       Com_Arc_Signal_type * Arc_Signal = GET_ArcSignal(Signal->ComHandleId);\r
        Com_Arc_IPdu_type    *Arc_IPdu   = GET_ArcIPdu(Arc_Signal->ComIPduHandleId);\r
        const ComIPdu_type   *IPdu       = GET_IPdu(Arc_Signal->ComIPduHandleId);\r
 \r
        Com_SignalType signalType = Signal->ComSignalType;\r
        if (signalType != UINT8_DYN) {\r
-               return E_NOT_OK;\r
+               return COM_SERVICE_NOT_AVAILABLE;\r
+       }\r
+       if (isPduBufferLocked(getPduId(IPdu))) {\r
+               return COM_BUSY;\r
        }\r
-       Com_Arc_IPdu* Arc_IPdu = GET_ArcIPdu(Arc_Signal->ComIPduHandleId);\r
        uint8 signalLength = Signal->ComBitSize / 8;\r
        Com_BitPositionType bitPosition = Signal->ComBitPosition;\r
-       uint8 bitSize = Signal->ComBitSize;\r
        if (signalLength < Length) {\r
                return E_NOT_OK;\r
        }\r
@@ -117,8 +134,6 @@ uint8 Com_SendDynSignal(ComSignalIdType SignalId, const void* SignalDataPtr, uin
                Arc_IPdu->Com_Arc_TxIPduTimers.ComTxIPduNumberOfRepetitionsLeft = IPdu->ComTxIPdu.ComTxModeTrue.ComTxModeNumberOfRepetitions + 1;\r
        }\r
        return E_OK;\r
-\r
-\r
 }\r
 \r
 Std_ReturnType Com_TriggerTransmit(PduIdType ComTxPduId, PduInfoType *PduInfoPtr) {\r