|
darius@0
|
1 |
/*
|
|
darius@9
|
2 |
* Test various AVR bits and pieces
|
|
darius@9
|
3 |
*
|
|
darius@41
|
4 |
* Copyright (c) 2008
|
|
darius@0
|
5 |
* Daniel O'Connor <darius@dons.net.au>. All rights reserved.
|
|
darius@0
|
6 |
*
|
|
darius@0
|
7 |
* Redistribution and use in source and binary forms, with or without
|
|
darius@0
|
8 |
* modification, are permitted provided that the following conditions
|
|
darius@0
|
9 |
* are met:
|
|
darius@0
|
10 |
* 1. Redistributions of source code must retain the above copyright
|
|
darius@0
|
11 |
* notice, this list of conditions and the following disclaimer.
|
|
darius@0
|
12 |
* 2. Redistributions in binary form must reproduce the above copyright
|
|
darius@0
|
13 |
* notice, this list of conditions and the following disclaimer in the
|
|
darius@0
|
14 |
* documentation and/or other materials provided with the distribution.
|
|
darius@0
|
15 |
*
|
|
darius@0
|
16 |
* THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
darius@0
|
17 |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
darius@0
|
18 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
darius@0
|
19 |
* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
darius@0
|
20 |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
darius@0
|
21 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
darius@0
|
22 |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
darius@0
|
23 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
darius@0
|
24 |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
darius@0
|
25 |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
darius@0
|
26 |
* SUCH DAMAGE.
|
|
darius@0
|
27 |
*/
|
|
darius@0
|
28 |
|
|
darius@0
|
29 |
#include <avr/io.h>
|
|
darius@0
|
30 |
#include <avr/interrupt.h>
|
|
darius@0
|
31 |
#include <avr/pgmspace.h>
|
|
darius@41
|
32 |
#include <stdio.h>
|
|
darius@0
|
33 |
#include <string.h>
|
|
darius@4
|
34 |
#include <ctype.h>
|
|
darius@13
|
35 |
#include <stdlib.h>
|
|
darius@24
|
36 |
#include <util/delay.h>
|
|
darius@47
|
37 |
#include <avr/wdt.h>
|
|
darius@0
|
38 |
|
|
darius@41
|
39 |
#include "cons.h"
|
|
darius@0
|
40 |
#include "1wire.h"
|
|
darius@37
|
41 |
#ifdef WITHUSB
|
|
darius@24
|
42 |
#include "usb.h"
|
|
darius@37
|
43 |
#endif
|
|
darius@41
|
44 |
#include "tempctrl.h"
|
|
darius@60
|
45 |
#include "ds1307.h"
|
|
darius@24
|
46 |
|
|
darius@47
|
47 |
/*
|
|
darius@47
|
48 |
* Mirror of the MCUCSR register, taken early during startup.
|
|
darius@47
|
49 |
*/
|
|
darius@47
|
50 |
uint8_t mcucsr __attribute__((section(".noinit")));
|
|
darius@47
|
51 |
|
|
darius@24
|
52 |
void process_cmd(void);
|
|
darius@0
|
53 |
|
|
darius@47
|
54 |
/*
|
|
darius@47
|
55 |
* Read out and reset MCUCSR early during startup.
|
|
darius@47
|
56 |
*/
|
|
darius@47
|
57 |
void handle_mcucsr(void)
|
|
darius@47
|
58 |
__attribute__((section(".init3")))
|
|
darius@47
|
59 |
__attribute__((naked));
|
|
darius@47
|
60 |
void handle_mcucsr(void) {
|
|
darius@53
|
61 |
wdt_disable();
|
|
darius@47
|
62 |
mcucsr = MCUCSR;
|
|
darius@47
|
63 |
MCUCSR = 0;
|
|
darius@47
|
64 |
}
|
|
darius@47
|
65 |
|
|
darius@0
|
66 |
int
|
|
darius@0
|
67 |
main(void) {
|
|
darius@24
|
68 |
/* Disable interrupts while we frob stuff */
|
|
darius@24
|
69 |
cli();
|
|
darius@24
|
70 |
|
|
darius@41
|
71 |
#if 0
|
|
darius@24
|
72 |
/* Disable JTAG (yes twice) */
|
|
darius@24
|
73 |
MCUCSR |= _BV(JTD);
|
|
darius@24
|
74 |
MCUCSR |= _BV(JTD);
|
|
darius@37
|
75 |
#endif
|
|
darius@37
|
76 |
|
|
darius@37
|
77 |
#ifdef WITHUSB
|
|
darius@24
|
78 |
/* USB data bus (7:0) */
|
|
darius@24
|
79 |
DDRA = 0x00;
|
|
darius@24
|
80 |
PORTA = 0x00;
|
|
darius@24
|
81 |
|
|
darius@37
|
82 |
/* USB control (4:0) */
|
|
darius@37
|
83 |
DDRB = 0x0d;
|
|
darius@24
|
84 |
PORTB = 0x00;
|
|
darius@37
|
85 |
#else
|
|
darius@37
|
86 |
DDRA = 0xff;
|
|
darius@37
|
87 |
PORTA = 0x00;
|
|
darius@54
|
88 |
|
|
darius@54
|
89 |
DDRB = 0x00;
|
|
darius@54
|
90 |
PORTB = 0x00;
|
|
darius@54
|
91 |
|
|
darius@37
|
92 |
#endif
|
|
darius@24
|
93 |
/* GPIO (0:7) */
|
|
darius@24
|
94 |
DDRC = 0xff;
|
|
darius@24
|
95 |
PORTC = 0x00;
|
|
darius@24
|
96 |
|
|
darius@37
|
97 |
/* USART (0:1), IDBus (2:5), 485 (6:6), GPIO (7:7) */
|
|
darius@37
|
98 |
DDRD = 0xf7;
|
|
darius@37
|
99 |
PORTD = 0xf7;
|
|
darius@37
|
100 |
|
|
darius@54
|
101 |
#ifndef WITHUSB
|
|
darius@54
|
102 |
/* Beep
|
|
darius@54
|
103 |
*
|
|
darius@54
|
104 |
* Fpwm = Fclk / (N * 510)
|
|
darius@54
|
105 |
* = 16e6 / (8 * 510)
|
|
darius@54
|
106 |
* = 3921Hz
|
|
darius@54
|
107 |
*
|
|
darius@54
|
108 |
* Behind ifndef because PB3 is A0 on PDI chip
|
|
darius@54
|
109 |
*
|
|
darius@54
|
110 |
* Phase correct PWM, non-inverted output, divide by 8 */
|
|
darius@54
|
111 |
TCCR0 = _BV(WGM00) | _BV(WGM11) | _BV(COM00) | _BV(COM01) | _BV(CS01);
|
|
darius@56
|
112 |
OCR0 = 128;
|
|
darius@54
|
113 |
#endif
|
|
darius@54
|
114 |
|
|
darius@37
|
115 |
/* Set up the one wire stuff */
|
|
darius@37
|
116 |
OWInit();
|
|
darius@24
|
117 |
|
|
darius@60
|
118 |
/* Setup IIC */
|
|
darius@60
|
119 |
ds1307_init();
|
|
darius@60
|
120 |
|
|
darius@24
|
121 |
/* Init UART */
|
|
darius@41
|
122 |
cons_init();
|
|
darius@24
|
123 |
|
|
darius@60
|
124 |
/* Init temperature control stuff */
|
|
darius@60
|
125 |
tempctrl_init();
|
|
darius@60
|
126 |
|
|
darius@41
|
127 |
printf_P(PSTR("\r\n\r\n===============\r\n"
|
|
darius@41
|
128 |
"Inited!\r\n\r\n"));
|
|
darius@24
|
129 |
|
|
darius@47
|
130 |
if ((mcucsr & _BV(PORF)) == _BV(PORF))
|
|
darius@47
|
131 |
printf_P(PSTR("Power on reset\r\n"));
|
|
darius@47
|
132 |
|
|
darius@47
|
133 |
if ((mcucsr & _BV(EXTRF)) == _BV(EXTRF))
|
|
darius@47
|
134 |
printf_P(PSTR("External reset\r\n"));
|
|
darius@47
|
135 |
|
|
darius@47
|
136 |
if ((mcucsr & _BV(BORF)) == _BV(BORF))
|
|
darius@47
|
137 |
printf_P(PSTR("Brown-out reset\r\n"));
|
|
darius@47
|
138 |
|
|
darius@47
|
139 |
if ((mcucsr & _BV(WDRF)) == _BV(WDRF))
|
|
darius@47
|
140 |
printf_P(PSTR("Watchdog reset\r\n"));
|
|
darius@47
|
141 |
|
|
darius@47
|
142 |
if ((mcucsr & _BV(JTRF)) == _BV(JTRF))
|
|
darius@47
|
143 |
printf_P(PSTR("JTAG reset\r\n"));
|
|
darius@47
|
144 |
|
|
darius@24
|
145 |
/* Ready to go! */
|
|
darius@24
|
146 |
sei();
|
|
darius@24
|
147 |
|
|
darius@47
|
148 |
/*
|
|
darius@47
|
149 |
* Enable the watchdog with the largest prescaler. Will cause a
|
|
darius@47
|
150 |
* watchdog reset after approximately 2 s @ Vcc = 5 V
|
|
darius@47
|
151 |
*
|
|
darius@47
|
152 |
* Gets reset in the loop below and in the tempctrl.c timer IRQ
|
|
darius@47
|
153 |
*/
|
|
darius@47
|
154 |
wdt_enable(WDTO_2S);
|
|
darius@47
|
155 |
|
|
darius@37
|
156 |
#ifdef WITHUSB
|
|
darius@41
|
157 |
printf_P(PSTR("Calling usb_init\r\n"));
|
|
darius@24
|
158 |
usb_init();
|
|
darius@41
|
159 |
printf_P(PSTR("done\r\n"));
|
|
darius@41
|
160 |
_delay_us(1000);
|
|
darius@37
|
161 |
#endif
|
|
darius@41
|
162 |
printf_P(PSTR("> "));
|
|
darius@24
|
163 |
cmd.state = 0;
|
|
darius@24
|
164 |
|
|
darius@24
|
165 |
/* Wait for user input or an "interrupt" */
|
|
darius@24
|
166 |
while (1) {
|
|
darius@47
|
167 |
wdt_reset();
|
|
darius@47
|
168 |
|
|
darius@41
|
169 |
tempctrl_update();
|
|
darius@41
|
170 |
|
|
darius@24
|
171 |
if (cmd.state == 255) {
|
|
darius@24
|
172 |
process_cmd();
|
|
darius@41
|
173 |
printf_P(PSTR("> "));
|
|
darius@24
|
174 |
/* Allow new characters to be processed */
|
|
darius@24
|
175 |
cmd.state = 0;
|
|
darius@24
|
176 |
}
|
|
darius@24
|
177 |
|
|
darius@37
|
178 |
#ifdef WITHUSB
|
|
darius@37
|
179 |
if (!(PDICTL & _BV(PDIINT)))
|
|
darius@24
|
180 |
usb_intr();
|
|
darius@37
|
181 |
#endif
|
|
darius@24
|
182 |
}
|
|
darius@24
|
183 |
}
|
|
darius@24
|
184 |
|
|
darius@24
|
185 |
void
|
|
darius@24
|
186 |
process_cmd(void) {
|
|
darius@52
|
187 |
uint8_t ROM[8], crc, buf[9], temp;
|
|
darius@13
|
188 |
int8_t i, arg;
|
|
darius@52
|
189 |
int16_t t;
|
|
darius@15
|
190 |
|
|
darius@24
|
191 |
/* User just pressed enter */
|
|
darius@24
|
192 |
if (cmd.len == 0)
|
|
darius@24
|
193 |
return;
|
|
darius@24
|
194 |
|
|
darius@51
|
195 |
if (!strcasecmp_P((char *)cmd.buf, PSTR("?")) ||
|
|
darius@51
|
196 |
!strcasecmp_P((char *)cmd.buf, PSTR("help"))) {
|
|
darius@41
|
197 |
printf_P(PSTR("rs Reset and check for presence\r\n"
|
|
darius@41
|
198 |
"sr Search the bus for ROMs\r\n"
|
|
darius@41
|
199 |
"re Read a bit\r\n"
|
|
darius@41
|
200 |
"rb Read a byte\r\n"
|
|
darius@51
|
201 |
"wr bit Write a bit\r\n"
|
|
darius@51
|
202 |
"wb byte Write a byte (hex)\r\n"
|
|
darius@51
|
203 |
"wc cmd [ROMID] Write command\r\n"
|
|
darius@51
|
204 |
"te ROMID Read the temperature from a DS1820\r\n"
|
|
darius@51
|
205 |
"in port Read from a port\r\n"
|
|
darius@51
|
206 |
"ou port val Write to a port (val in hex)\r\n"
|
|
darius@51
|
207 |
"dd port [val] Read/write DDR for a port (val in hex)\r\n"
|
|
darius@51
|
208 |
"rt ROMID Read DS2502 status page\r\n"
|
|
darius@51
|
209 |
"we ROMID adr val Write data into a DS2502 PROM (adr & val in hex)\r\n"
|
|
darius@51
|
210 |
"rr ROMID Read DS2502 PROM\r\n"
|
|
darius@65
|
211 |
"zz Reset MCU\r\n"
|
|
darius@60
|
212 |
"gc Get time of day\r\n"
|
|
darius@60
|
213 |
"sc time Set time of day (time is YYYY/MM/DD HH:MM:SS)\r\n"
|
|
darius@51
|
214 |
#ifdef WITHUSB
|
|
darius@51
|
215 |
"us Generate USB data\r\n"
|
|
darius@51
|
216 |
#endif
|
|
darius@63
|
217 |
"tc ... Temperature control related (tc help for more)\r\n"));
|
|
darius@41
|
218 |
|
|
darius@24
|
219 |
return;
|
|
darius@51
|
220 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("zz"), 2)) {
|
|
darius@51
|
221 |
cli();
|
|
darius@51
|
222 |
wdt_enable(WDTO_15MS);
|
|
darius@51
|
223 |
for (;;)
|
|
darius@51
|
224 |
;
|
|
darius@51
|
225 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("rs"), 2)) {
|
|
darius@41
|
226 |
printf_P(PSTR("Resetting... "));
|
|
darius@24
|
227 |
|
|
darius@24
|
228 |
if (OWTouchReset() == 1)
|
|
darius@41
|
229 |
printf_P(PSTR("No presence pulse found\r\n"));
|
|
darius@24
|
230 |
else
|
|
darius@41
|
231 |
printf_P(PSTR("Presence pulse found\r\n"));
|
|
darius@51
|
232 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("re"), 2)) {
|
|
darius@24
|
233 |
if (OWReadBit())
|
|
darius@41
|
234 |
printf_P(PSTR("Read a 1\r\n"));
|
|
darius@24
|
235 |
else
|
|
darius@41
|
236 |
printf_P(PSTR("Read a 0\r\n"));
|
|
darius@51
|
237 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("rb"), 2)) {
|
|
darius@41
|
238 |
printf_P(PSTR("Read a 0x%02x\r\n"), OWReadByte());
|
|
darius@51
|
239 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("wr"), 2)) {
|
|
darius@24
|
240 |
arg = strtol((char *)cmd.buf + 3, (char **)NULL, 10);
|
|
darius@24
|
241 |
OWWriteBit(arg);
|
|
darius@41
|
242 |
printf_P(PSTR("Wrote a %c\r\n"), arg ? '1' : '0');
|
|
darius@51
|
243 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("wb"), 2)) {
|
|
darius@24
|
244 |
arg = (int)strtol((char *)cmd.buf + 3, (char **)NULL, 16);
|
|
darius@24
|
245 |
OWWriteByte(arg);
|
|
darius@51
|
246 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("rt"), 2)) {
|
|
darius@51
|
247 |
if (sscanf_P((char *)cmd.buf, PSTR("rt %hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx"),
|
|
darius@51
|
248 |
&ROM[0], &ROM[1], &ROM[2], &ROM[3],
|
|
darius@51
|
249 |
&ROM[4], &ROM[5], &ROM[6], &ROM[7]) != 8) {
|
|
darius@41
|
250 |
printf_P(PSTR("Unable to parse ROM ID\r\n"));
|
|
darius@37
|
251 |
return;
|
|
darius@37
|
252 |
}
|
|
darius@51
|
253 |
|
|
darius@37
|
254 |
if (ROM[0] != OW_FAMILY_ROM) {
|
|
darius@41
|
255 |
printf_P(PSTR("ROM specified isn't a DS2502\r\n"));
|
|
darius@37
|
256 |
return;
|
|
darius@37
|
257 |
}
|
|
darius@37
|
258 |
|
|
darius@37
|
259 |
if (OWTouchReset() != 0) {
|
|
darius@41
|
260 |
printf_P(PSTR("No presence\r\n"));
|
|
darius@37
|
261 |
return;
|
|
darius@37
|
262 |
}
|
|
darius@37
|
263 |
|
|
darius@37
|
264 |
crc = 0;
|
|
darius@37
|
265 |
|
|
darius@37
|
266 |
OWCRC(OW_READ_STATUS, &crc);
|
|
darius@37
|
267 |
OWSendCmd(ROM, OW_READ_STATUS);
|
|
darius@37
|
268 |
|
|
darius@37
|
269 |
OWWriteByte(0x00);
|
|
darius@37
|
270 |
OWCRC(0x00, &crc);
|
|
darius@37
|
271 |
|
|
darius@37
|
272 |
OWWriteByte(0x00);
|
|
darius@37
|
273 |
OWCRC(0x00, &crc);
|
|
darius@37
|
274 |
|
|
darius@37
|
275 |
if (crc != OWReadByte()) {
|
|
darius@41
|
276 |
printf_P(PSTR("CRC mismatch on command & address\r\n"));
|
|
darius@37
|
277 |
return;
|
|
darius@37
|
278 |
}
|
|
darius@37
|
279 |
|
|
darius@37
|
280 |
crc = 0;
|
|
darius@37
|
281 |
for (i = 0; i < 8; i++) {
|
|
darius@37
|
282 |
temp = OWReadByte();
|
|
darius@41
|
283 |
printf_P(PSTR("%02x "), temp);
|
|
darius@37
|
284 |
OWCRC(temp, &crc);
|
|
darius@37
|
285 |
}
|
|
darius@41
|
286 |
printf_P(PSTR("\r\n"));
|
|
darius@37
|
287 |
if (crc != OWReadByte()) {
|
|
darius@41
|
288 |
printf_P(PSTR("CRC mismatch on data\r\n"));
|
|
darius@37
|
289 |
return;
|
|
darius@37
|
290 |
}
|
|
darius@51
|
291 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("we"), 2)) {
|
|
darius@51
|
292 |
uint8_t adr, data;
|
|
darius@51
|
293 |
|
|
darius@51
|
294 |
if (sscanf_P((char *)cmd.buf, PSTR("we %hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx %hhx %hhx"),
|
|
darius@51
|
295 |
&ROM[0], &ROM[1], &ROM[2], &ROM[3],
|
|
darius@51
|
296 |
&ROM[4], &ROM[5], &ROM[6], &ROM[7],
|
|
darius@51
|
297 |
&adr, &data) != 10) {
|
|
darius@41
|
298 |
printf_P(PSTR("Unable to parse ROM ID\r\n"));
|
|
darius@37
|
299 |
return;
|
|
darius@37
|
300 |
}
|
|
darius@37
|
301 |
|
|
darius@37
|
302 |
if (ROM[0] != OW_FAMILY_ROM) {
|
|
darius@51
|
303 |
printf_P(PSTR("ID specified isn't a ROM\r\n"));
|
|
darius@37
|
304 |
return;
|
|
darius@37
|
305 |
}
|
|
darius@37
|
306 |
|
|
darius@37
|
307 |
if (OWTouchReset() != 0) {
|
|
darius@41
|
308 |
printf_P(PSTR("No presence\r\n"));
|
|
darius@37
|
309 |
return;
|
|
darius@37
|
310 |
}
|
|
darius@37
|
311 |
|
|
darius@51
|
312 |
printf_P(PSTR("OWProgROM returned %S\r\n"), OWProgROM_Status[OWProgROM(ROM, buf[0], 2, &buf[1], 0, 0)]);
|
|
darius@51
|
313 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("rr"), 2)) {
|
|
darius@51
|
314 |
if (sscanf_P((char *)cmd.buf, PSTR("rr %hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx"),
|
|
darius@51
|
315 |
&ROM[0], &ROM[1], &ROM[2], &ROM[3],
|
|
darius@51
|
316 |
&ROM[4], &ROM[5], &ROM[6], &ROM[7]) != 8) {
|
|
darius@41
|
317 |
printf_P(PSTR("Unable to parse ROM ID\r\n"));
|
|
darius@37
|
318 |
return;
|
|
darius@37
|
319 |
}
|
|
darius@37
|
320 |
|
|
darius@37
|
321 |
if (ROM[0] != OW_FAMILY_ROM) {
|
|
darius@41
|
322 |
printf_P(PSTR("ROM specified isn't a ROM\r\n"));
|
|
darius@37
|
323 |
return;
|
|
darius@37
|
324 |
}
|
|
darius@37
|
325 |
|
|
darius@37
|
326 |
crc = 0;
|
|
darius@37
|
327 |
OWSendCmd(ROM, OW_READ_MEMORY);
|
|
darius@37
|
328 |
OWCRC(OW_READ_MEMORY, &crc);
|
|
darius@37
|
329 |
|
|
darius@37
|
330 |
OWWriteByte(0x00);
|
|
darius@37
|
331 |
OWCRC(0x00, &crc);
|
|
darius@37
|
332 |
|
|
darius@37
|
333 |
OWWriteByte(0x00);
|
|
darius@37
|
334 |
OWCRC(0x00, &crc);
|
|
darius@37
|
335 |
|
|
darius@37
|
336 |
if (crc != OWReadByte()) {
|
|
darius@41
|
337 |
printf_P(PSTR("CRC mismatch on command & address\r\n"));
|
|
darius@37
|
338 |
return;
|
|
darius@37
|
339 |
}
|
|
darius@37
|
340 |
|
|
darius@37
|
341 |
crc = 0;
|
|
darius@37
|
342 |
for (buf[0] = 0; buf[0] < 128; buf[0]++) {
|
|
darius@37
|
343 |
buf[1] = OWReadByte();
|
|
darius@37
|
344 |
if (buf[0] > 0) {
|
|
darius@37
|
345 |
if (buf[0] % 16 != 0)
|
|
darius@41
|
346 |
printf_P(PSTR(" "));
|
|
darius@37
|
347 |
else
|
|
darius@41
|
348 |
printf_P(PSTR("\r\n"));
|
|
darius@37
|
349 |
}
|
|
darius@37
|
350 |
|
|
darius@41
|
351 |
printf_P(PSTR("%02x"), buf[1]);
|
|
darius@37
|
352 |
OWCRC(buf[1], &crc);
|
|
darius@37
|
353 |
}
|
|
darius@41
|
354 |
printf_P(PSTR("\r\n"));
|
|
darius@37
|
355 |
if (crc != OWReadByte()) {
|
|
darius@41
|
356 |
printf_P(PSTR("CRC mismatch on data\r\n"));
|
|
darius@37
|
357 |
return;
|
|
darius@37
|
358 |
}
|
|
darius@37
|
359 |
|
|
darius@51
|
360 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("wc"), 2)) {
|
|
darius@51
|
361 |
uint8_t c;
|
|
darius@51
|
362 |
|
|
darius@51
|
363 |
i = sscanf_P((char *)cmd.buf, PSTR("wc %hhx %hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx"),
|
|
darius@51
|
364 |
&ROM[0], &ROM[1], &ROM[2], &ROM[3],
|
|
darius@51
|
365 |
&ROM[4], &ROM[5], &ROM[6], &ROM[7],
|
|
darius@51
|
366 |
&c);
|
|
darius@51
|
367 |
|
|
darius@51
|
368 |
if (i != 1 && i != 9) {
|
|
darius@51
|
369 |
printf_P(PSTR("Incorrect usage\r\n"));
|
|
darius@24
|
370 |
return;
|
|
darius@24
|
371 |
}
|
|
darius@24
|
372 |
|
|
darius@51
|
373 |
if (i == 1) {
|
|
darius@51
|
374 |
OWSendCmd(i == 1 ? NULL : ROM, c);
|
|
darius@24
|
375 |
return;
|
|
darius@24
|
376 |
}
|
|
darius@51
|
377 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("te"), 2)) {
|
|
darius@51
|
378 |
if (sscanf_P((char *)cmd.buf, PSTR("te %hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx"),
|
|
darius@51
|
379 |
&ROM[0], &ROM[1], &ROM[2], &ROM[3],
|
|
darius@51
|
380 |
&ROM[4], &ROM[5], &ROM[6], &ROM[7]) != 8) {
|
|
darius@41
|
381 |
printf_P(PSTR("Unable to parse ROM ID\r\n"));
|
|
darius@24
|
382 |
return;
|
|
darius@24
|
383 |
}
|
|
darius@0
|
384 |
|
|
darius@51
|
385 |
t = OWGetTemp(ROM);
|
|
darius@51
|
386 |
switch (t) {
|
|
darius@51
|
387 |
case OW_TEMP_WRONG_FAM:
|
|
darius@51
|
388 |
printf_P(PSTR("ROM specified isn't a temperature sensor\r\n"));
|
|
darius@51
|
389 |
break;
|
|
darius@0
|
390 |
|
|
darius@51
|
391 |
case OW_TEMP_CRC_ERR:
|
|
darius@51
|
392 |
printf_P(PSTR("CRC mismatch\r\n"));
|
|
darius@51
|
393 |
break;
|
|
darius@51
|
394 |
|
|
darius@51
|
395 |
case OW_TEMP_NO_ROM:
|
|
darius@51
|
396 |
printf_P(PSTR("No ROM found\r\n"));
|
|
darius@51
|
397 |
break;
|
|
darius@51
|
398 |
|
|
darius@51
|
399 |
default:
|
|
darius@51
|
400 |
printf_P(PSTR("%d.%02d\r\n"), GETWHOLE(t), GETFRAC(t));
|
|
darius@51
|
401 |
break;
|
|
darius@24
|
402 |
}
|
|
darius@51
|
403 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("sr"), 2)) {
|
|
darius@24
|
404 |
memset(ROM, 0, 8);
|
|
darius@10
|
405 |
|
|
darius@24
|
406 |
i = OWFirst(ROM, 1, 0);
|
|
darius@24
|
407 |
do {
|
|
darius@24
|
408 |
switch (i) {
|
|
darius@10
|
409 |
case OW_BADWIRE:
|
|
darius@41
|
410 |
printf_P(PSTR("Presence pulse, but no module found, bad module/cabling?\r\n"));
|
|
darius@10
|
411 |
break;
|
|
darius@10
|
412 |
|
|
darius@10
|
413 |
case OW_NOPRESENCE:
|
|
darius@41
|
414 |
printf_P(PSTR("No presence pulse found\r\n"));
|
|
darius@10
|
415 |
break;
|
|
darius@10
|
416 |
|
|
darius@10
|
417 |
case OW_BADCRC:
|
|
darius@41
|
418 |
printf_P(PSTR("Bad CRC\r\n"));
|
|
darius@10
|
419 |
break;
|
|
darius@10
|
420 |
|
|
darius@10
|
421 |
case OW_NOMODULES:
|
|
darius@10
|
422 |
case OW_FOUND:
|
|
darius@10
|
423 |
break;
|
|
darius@10
|
424 |
|
|
darius@10
|
425 |
default:
|
|
darius@41
|
426 |
printf_P(PSTR("Unknown error from 1 wire library\r\n"));
|
|
darius@10
|
427 |
break;
|
|
darius@24
|
428 |
}
|
|
darius@10
|
429 |
|
|
darius@24
|
430 |
if (i != OW_FOUND)
|
|
darius@24
|
431 |
break;
|
|
darius@13
|
432 |
|
|
darius@41
|
433 |
for (i = 0; i < 8; i++)
|
|
darius@41
|
434 |
printf_P(PSTR("%02x%S"), ROM[i], i == 7 ? PSTR("\r\n") : PSTR(":"));
|
|
darius@10
|
435 |
|
|
darius@24
|
436 |
i = OWNext(ROM, 1, 0);
|
|
darius@24
|
437 |
} while (1);
|
|
darius@51
|
438 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("in"), 2)) {
|
|
darius@51
|
439 |
uint8_t inp;
|
|
darius@51
|
440 |
|
|
darius@24
|
441 |
switch (tolower(cmd.buf[3])) {
|
|
darius@24
|
442 |
case 'a':
|
|
darius@51
|
443 |
inp = PINA;
|
|
darius@24
|
444 |
break;
|
|
darius@24
|
445 |
|
|
darius@24
|
446 |
case 'b':
|
|
darius@51
|
447 |
inp = PINB;
|
|
darius@24
|
448 |
break;
|
|
darius@24
|
449 |
|
|
darius@24
|
450 |
case 'c':
|
|
darius@51
|
451 |
inp = PINC;
|
|
darius@24
|
452 |
break;
|
|
darius@24
|
453 |
|
|
darius@24
|
454 |
case 'd':
|
|
darius@51
|
455 |
inp = PIND;
|
|
darius@24
|
456 |
break;
|
|
darius@24
|
457 |
|
|
darius@24
|
458 |
default:
|
|
darius@41
|
459 |
printf_P(PSTR("Unknown port\r\n"));
|
|
darius@24
|
460 |
return;
|
|
darius@0
|
461 |
}
|
|
darius@51
|
462 |
printf_P(PSTR("0x%02x\r\n"), inp);
|
|
darius@51
|
463 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("ou"), 2)) {
|
|
darius@51
|
464 |
char port;
|
|
darius@51
|
465 |
int val;
|
|
darius@51
|
466 |
|
|
darius@51
|
467 |
if (sscanf_P((char *)cmd.buf, PSTR("ou %c %x"), &port, &val) != 2) {
|
|
darius@51
|
468 |
printf_P(PSTR("Unable to parse ou arguments\r\n"));
|
|
darius@51
|
469 |
return;
|
|
darius@51
|
470 |
}
|
|
darius@51
|
471 |
|
|
darius@51
|
472 |
switch (port) {
|
|
darius@24
|
473 |
case 'a':
|
|
darius@51
|
474 |
PORTA = val & 0xff;
|
|
darius@24
|
475 |
break;
|
|
darius@24
|
476 |
|
|
darius@24
|
477 |
case 'b':
|
|
darius@51
|
478 |
PORTB = val & 0xff;
|
|
darius@24
|
479 |
break;
|
|
darius@24
|
480 |
|
|
darius@24
|
481 |
case 'c':
|
|
darius@51
|
482 |
PORTC = val & 0xff;
|
|
darius@24
|
483 |
break;
|
|
darius@24
|
484 |
|
|
darius@24
|
485 |
case 'd':
|
|
darius@51
|
486 |
PORTD = val & 0xff;
|
|
darius@24
|
487 |
break;
|
|
darius@24
|
488 |
|
|
darius@24
|
489 |
default:
|
|
darius@41
|
490 |
printf_P(PSTR("Unknown port\r\n"));
|
|
darius@24
|
491 |
return;
|
|
darius@24
|
492 |
}
|
|
darius@51
|
493 |
printf_P(PSTR("PORT%c <= 0x%02x\r\n"), toupper(port), val);
|
|
darius@51
|
494 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("dd"), 2)) {
|
|
darius@51
|
495 |
char port;
|
|
darius@51
|
496 |
uint8_t val;
|
|
darius@51
|
497 |
int num;
|
|
darius@51
|
498 |
|
|
darius@51
|
499 |
num = sscanf_P((char *)cmd.buf, PSTR("dd %c %x"), &port, &val);
|
|
darius@51
|
500 |
|
|
darius@51
|
501 |
if (num != 2 && num != 3) {
|
|
darius@51
|
502 |
printf_P(PSTR("Unable to parse dd arguments\r\n"));
|
|
darius@51
|
503 |
return;
|
|
darius@51
|
504 |
}
|
|
darius@51
|
505 |
|
|
darius@51
|
506 |
if (num == 2) {
|
|
darius@51
|
507 |
switch (port) {
|
|
darius@51
|
508 |
case 'a':
|
|
darius@51
|
509 |
val = DDRA;
|
|
darius@51
|
510 |
break;
|
|
darius@51
|
511 |
|
|
darius@51
|
512 |
case 'b':
|
|
darius@51
|
513 |
val = DDRB;
|
|
darius@51
|
514 |
break;
|
|
darius@51
|
515 |
|
|
darius@51
|
516 |
case 'c':
|
|
darius@51
|
517 |
val = DDRC;
|
|
darius@51
|
518 |
break;
|
|
darius@63
|
519 |
|
|
darius@51
|
520 |
case 'd':
|
|
darius@51
|
521 |
val = DDRD;
|
|
darius@51
|
522 |
break;
|
|
darius@37
|
523 |
|
|
darius@51
|
524 |
default:
|
|
darius@51
|
525 |
printf_P(PSTR("Unknown port\r\n"));
|
|
darius@51
|
526 |
return;
|
|
darius@51
|
527 |
}
|
|
darius@51
|
528 |
printf_P(PSTR("DDR%c => 0x%02x\r\n"), toupper(port), val);
|
|
darius@51
|
529 |
} else {
|
|
darius@51
|
530 |
switch (port) {
|
|
darius@51
|
531 |
case 'a':
|
|
darius@51
|
532 |
DDRA = val & 0xff;
|
|
darius@51
|
533 |
break;
|
|
darius@37
|
534 |
|
|
darius@51
|
535 |
case 'b':
|
|
darius@51
|
536 |
DDRB = val & 0xff;
|
|
darius@51
|
537 |
break;
|
|
darius@37
|
538 |
|
|
darius@51
|
539 |
case 'c':
|
|
darius@51
|
540 |
DDRC = val & 0xff;
|
|
darius@51
|
541 |
break;
|
|
darius@37
|
542 |
|
|
darius@51
|
543 |
case 'd':
|
|
darius@51
|
544 |
DDRD = val & 0xff;
|
|
darius@51
|
545 |
break;
|
|
darius@51
|
546 |
|
|
darius@51
|
547 |
default:
|
|
darius@51
|
548 |
printf_P(PSTR("Unknown port\r\n"));
|
|
darius@51
|
549 |
return;
|
|
darius@51
|
550 |
}
|
|
darius@51
|
551 |
printf_P(PSTR("DDR%c <= 0x%02x\r\n"), toupper(port), val);
|
|
darius@37
|
552 |
}
|
|
darius@51
|
553 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("tc"), 2)) {
|
|
darius@41
|
554 |
tempctrl_cmd((char *)cmd.buf);
|
|
darius@37
|
555 |
#ifdef WITHUSB
|
|
darius@51
|
556 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("us"), 2)) {
|
|
darius@24
|
557 |
usb_gendata();
|
|
darius@37
|
558 |
#endif
|
|
darius@60
|
559 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("gc"), 2)) {
|
|
darius@60
|
560 |
ds1307_printtime(PSTR(""), PSTR("\r\n"));
|
|
darius@60
|
561 |
} else if (!strncasecmp_P((char *)cmd.buf, PSTR("sc"), 2)) {
|
|
darius@60
|
562 |
if (cmd.len < 17) {
|
|
darius@60
|
563 |
printf_P(PSTR("Command not long enough\r\n"));
|
|
darius@60
|
564 |
} else {
|
|
darius@63
|
565 |
if (ds1307_settod((char *)cmd.buf + 3) != 1)
|
|
darius@60
|
566 |
printf_P(PSTR("Unable to set time of day\r\n"));
|
|
darius@60
|
567 |
}
|
|
darius@24
|
568 |
} else {
|
|
darius@51
|
569 |
printf_P(PSTR("Unknown command, help for a list\r\n"));
|
|
darius@0
|
570 |
}
|
|
darius@24
|
571 |
}
|
|
darius@0
|
572 |
|