221 Zeilen
5.0 KiB
C++
221 Zeilen
5.0 KiB
C++
/**
|
|
* server/src/hardware/protocol/dccplusplus/messages.hpp
|
|
*
|
|
* This file is part of the traintastic source code.
|
|
*
|
|
* Copyright (C) 2021-2022 Reinder Feenstra
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#ifndef TRAINTASTIC_SERVER_HARDWARE_PROTOCOL_DCCPLUSPLUS_MESSAGES_HPP
|
|
#define TRAINTASTIC_SERVER_HARDWARE_PROTOCOL_DCCPLUSPLUS_MESSAGES_HPP
|
|
|
|
#include <string_view>
|
|
#include <traintastic/enum/direction.hpp>
|
|
|
|
namespace DCCPlusPlus {
|
|
|
|
namespace Ex {
|
|
// see: https://dcc-ex.com/reference/software/command-reference.html
|
|
|
|
enum class Track {
|
|
Main,
|
|
Programming,
|
|
};
|
|
|
|
//! Turn Power OFF to tracks (Both Main & Programming)
|
|
constexpr std::string_view powerOff()
|
|
{
|
|
return "<0>\n";
|
|
}
|
|
|
|
constexpr std::string_view powerOff(Track track)
|
|
{
|
|
switch(track)
|
|
{
|
|
case Track::Main:
|
|
return "<0 MAIN>\n";
|
|
|
|
case Track::Programming:
|
|
return "<0 PROG>\n";
|
|
}
|
|
return "";
|
|
}
|
|
|
|
//! Turn Power ON to tracks (Both Main & Programming)
|
|
constexpr std::string_view powerOn()
|
|
{
|
|
return "<1>\n";
|
|
}
|
|
|
|
constexpr std::string_view powerOn(Track track)
|
|
{
|
|
switch(track)
|
|
{
|
|
case Track::Main:
|
|
return "<1 MAIN>\n";
|
|
|
|
case Track::Programming:
|
|
return "<1 PROG>\n";
|
|
}
|
|
return "";
|
|
}
|
|
|
|
constexpr std::string_view powerOnJoin()
|
|
{
|
|
return "<1 JOIN>\n";
|
|
}
|
|
|
|
//! Displays the instantaneous current on the MAIN Track
|
|
constexpr std::string_view getMainTrackCurrent()
|
|
{
|
|
return "<c>\n";
|
|
}
|
|
|
|
//! Command to Store definitions to EEPROM
|
|
constexpr std::string_view eepromStore()
|
|
{
|
|
return "<E>\n";
|
|
}
|
|
|
|
//! Command to Erase ALL (turnouts, sensors, and outputs) definitions from EEPROM
|
|
constexpr std::string_view eepromEraseAll()
|
|
{
|
|
return "<e>\n";
|
|
}
|
|
|
|
//! Lists Status of all sensors
|
|
constexpr std::string_view getSensorStatuses()
|
|
{
|
|
return "<Q>\n";
|
|
}
|
|
|
|
//! Read Loco address (programming track only)
|
|
constexpr std::string_view readLocoAddress()
|
|
{
|
|
return "<R>\n";
|
|
}
|
|
|
|
//! Lists all defined sensors.
|
|
constexpr std::string_view getSensorList()
|
|
{
|
|
return "<S>\n";
|
|
}
|
|
|
|
//! DCC++ EX CommandStation Status
|
|
constexpr std::string_view getStatus()
|
|
{
|
|
return "<s>\n";
|
|
}
|
|
|
|
//! Lists all defined turnouts
|
|
constexpr std::string_view getTurnoutList()
|
|
{
|
|
return "<T>\n";
|
|
}
|
|
|
|
//! Lists all defined output pins
|
|
constexpr std::string_view getOutputPinList()
|
|
{
|
|
return "<Z>\n";
|
|
}
|
|
|
|
//! Stops all locos on the track but leaves power on.
|
|
constexpr std::string_view emergencyStop()
|
|
{
|
|
return "<!>\n";
|
|
}
|
|
|
|
inline std::string setLocoSpeedAndDirection(uint16_t address, uint8_t speed, bool emergencyStop, Direction direction)
|
|
{
|
|
assert(address <= 10293);
|
|
assert(speed <= 126);
|
|
|
|
return std::string("<t 1 ")
|
|
.append(std::to_string(address))
|
|
.append(" ")
|
|
.append(emergencyStop ? "-1" : std::to_string(speed))
|
|
.append(direction == Direction::Forward ? " 1" : " 0")
|
|
.append(">\n");
|
|
}
|
|
|
|
constexpr std::string_view forgetLocos()
|
|
{
|
|
return "<->\n";
|
|
}
|
|
|
|
inline std::string forgetLoco(uint16_t address)
|
|
{
|
|
assert(address <= 10293);
|
|
|
|
return std::string("<- ")
|
|
.append(std::to_string(address))
|
|
.append(">\n");
|
|
}
|
|
|
|
inline std::string setLocoFunction(uint16_t address, uint8_t function, bool value)
|
|
{
|
|
assert(address <= 10293);
|
|
assert(function <= 68);
|
|
|
|
return std::string("<F ")
|
|
.append(std::to_string(address))
|
|
.append(" ")
|
|
.append(std::to_string(function))
|
|
.append(value ? " 1" : " 0")
|
|
.append(">\n");
|
|
}
|
|
|
|
inline std::string setAccessory(uint16_t linearAddress, bool activate)
|
|
{
|
|
assert(linearAddress >= 1 && linearAddress <= 2044);
|
|
|
|
return std::string("<a ")
|
|
.append(std::to_string(linearAddress))
|
|
.append(activate ? " 1" : " 0")
|
|
.append(">\n");
|
|
}
|
|
|
|
inline std::string setAccessory(uint16_t address, uint8_t subAddress, bool activate)
|
|
{
|
|
assert(address <= 511);
|
|
assert(subAddress <= 3);
|
|
|
|
return std::string("<a ")
|
|
.append(std::to_string(address))
|
|
.append(" ")
|
|
.append(std::to_string(subAddress))
|
|
.append(activate ? " 1" : " 0")
|
|
.append(">\n");
|
|
}
|
|
|
|
inline std::string_view setSpeedSteps(uint8_t value)
|
|
{
|
|
switch(value)
|
|
{
|
|
case 28:
|
|
return "<D SPEED28>\n";
|
|
case 128:
|
|
return "<D SPEED128>\n";
|
|
}
|
|
return "";
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|