AVR client connecting and reading ID correctly!
[goodfet] / firmware / lib / command.c
1 /*! \file command.c
2   \author Travis Goodspeed
3   \brief These functions manage command interpretation.
4 */
5
6 #include "command.h"
7 #include "platform.h"
8 #include <string.h>
9
10 unsigned char cmddata[CMDDATALEN];
11 unsigned char silent=0;
12
13 //! Transmit a string.
14 void txstring(unsigned char app,
15               unsigned char verb,
16               const char *str){
17   unsigned long len=strlen(str);
18   txhead(app,verb,len);
19   while(len--)
20     serial_tx(*(str++));
21 }
22
23 /*! \brief Transmit a debug string.
24   
25   Transmits a debugging string that is to be printed
26   out of line by the client.  This is just for record-keeping;
27   it is not considered a proper reply to a query.
28  */
29 void debugstr(const char *str){
30   txstring(0xFF,0xFF,str);
31 }
32
33 /*! \brief Transmit debug bytes.
34   
35   Transmits bytes for debugging.
36 */
37 void debugbytes(const char *bytes, unsigned int len){
38   u16 i;
39   txhead(0xFF,0xFE,len);
40   for(i=0;i<len;i++)
41     serial_tx(bytes[i]);
42 }
43
44
45 //! Transmit a header.
46 void txhead(unsigned char app,
47             unsigned char verb,
48             unsigned long len){
49   serial_tx(app);
50   serial_tx(verb);
51   //serial_tx(len); //old protocol
52   txword(len);
53 }
54
55 //! Transmit data.
56 void txdata(unsigned char app,
57             unsigned char verb,
58             unsigned long len){
59   unsigned int i=0;
60   if(silent)
61     return;
62   txhead(app,verb,len);
63   for(i=0;i<len;i++){
64     serial_tx(cmddata[i]);
65   }
66 }
67
68 //! Receive a long.
69 unsigned long rxlong(){
70   unsigned long toret=0;
71   toret=serial_rx();
72   toret|=(((long)serial_rx())<<8);
73   toret|=(((long)serial_rx())<<16);
74   toret|=(((long)serial_rx())<<24);
75   return toret;
76 }
77 //! Receive a word.
78 unsigned int rxword(){
79   unsigned long toret=0;
80   toret=serial_rx();
81   toret|=(((long)serial_rx())<<8);
82   return toret;
83 }
84 //! Transmit a long.
85 void txlong(unsigned long l){
86   serial_tx(l&0xFF);
87   l>>=8;
88   serial_tx(l&0xFF);
89   l>>=8;
90   serial_tx(l&0xFF);
91   l>>=8;
92   serial_tx(l&0xFF);
93   l>>=8;
94 }
95 //! Transmit a word.
96 void txword(unsigned int l){
97   serial_tx(l&0xFF);
98   l>>=8;
99   serial_tx(l&0xFF);
100   l>>=8;
101 }
102
103 //Be very careful changing delay().
104 //It was chosen poorly by trial and error.
105
106 //! Delay for a count.
107 void delay(unsigned int count){
108   volatile unsigned int i=count;
109   while(i--) asm("nop");
110 }
111 //! MSDelay
112 void msdelay(unsigned int ms){
113   volatile unsigned int i,j;
114   i=100;
115   while(i--){
116     j=ms;
117     while(j--) asm("nop");
118   }
119   //Using TimerA might be cleaner.
120 }