Dropped ugly 'blocks' kludge for a 16-bit length field.
[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 //! Transmit a header.
34 void txhead(unsigned char app,
35             unsigned char verb,
36             unsigned long len){
37   serial_tx(app);
38   serial_tx(verb);
39   //serial_tx(len);
40   txword(len);
41 }
42
43 //! Transmit data.
44 void txdata(unsigned char app,
45             unsigned char verb,
46             unsigned long len){
47   unsigned int i=0;
48   if(silent)
49     return;
50   txhead(app,verb,len);
51   for(i=0;i<len;i++){
52     serial_tx(cmddata[i]);
53   }
54 }
55
56 //! Receive a long.
57 unsigned long rxlong(){
58   unsigned long toret=0;
59   toret=serial_rx();
60   toret|=(((long)serial_rx())<<8);
61   toret|=(((long)serial_rx())<<16);
62   toret|=(((long)serial_rx())<<24);
63   return toret;
64 }
65 //! Receive a word.
66 unsigned int rxword(){
67   unsigned long toret=0;
68   toret=serial_rx();
69   toret|=(((long)serial_rx())<<8);
70   return toret;
71 }
72 //! Transmit a long.
73 void txlong(unsigned long l){
74   serial_tx(l&0xFF);
75   l>>=8;
76   serial_tx(l&0xFF);
77   l>>=8;
78   serial_tx(l&0xFF);
79   l>>=8;
80   serial_tx(l&0xFF);
81   l>>=8;
82 }
83 //! Transmit a word.
84 void txword(unsigned int l){
85   serial_tx(l&0xFF);
86   l>>=8;
87   serial_tx(l&0xFF);
88   l>>=8;
89 }
90
91 //Be very careful changing delay().
92 //It was chosen poorly by trial and error.
93
94 //! Delay for a count.
95 void delay(unsigned int count){
96   volatile unsigned int i=count;
97   while(i--) asm("nop");
98 }
99 //! MSDelay
100 void msdelay(unsigned int ms){
101   volatile unsigned int i,j;
102   i=100;
103   while(i--){
104     j=ms;
105     while(j--) asm("nop");
106   }
107   //Using TimerA might be cleaner.
108 }