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