• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

traintastic / traintastic / 23669027368

27 Mar 2026 09:50PM UTC coverage: 26.198% (+0.02%) from 26.176%
23669027368

push

github

reinder
Merge remote-tracking branch 'origin/master' into cbus

11 of 144 new or added lines in 34 files covered. (7.64%)

1 existing line in 1 file now uncovered.

8256 of 31514 relevant lines covered (26.2%)

182.55 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/server/src/hardware/protocol/dccex/iohandler/simulationiohandler.cpp
1
/**
2
 * server/src/hardware/protocol/dccex/iohandler/simulationiohandler.cpp
3
 *
4
 * This file is part of the traintastic source code.
5
 *
6
 * Copyright (C) 2022,2024 Reinder Feenstra
7
 *
8
 * This program is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU General Public License
10
 * as published by the Free Software Foundation; either version 2
11
 * of the License, or (at your option) any later version.
12
 *
13
 * This program is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 * GNU General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU General Public License
19
 * along with this program; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21
 */
22

23
#include "simulationiohandler.hpp"
24
#include "../kernel.hpp"
25
#include "../messages.hpp"
26
#include "../../../../utils/endswith.hpp"
27
#include "../../../../utils/fromchars.hpp"
28

29
namespace DCCEX {
30

31
SimulationIOHandler::SimulationIOHandler(Kernel& kernel)
×
32
  : IOHandler(kernel)
×
33
{
34
}
×
35

36
void SimulationIOHandler::start()
×
37
{
38
  m_kernel.started();
×
39
}
×
40

41
bool SimulationIOHandler::send(std::string_view message)
×
42
{
43
  if(message.size() < 4 || message[0] != '<' || !endsWith(message, ">\n"))
×
44
    return false;
×
45

46
  switch(message[1])
×
47
  {
48
    case '0': // power off
×
49
      if(message == Messages::powerOff())
×
50
        reply(Messages::powerOffResponse());
×
51
      else if(message == Messages::powerOff(Messages::Track::Main))
×
52
        reply(Messages::powerOffResponse(Messages::Track::Main));
×
53
      else if(message == Messages::powerOff(Messages::Track::Programming))
×
54
        reply(Messages::powerOffResponse(Messages::Track::Programming));
×
55
      break;
×
56

57
    case '1': // power on
×
58
      if(message == Messages::powerOn())
×
59
        reply(Messages::powerOnResponse());
×
60
      else if(message == Messages::powerOn(Messages::Track::Main))
×
61
        reply(Messages::powerOnResponse(Messages::Track::Main));
×
62
      else if(message == Messages::powerOn(Messages::Track::Programming))
×
63
        reply(Messages::powerOnResponse(Messages::Track::Programming));
×
64
      else if(message == Messages::powerOnJoin())
×
65
        reply(Messages::powerOnJoinResponse());
×
66
      break;
×
67

68
    case 'T': // Turnout
×
69
    {
70
      uint16_t id;
71
      if(auto r = fromChars(message.substr(3), id); r.ec == std::errc())
×
72
      {
73
        const char state = *(r.ptr + 1);
×
74

75
        if(state == '0' || state == 'C')
×
76
          reply(Messages::setTurnoutResponse(id, false));
×
77
        else if(state == '1' || state == 'T')
×
78
          reply(Messages::setTurnoutResponse(id, true));
×
79
      }
80
      break;
×
81
    }
82
    case 'Z': // Output
×
83
    {
84
      uint16_t id;
85
      if(auto r = fromChars(message.substr(3), id); r.ec == std::errc())
×
86
      {
87
        const char state = *(r.ptr + 1);
×
88

89
        if(state == '0')
×
90
          reply(Messages::setOutputResponse(id, false));
×
91
        else if(state == '1')
×
92
          reply(Messages::setOutputResponse(id, true));
×
93
      }
94
      break;
×
95
    }
96
  }
97

98
  return true;
×
99
}
100

101
void SimulationIOHandler::reply(std::string_view message)
×
102
{
103
  // post the reply, so it has some delay
104
  //! \todo better delay simulation? at least DCC-EX message transfer time?
NEW
105
  boost::asio::post(m_kernel.ioContext(),
×
106
    [this, data=std::string(message)]()
×
107
    {
108
      m_kernel.receive(data);
×
109
    });
×
110
}
×
111

112
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc