/************************************************************************** * * Copyright (c) 2019-2019 Diality Inc. - All Rights Reserved. * * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER. * * @file SystemComm.c * * @date 08-Oct-2019 * @author S. Nash * * @brief SystemComm service module. Provides system message communication \n * functionality. Messages can be queued for transmission. Incoming messages \n * are processed. * **************************************************************************/ #include "can.h" #include "Common.h" #include "Buttons.h" #include "CommBuffers.h" #include "MsgQueues.h" #include "SystemComm.h" // ********** private definitions ********** typedef enum Msg_IDs { MSG_ID_TEST = 0, MSG_ID_OFF_BUTTON_PRESS, NUM_OF_MSG_IDS } MSG_ID_T; // ********** private data ********** // ********** private function prototypes ********** /************************************************************************* * @brief initSystemComm * The initSystemComm function initializes the SystemComm module. * @details * Inputs : none * Outputs : SystemComm module initialized. * @param none * @return none *************************************************************************/ void initSystemComm( void ) { } /************************************************************************* * @brief initSystemComm * The initSystemComm function initializes the SystemComm module. * @details * Inputs : none * Outputs : SystemComm module initialized. * @param none * @return none *************************************************************************/ void execSystemComm( void ) { // TODO - this is ugly preliminary test code - nowhere near ready for code review BOOL isThereMsgToXmit; BOOL isThereMsgRcvd; U08 data[sizeof(MESSAGE_WRAPPER_T)]; U32 dataSize; MESSAGE_WRAPPER_T msg; // get next msg to transmit to UI isThereMsgToXmit = getFromMsgQueue( MSG_Q_CAN_HD_2_UI, &msg ); if ( TRUE == isThereMsgToXmit ) { U08 *dataPtr = data; memcpy( dataPtr, &(msg.msg.hdr), sizeof(MESSAGE_HEADER_T) ); memcpy( dataPtr+sizeof(MESSAGE_HEADER_T), &(msg.msg.cargo), msg.msg.hdr.cargoLen ); memcpy( dataPtr+(sizeof(MESSAGE_HEADER_T) + msg.msg.hdr.cargoLen), &(msg.crc), sizeof(U08) ); addToCommBuffer( COMM_BUFFER_CAN_HD_2_UI, dataPtr, MESSAGE_OVERHEAD_SIZE + msg.msg.hdr.cargoLen ); } // actually transmit any pending messages dataSize = getFromCommBuffer( COMM_BUFFER_CAN_HD_2_UI, data, sizeof(MESSAGE_WRAPPER_T) ); if ( dataSize > 0 && dataSize <= 8 ) { canTransmit( canREG1, canMESSAGE_BOX1, data ); } // queue any received CAN messages if ( FALSE != canIsRxMessageArrived( canREG1, canMESSAGE_BOX2 ) ) { MESSAGE_WRAPPER_T rcvMsg; U08 *dataPtr = data; canGetData( canREG1, canMESSAGE_BOX2, data ); blankMessageInWrapper( &rcvMsg ); memcpy( &(rcvMsg.msg.hdr), dataPtr, sizeof(MESSAGE_HEADER_T) ); dataPtr += sizeof(MESSAGE_HEADER_T); memcpy( &(rcvMsg.msg.cargo), dataPtr, rcvMsg.msg.hdr.cargoLen ); dataPtr += rcvMsg.msg.hdr.cargoLen; rcvMsg.crc = *dataPtr; addToMsgQueue( MSG_Q_CAN_UI_2_HD, &rcvMsg ); } // see if any messages received isThereMsgRcvd = getFromMsgQueue( MSG_Q_CAN_UI_2_HD, &msg ); if ( TRUE == isThereMsgRcvd ) { switch ( msg.msg.hdr.msgID ) { case MSG_ID_OFF_BUTTON_PRESS: userConfirmOffButton(); break; default: break; } } } /************************************************************************* * @brief sendOffButtonMsgToUI * The sendOffButtonMsgToUI function constructs an off button msg to the UI \n * and queues the msg for transmit on the appropriate CAN channel. * @details * Inputs : none * Outputs : Off button msg constructed and queued. * @param none * @return TRUE if msg successfully queued for transmit, FALSE if not *************************************************************************/ BOOL sendOffButtonMsgToUI( void ) { BOOL result; MESSAGE_WRAPPER_T msg; blankMessageInWrapper( &msg ); msg.msg.hdr.msgID = MSG_ID_OFF_BUTTON_PRESS; msg.msg.hdr.cargoLen = 0; result = addToMsgQueue( MSG_Q_CAN_HD_2_UI, &msg ); return result; }