-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathconsole.c
More file actions
208 lines (172 loc) · 5.47 KB
/
console.c
File metadata and controls
208 lines (172 loc) · 5.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
/*----------------------------------------------------------------------------
Copyright: Jens Mundhenke jens (a) mundhenke.info
Author: Jens Mundhenke
Remarks:
known Problems: none
Version: 25.01.2009
13.02.2009 Simplified syslog
Description: universal console output functions for AVR
based on Ulrich Radig's Webserver
input has to be handled by device dependent functions
Dieses Programm ist freie Software. Sie können es unter den Bedingungen der
GNU General Public License, wie von der Free Software Foundation veröffentlicht,
weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder
(nach Ihrer Option) jeder späteren Version.
Die Veröffentlichung dieses Programms erfolgt in der Hoffnung,
daß es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE,
sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT
FÜR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License.
Sie sollten eine Kopie der GNU General Public License zusammen mit diesem
Programm erhalten haben.
Falls nicht, schreiben Sie an die Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
------------------------------------------------------------------------------*/
#include <stdlib.h>
#include <stdarg.h>
#include <ctype.h>
#include <string.h>
#include <avr/pgmspace.h>
#include "limits.h"
#include "config.h"
#include "console.h"
//----------------------------------------------------------------------------
#define CONSOLE_DEBUG(format, args...) \
{CONSOLE_PUSH(CONSOLE_SYSLOG);\
console_write_P(format , ## args);\
CONSOLE_POP;}
// kein Debug
//#define TELNET_DEBUG(...)
// the supported devices should be included here
#if USE_TELNET
#include "telnetd.h"
#endif
#if USE_USART
#include "usart.h"
#endif
#if USE_SYSLOG
#include "syslog.h"
#endif
#define CONSOLE_TX_BUFFERSIZE 60
char console_tx_buffer[CONSOLE_TX_BUFFERSIZE+1]; // plus 1 for string terminating 0
unsigned int console_tx_counter = 0;
char console_isinit = 0; // Flag, dass das Modul initialisiert ist, vorher werden Ausgaben ignoriert
unsigned int console_mode;
unsigned int cm;
//----------------------------------------------------------------------------
//Initialisierung der console
void console_init (void)
{
// Initialisiere Pufferverwaltung
console_tx_counter = 0;
// initiliaze device modules
#if USE_TELNET
if ( console_mode & CONSOLE_TELNET );
telnetd_init();
#endif
#if USE_USART
if ( console_mode & CONSOLE_USART );
// usart_init(BAUDRATE);
usart_init();
#endif
console_isinit = 1;
}
//----------------------------------------------------------------------------
//Ausgabe eines Strings
void console_write_str(char *str)
{
while (str && *str)
console_write_char(*str++);
}
//----------------------------------------------------------------------------
//Routine für die Ausgabe gepufferter Zeichen ueber zeilen-orientierte Devices
void console_flush(void)
{
if ( !console_tx_counter ) // buffer is empty
return;
console_tx_buffer[console_tx_counter] = 0; // terminate buffered string
#if USE_TELNET
if ( console_mode & CONSOLE_TELNET )
telnetd_write_str ( console_tx_buffer );
#endif
#if USE_SYSLOG
if ( console_mode & CONSOLE_SYSLOG )
syslog_send ( console_tx_buffer );
#endif
console_tx_counter = 0; // clear buffer
}
//----------------------------------------------------------------------------
//Routine für die Ausgabe eines Zeichens ueber definierte Devices
//
void console_write_char(char c)
{
if ( !console_isinit )
return;
#if USE_USART
if ( console_mode & CONSOLE_USART )
usart_write_char (c);
#endif
if ( console_mode & (CONSOLE_TELNET | CONSOLE_SYSLOG) ) {
console_tx_buffer[console_tx_counter++] = c;
if ( (console_tx_counter >= CONSOLE_TX_BUFFERSIZE - 1) || (c == '\n') ) { // Buffer ist voll oder Zeilenende, absenden
console_flush();
}
}
}
//------------------------------------------------------------------------------
void console_write_P (const char *Buffer,...)
{
va_list ap;
va_start (ap, Buffer);
int format_flag;
char str_buffer[20];
char move = 0;
char len, b;
char by;
char *ptr;
//Ausgabe der Zeichen
for(;;) {
by = *Buffer++;
if(by==0) break; // end of format string
if (by == '%') {
by = *Buffer++;
while (isdigit(by)) { // potential overflow of move
move = by - '0' + move * 10;
by = *Buffer++;
}
switch (by) {
case 's':
ptr = va_arg(ap,char *);
console_write_str(ptr);
break;
case 'c':
//Int to char
format_flag = va_arg(ap,int);
console_write_char (format_flag++);
break;
case 'i':
case 'd':
itoa(va_arg(ap,int), str_buffer,10);
goto ConversionLoop;
case 'u':
utoa(va_arg(ap,unsigned int), str_buffer,10);
goto ConversionLoop;
case 'x':
itoa(va_arg(ap,int), str_buffer,16);
//****************************
ConversionLoop:
//****************************
len = strlen (str_buffer);
b = '0';
while ( len < move ) {
console_write_char (b);
len++;
}
console_write_str (str_buffer);
move = 0;
break;
} // switch
} else
console_write_char ( by );
} // for
va_end(ap);
}