/*! \file edpdebug.c \brief Emerald Data Protocol Debug Functions. */
//*****************************************************************************
//
// File Name : 'edpdebug.c'
// Title : Emerald Data Protocol Debug Functions
// Author : Pascal Stang - Copyright (C) 2003
// Created : 2003.09.20
// Revised : 2003.09.20
// Version : 0.1
// Target MCU : Atmel AVR series
// Editor Tabs : 4
//
// This code is distributed under the GNU Public License
// which can be found at http://www.gnu.org/licenses/gpl.txt
//
//*****************************************************************************
//----- Include Files ---------------------------------------------------------
#include <avr/io.h> // include I/O definitions (port names, pin names, etc)
#include <avr/interrupt.h> // include interrupt support
#include <avr/pgmspace.h> // include program-space support
#include "global.h" // include our global settings
#include "rprintf.h" // include printf function library
#include "debug.h" // include debug helper library
#include "input.h" // include user-input functions
#include "edp.h"
#include "edpdebug.h"
// globals
// functions
void edpDisplayCommand(u08 length, EdpCommand* edpCommand)
{
// print source and command char
rprintf("EDP SrcAddr: 0x%x Cmd: 0x%x '%c'\r\n",
edpCommand->SrcAddr,
edpCommand->Command, edpCommand->Command);
if(length-2)
{
// print data
rprintf("Data:\r\n");
debugPrintHexTable(length-2, edpCommand->Data);
}
}
void edpDisplayReply(u08 response, EdpReply* edpReply)
{
u08 i;
u08 checksum;
// display response
rprintf("EDP Response: 0x%x '%c'\r\n",response,response);
// if data was received
if(response==EDP_RESP_DATA_REPLY)
{
// do checksum on reply
checksum = edpReply->Length;
for(i=0; i<(edpReply->Length-1); i++)
{
checksum += edpReply->Data[i];
}
checksum = ~checksum;
// print message
rprintf("EDP Reply: ");
// show data received
rprintf("Length: 0x%x ",edpReply->Length);
rprintf("RxChksum=0x%x MyChksum=0x%x",edpReply->Data[edpReply->Length-1], checksum);
rprintfCRLF();
rprintf("Data:\r\n");
debugPrintHexTable((edpReply->Length-1), edpReply->Data);
rprintfCRLF();
}
}
/*
void edpDisplayReplyOld(u08 response, u08 replyLength, u08* replyData)
{
u08 i;
u08 checksum;
// display response
rprintf("EDP Response: 0x%x '%c'\r\n",response,response);
// if data was received
if(response==EDP_RESP_DATA_REPLY)
{
// do checksum on reply
checksum = replyLength;
for(i=0; i<(replyLength-1); i++)
{
checksum += replyData[i];
}
checksum = ~checksum;
// print message
rprintf("EDP Reply: ");
// show data received
rprintf("Length: 0x%x ",replyLength);
rprintf("RxChksum=0x%x MyChksum=0x%x",replyData[replyLength-1], checksum);
rprintfCRLF();
rprintf("Data:\r\n");
debugPrintHexTable((replyLength-1), replyData);
rprintfCRLF();
}
}
*/
u08 edpComposeCommand(u08 srcEdpAddr, u08* cmdBuffer)
{
u08 string[80];
u08 len;
u08 i;
// instructions
rprintfProgStrM("Enter EDP Command, format [c][p1][p2][p3]...[pN]\r\n");
rprintfProgStrM("[c] is command char, [px] parameters in 2-digit hex\r\n");
// get user input
rprintfProgStrM("EDP Command>");
len = inputString(0x0D, 80, string);
rprintfCRLF();
// check for null user input
if(!len)
{
rprintfProgStrM("ERROR: No command\r\n");
// return immediately with zero command length
return 0;
}
// prepare command
cmdBuffer[0] = srcEdpAddr;
cmdBuffer[1] = string[0];
for(i=0; i<len/2; i++)
{
cmdBuffer[i+2] = asciiHexToByte(&string[1+(i*2)]);
}
// return command length
return 2+(len/2);
}
void edpRunCommand(u08 destEdpAddr, u08 cmdLength, u08* cmdBuffer)
{
u08 response;
EdpReply* edpReply;
u08 retval;
EdpCommand* edpCommand = (EdpCommand*)cmdBuffer;
// send command
rprintf("Sending Command: 0x%x '%c' ->",edpCommand->Command,edpCommand->Command);
retval = edpSendCommand(destEdpAddr, cmdLength, edpCommand);
// handle result values
if(retval == EDP_COMMAND_OK)
{
// command sent successfully
rprintfProgStrM("Send Success!\r\n");
}
else if(retval == EDP_COMMAND_NODEV)
{
// device did not exist
rprintfProgStrM("Send Failed->NO DEVICE!\r\n");
rprintf("No EDP device could be contacted at address 0x%x.\r\n", destEdpAddr);
rprintfProgStrM("The device may be busy or not responding.\r\n");
rprintfProgStrM("Check target device and I2C bus cabling.\r\n");
// return immediately
return;
}
else
{
// other error
rprintfProgStrM("Send Failed->Unspecified Error!\r\n");
// return immediately
return;
}
// get the reply, if any, from the command
retval = edpGetCommandReply(&response, &edpReply);
// handle result values
if(retval == EDP_REPLY_BADCHKSUM)
{
rprintf("**** Reply has bad checksum ****\r\n");
}
// display the reply
edpDisplayReply(response, edpReply);
}
|