X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Flibmarklin%2Flocomotive.cpp;h=5fe5ca5f863d07ca489cdea2bae773eb46ba9d8e;hb=02c9a9779954d993cb73fe5f7a72b0847e87f633;hp=87effa04e8e35175152bc5de2e88950532a5d55c;hpb=3e9c210ddc036cd015228504cc0803c909e27f84;p=r2c2.git diff --git a/source/libmarklin/locomotive.cpp b/source/libmarklin/locomotive.cpp index 87effa0..5fe5ca5 100644 --- a/source/libmarklin/locomotive.cpp +++ b/source/libmarklin/locomotive.cpp @@ -1,7 +1,7 @@ /* $Id$ This file is part of the MSP Märklin suite -Copyright © 2006-2008 Mikkosoft Productions, Mikko Rasa +Copyright © 2006-2009 Mikkosoft Productions, Mikko Rasa Distributed under the GPL */ @@ -11,6 +11,8 @@ Distributed under the GPL #include "constants.h" #include "control.h" #include "locomotive.h" +#include "locotype.h" +#include "reply.h" using namespace std; using namespace Msp; @@ -32,8 +34,12 @@ Locomotive::Locomotive(const LocoType &t, Control &c, unsigned a): void Locomotive::set_speed(unsigned spd) { - speed=min(spd, 14U); + spd = min(spd, 14U); + if(spd==speed) + return; + signal_speed_changing.emit(spd); + speed = spd; send_command(false); signal_speed_changed.emit(speed); @@ -51,17 +57,18 @@ void Locomotive::set_reverse(bool rev) } else { - reverse=rev; + reverse = rev; send_command(false); + signal_reverse_changed.emit(reverse); } } void Locomotive::set_function(unsigned func, bool state) { if(state) - funcs|=1<>8)&0xFF; - control.command(string(cmd, 3)).signal_done.connect(sigc::mem_fun(this, &Locomotive::status_reply)); + unsigned char data[2]; + data[0] = addr&0xFF; + data[1] = (addr>>8)&0xFF; + control.command(CMD_LOK_STATUS, data, 2).signal_done.connect(sigc::mem_fun(this, &Locomotive::status_reply)); } void Locomotive::send_command(bool setf) { - char cmd[16]; - cmd[0]=CMD_LOK; - cmd[1]=addr&0xFF; - cmd[2]=(addr>>8)&0xFF; + unsigned char data[4]; + data[0] = addr&0xFF; + data[1] = (addr>>8)&0xFF; if(speed==0) - cmd[3]=0; + data[2] = 0; else if(speed==1) - cmd[3]=2; + data[2] = 2; else - cmd[3]=(speed*19-18)/2; + data[2] = (speed*19-18)/2; - cmd[4]=(reverse?0:0x20) | ((funcs&1)?0x10:0); + data[3] = (reverse ? 0 : 0x20) | ((funcs&1) ? 0x10 : 0); if(setf) { - cmd[4]|=0x80; + data[3] |= 0x80; for(unsigned i=0; i<4; ++i) if((funcs>>i)&2) - cmd[4]|=(1<4) + { + if(!++data[0]) + ++data[1]; + data[2] = 0; + data[3] = 0xA0; + for(unsigned i=0; i<4; ++i) + if((funcs>>i)&32) + data[3] |= (1<(reply[0])<=1) - speed=0; + const unsigned char *data = reply.get_data(); + + if(data[0]<=1) + speed = 0; else - speed=static_cast(reply[0])*2/19+1; - reverse=(reply[1]&0x20)?false:true; - funcs=(reply[1]&0xF)<<1; - if(reply[1]&0x10) - funcs|=1; + speed = data[0]*2/19+1; + + reverse = (data[1]&0x20) ? false : true; + funcs = (data[1]&0xF)<<1; + if(data[1]&0x10) + funcs |= 1; for(unsigned i=0; i<5; ++i) signal_function_changed.emit(i, (funcs>>i)&1); @@ -123,8 +143,9 @@ void Locomotive::status_reply(Error err, const string &reply) bool Locomotive::reverse_timeout() { - reverse=!reverse; + reverse = !reverse; send_command(true); + signal_reverse_changed.emit(reverse); return false; }