
Library set up as dummy module on mbed to mimic Nordic.
Diff: rs485.cpp
- Revision:
- 2:9ab591cf81b8
- Parent:
- 1:d6b18299a715
--- a/rs485.cpp Mon Dec 12 23:19:30 2016 +0000 +++ b/rs485.cpp Tue Dec 13 00:20:29 2016 +0000 @@ -3,14 +3,10 @@ #include "rs485.h" - -#define PRINTPACKETDEBUG -#define DEVADDRESS 0xF0 #define DEBUG static list_t functionList = { .index = 0 }; - Packet buildPacket; static unsigned int buffPtr; static unsigned char buffer[128+1]; @@ -20,21 +16,35 @@ unsigned int plength; unsigned char command; int message; -// extern int message; - -// extern unsigned char packetBuffer[128]; -// extern unsigned int packetBufferSize; static unsigned char packetBuffer[128]; static unsigned int packetBufferSize; +/************************** External Functions******************************** +* These functions need to be externall defined to be able to process packets +* and to send out chars over the bus. +/************************** External Functions********************************/ extern int Bluetooth_ReceivePacket( Packet *_packet ); extern int Bluetooth_SendChar( unsigned char ); +extern const unsigned char DEVADDRESS; -#ifdef __cplusplus -extern "C" { -#endif - - +/****************************************************************************** + * Function void RegisterCommand( command , function ) + * + * When a command is registered with this function it will be added to the function + * list. Once on the list, when a packet is received on the bus containing that + * command the associated function will get called and it will be passed the data + * within the packet as a parameter. + * + * PreCondition: None + * + * Input: 'command' - command byte + * 'function' - pointer to function to be called + * + * Output: None + * + * Side Effects: None + * + *****************************************************************************/ unsigned char RegisterCommand( unsigned char _command , void (*_function)( unsigned char *) ){ functionList.list[ functionList.index ].function = _function; functionList.list[ functionList.index ].command = _command; @@ -42,6 +52,23 @@ return 0; } +/****************************************************************************** + * Function void CheckFunction( Packet * ) + * + * This passes in a packet and compares the command byte with a list of registered + * commands. If it finds a match it will call that function along with the data + * in the packet. + * + * PreCondition: None + * + * Input: '_packet' - packet containing command byte and data + * + * Output: '1' - command matched and function called + * '2' - no command found + * + * Side Effects: None + * + *****************************************************************************/ int CheckFunction( Packet *_packet ){ int i = 0; void (*Caller)(unsigned char *); @@ -59,6 +86,21 @@ } +/****************************************************************************** + * Function void SendAck( void ) + * + * Sends an acknowledge byte over the bus. It calls an external function to + * handle the actual hardware communication. + * + * PreCondition: None + * + * Input: '_packet' - prebuilt packet to send + * + * Output: None + * + * Side Effects: None + * + *****************************************************************************/ static void SendAck( void ){ #ifdef DEBUG pc.printf( "\n\rAck Sent.\n\r" ); @@ -67,6 +109,21 @@ Bluetooth_SendChar( ack ); } +/****************************************************************************** + * Function void SendNack( void ) + * + * Sends a non acknowledge byte over the bus. It calls an external function to + * handle the actual hardware communication. + * + * PreCondition: None + * + * Input: '_packet' - prebuilt packet to send + * + * Output: None + * + * Side Effects: None + * + *****************************************************************************/ static void SendNack( void ){ #ifdef DEBUG pc.printf( "\n\rNack Sent.\n\r" ); @@ -75,10 +132,40 @@ Bluetooth_SendChar( nack ); } +/****************************************************************************** + * Function void ProcessPacket( Packet *) + * + * Gets automatically called once an entire packet is successfully received. + * May modify what is done, but it should just pass the packet over to + * an external function where it can be correctly handled. + * + * PreCondition: None + * + * Input: '_packet' - packet received on bus + * + * Output: None + * + * Side Effects: None + * + *****************************************************************************/ static int ProcessPacket( Packet *_packet ){ return Bluetooth_ReceivePacket( _packet ); } - + +/****************************************************************************** + * Function void setResponse(int, int, int) + * + * This function sets the feedback information to be send in the master device. + * + * PreCondition: None + * + * Input: '_packet' - prebuilt packet to send + * + * Output: None + * + * Side Effects: None + * + *****************************************************************************/ void SendMessage( void ){ int j = 0; Bluetooth_SendChar( packetBuffer[ j++ ] ); @@ -105,7 +192,7 @@ } /****************************************************************************** - * Function void setResponse(int, int, int) + * Function void SetResponse( Packet *_packet ) * * This function sets the feedback information to be send in the master device. * @@ -118,12 +205,54 @@ * Side Effects: None * *****************************************************************************/ - void SetResponse( Packet *_packet ){ + void SetResponsePacket( Packet *_packet ){ packetBufferSize = getFormattedPacket(_packet, packetBuffer); message = 1; } /****************************************************************************** + * Function void SetResponseWithData( unsigned char deviceID, unsigned char + command, unsigned char * data, unsigned short dataLength) + * + * This function sets the feedback information to be send in the master device. + * + * PreCondition: None + * + * Input: 'deviceID' - address where the packet is going + 'command' - command to be sent + '*data' - point to unsiged char array packet with data + 'dataLength' - length of 'data' + * + * Output: None + * + * Side Effects: None + * + *****************************************************************************/ +void SetResponseWithData( unsigned char deviceID, unsigned char command, unsigned char * data, unsigned short dataLength){ + + // build packet to be sent + Packet packet; + packet.deviceID = deviceID; + packet.sourceID = DEVADDRESS; + packet.command = command; + packet.packetLength = dataLength; + memcpy( packet.packetData , data , dataLength ); + packetBufferSize = getFormattedPacket(&packet, packetBuffer); + + // print message to be sent + #ifdef DEBUG + pc.printf( "Message to send: "); + unsigned short length = 0; + for( length = 1 ; length < ( dataLength + sizeof( packet.deviceID ) + sizeof( packet.sourceID ) + sizeof( packet.command ) + sizeof( packet.packetLength ) + 1 ) ; length++ ){ + pc.printf( "%x " , packetBuffer[ length ] ); + } + pc.printf( "\n\r" ); + #endif + + message = 1; +} + +/****************************************************************************** * Function void SerialHandler(unsigned char ) * * This function handles the received data from the Serial Communication. @@ -135,7 +264,8 @@ * * Output: None * - * Side Effects: None + * Side Effects: Will call functions to send ACK, NACK and process a packet + * once an entire packet is received. * *****************************************************************************/ void SerialHandler(unsigned char RXByte){ @@ -370,7 +500,7 @@ buffer[buffPtr++] = RXByte; // add RXByte to buffer - #ifdef PRINTPACKETDEBUG + #ifdef DEBUG pc.printf( "Receive Buffer: " ); // debug print received packet unsigned int i = 0; for( i = 0 ; i < buffPtr ; i++ ){ @@ -398,7 +528,3 @@ } // end serial2Handler function - -#ifdef __cplusplus -} -#endif