From ae0ea6bd659e35ae9ea324dd010c66f6c176d6ff Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Tue, 12 Nov 2013 16:03:03 +0200 Subject: [PATCH] Add command to change arducontrol baud rate --- arducontrol/Makefile | 4 +-- arducontrol/arducontrol.c | 2 ++ arducontrol/commands.h | 2 ++ arducontrol/interface.c | 52 ++++++++++++++++++++++++++++++++++++++- 4 files changed, 57 insertions(+), 3 deletions(-) diff --git a/arducontrol/Makefile b/arducontrol/Makefile index 73dfb0f..218af27 100644 --- a/arducontrol/Makefile +++ b/arducontrol/Makefile @@ -1,4 +1,4 @@ -FEATURES := SERIAL_ASYNC +FEATURES := SERIAL_ASYNC CLOCK_TIMER=1 CLOCK_RATE=100 include ../common/build.mk -arducontrol.elf: adc.o interface.o mfx.o monitor.o motorola.o output.o serial.o s88.o timer.o +arducontrol.elf: adc.o clock.o interface.o mfx.o monitor.o motorola.o output.o serial.o s88.o timer.o diff --git a/arducontrol/arducontrol.c b/arducontrol/arducontrol.c index 8ec27ea..025088f 100644 --- a/arducontrol/arducontrol.c +++ b/arducontrol/arducontrol.c @@ -41,6 +41,7 @@ its data to the track can start. */ #include #include +#include "clock.h" #include "interface.h" #include "monitor.h" #include "output.h" @@ -48,6 +49,7 @@ its data to the track can start. int main(void) { + clock_start(); output_init(); interface_init(); monitor_init(); diff --git a/arducontrol/commands.h b/arducontrol/commands.h index 3b7597c..c58ad7c 100644 --- a/arducontrol/commands.h +++ b/arducontrol/commands.h @@ -23,6 +23,7 @@ enum Command MFX_SPEED_FUNCS8 = 0x29, MFX_SPEED_FUNCS16 = 0x2A, S88_READ = 0x30, + SET_BAUD_RATE = 0x70, COMMAND_OK = 0x80, RECEIVE_OVERRUN = 0x81, FRAMING_ERROR = 0x82, @@ -30,6 +31,7 @@ enum Command LENGTH_ERROR = 0x84, INVALID_VALUE = 0x85, OVERCURRENT = 0xA0, + BAUD_CHANGE_FAILED = 0xA1, TRACK_CURRENT = 0xC0, INPUT_VOLTAGE = 0xC1, POWER_STATE = 0xC2, diff --git a/arducontrol/interface.c b/arducontrol/interface.c index 63b1ebd..a731896 100644 --- a/arducontrol/interface.c +++ b/arducontrol/interface.c @@ -1,4 +1,5 @@ #include +#include "clock.h" #include "interface.h" #include "mfx.h" #include "monitor.h" @@ -10,15 +11,19 @@ static uint8_t cmd_buffer[15]; static uint8_t cmd_length = 0; static uint8_t cmd_read_pos = 0; +static uint16_t baud_rate = 9600; +static uint16_t baud_change = 0; +static uint32_t baud_changed_at = 0; static uint8_t dispatch_command(const uint8_t *, uint8_t); +uint8_t interface_command(const uint8_t *, uint8_t); void interface_init(void) { DDRB |= 0x01; DDRD = (DDRD&0xFC)|0x02; - serial_init(9600); + serial_init(baud_rate); } void interface_check(void) @@ -61,6 +66,21 @@ void interface_check(void) } PORTB &= ~0x01; } + + if(baud_change) + { + if(!baud_changed_at) + { + baud_changed_at = clock_get(); + serial_set_baud(baud_change); + } + else if(clock_get()-baud_changed_at>3*CLOCK_RATE) + { + baud_change = 0; + serial_set_baud(baud_rate); + interface_send1(BAUD_CHANGE_FAILED); + } + } } static uint8_t dispatch_command(const uint8_t *cmd, uint8_t length) @@ -80,6 +100,8 @@ static uint8_t dispatch_command(const uint8_t *cmd, uint8_t length) return mfx_command(cmd, length); else if(type==3) return s88_command(cmd, length); + else if(type==7) + return interface_command(cmd, length); else return INVALID_COMMAND; } @@ -96,3 +118,31 @@ void interface_send1(uint8_t cmd) serial_write(0xFE); serial_write(cmd); } + +uint8_t interface_command(const uint8_t *cmd, uint8_t length) +{ + if(cmd[0]==SET_BAUD_RATE) + { + if(length!=3) + return LENGTH_ERROR; + + uint16_t baud = (cmd[1]<<8)|cmd[2]; + if(baud!=baud_rate) + { + if(baud!=baud_change) + { + baud_change = baud; + baud_changed_at = 0; + } + else + { + baud_rate = baud_change; + baud_change = 0; + } + } + } + else + return INVALID_COMMAND; + + return COMMAND_OK; +} -- 2.43.0