Open Model Railroad Network (OpenMRN)
Loading...
Searching...
No Matches
Packet.hxx
Go to the documentation of this file.
1
35#ifndef _DCC_PACKET_HXX_
36#define _DCC_PACKET_HXX_
37
38#include <stdint.h>
39#include <string.h>
40
41#include "dcc/Address.hxx"
42#include "dcc/Defs.hxx"
43#include "dcc/packet.h"
44
45namespace dcc
46{
47
51struct Packet : public DCCPacket
52{
54 static const unsigned MAX_PAYLOAD = DCC_PACKET_MAX_PAYLOAD;
59 static const unsigned CHANGE_DIR = DCC_PACKET_EMERGENCY_STOP;
60
62 static const unsigned PAGE_REGISTER_ID = 0b101;
63
64 Packet()
65 {
66 clear();
67 }
68
69 struct DCC_IDLE {};
72 clear();
74 }
75
77 void clear()
78 {
79 memset((DCCPacket*)this, 0, sizeof(*this));
80 }
81
84 bool IsPacket()
85 {
86 return packet_header.is_pkt;
87 }
88
91 void set_cmd(uint8_t cmd)
92 {
93 dlc = 0;
94 HASSERT(cmd & 1);
95 header_raw_data = cmd;
96 }
97
100 {
101 header_raw_data = 0;
102 dlc = 0;
103 }
104
107 {
108 header_raw_data = 0;
109 dlc = 0;
110 packet_header.send_long_preamble = true;
111 }
112
115 void add_dcc_address(DccShortAddress address);
118 void add_dcc_address(DccLongAddress address);
125 void add_dcc_accy_address(bool is_basic, unsigned address);
126
133 void add_dcc_speed14(bool is_fwd, bool light, unsigned speed);
141 template <class A>
142 void set_dcc_speed14(A a, bool is_fwd, bool light, unsigned speed)
143 {
145 add_dcc_speed14(is_fwd, light, speed);
146 }
147
153 void add_dcc_speed28(bool is_fwd, unsigned speed);
157 template <class A> void set_dcc_speed28(A a, bool is_fwd, unsigned speed)
158 {
160 add_dcc_speed28(is_fwd, speed);
161 }
162
168 void add_dcc_speed128(bool is_fwd, unsigned speed);
172 template <class A> void set_dcc_speed128(A a, bool is_fwd, unsigned speed)
173 {
175 add_dcc_speed128(is_fwd, speed);
176 }
177
181 void add_dcc_function0_4(unsigned values);
185 void add_dcc_function5_8(unsigned values);
189 void add_dcc_function9_12(unsigned values);
193 void add_dcc_function13_20(unsigned values)
194 {
195 add_dcc_function_hi(13, values);
196 }
200 void add_dcc_function21_28(unsigned values)
201 {
202 add_dcc_function_hi(21, values);
203 }
209 void add_dcc_function_hi(uint8_t base, uint8_t values);
210
215 void add_dcc_binary_state(uint16_t fn, bool value);
216
220 void add_dcc_analog_function(uint8_t fn, uint8_t value);
221
224 uint8_t cmd_hi, unsigned cv_number, uint8_t value);
225
228 void add_dcc_pom_read1(unsigned cv_number);
229
234 void add_dcc_pom_write1(unsigned cv_number, uint8_t value);
235
241 void set_dcc_svc_verify_byte(unsigned cv_number, uint8_t value);
242
248 void set_dcc_svc_write_byte(unsigned cv_number, uint8_t value);
249
257 unsigned cv_number, unsigned bit, bool expected);
258
265 void set_dcc_svc_write_bit(unsigned cv_number, unsigned bit, bool desired);
266
273 void set_dcc_svc_paged_set_page(unsigned page = 1)
274 {
276 }
277
285 void set_dcc_svc_paged_write_reg(uint8_t reg, uint8_t value);
286
294 void set_dcc_svc_paged_verify_reg(uint8_t reg, uint8_t value);
295
306 void add_dcc_basic_accessory(unsigned address, bool is_activate);
307
312 void set_dcc_basic_accy_params(bool is_normal, bool is_activate);
313
323 void add_dcc_ext_accessory(unsigned address, uint8_t aspect);
324
330 Defs::LogonEnableParam param, uint16_t cid, uint8_t session_id);
331
334 void set_dcc_select_shortinfo(uint64_t decoder_id);
335
340 void set_dcc_logon_assign(uint64_t decoder_id, uint16_t address);
341
344 void add_dcc_checksum();
345
347 void set_dcc_idle();
348
351
354 void start_mm_packet();
355
358 void add_mm_address(MMAddress address, bool light);
359
363 void add_mm_speed(unsigned speed);
364
369 void add_mm_new_speed(bool is_fwd, unsigned speed);
370
377 void add_mm_new_fn(unsigned fn_num, bool value, unsigned speed);
378
382 void mm_shift();
383
384private:
389 unsigned set_mm_speed_bits(unsigned speed);
390};
391
392} // namespace dcc
393
394#endif // _DCC_PACKET_HXX_
LogonEnableParam
Parameters for the Logon Enable command.
Definition dcc/Defs.hxx:265
#define HASSERT(x)
Checks that the value of expression x is true, else terminates the current process.
Definition macros.h:138
#define DCC_PACKET_EMERGENCY_STOP
Send this speed step to emergency-stop the locomotive.
Definition packet.h:47
#define DCC_PACKET_MAX_PAYLOAD
Maximum number of payload bytes.
Definition packet.h:45
uint8_t send_long_preamble
1: send long preamble instead of packet.
Definition packet.h:69
uint8_t is_pkt
Always 0.
Definition packet.h:60
Stores a DCC packet in memory.
Definition packet.h:55
uint8_t dlc
Specifies the number of used payload bytes.
Definition packet.h:95
Strongly typed wrapper representing a long DCC address.
Definition Address.hxx:66
Strongly typed wrapper representing a short DCC address.
Definition Address.hxx:49
Strongly typed wrapper representing a marklin-motorola protocol address.
Definition Address.hxx:82
Represents a command to be sent to the track driver.
Definition Packet.hxx:52
void start_mm_packet()
Sets the packet type to marklin-motorola.
Definition Packet.cxx:400
void set_dcc_reset_all_decoders()
Creates a DCC reset-all-decoders packet.
Definition Packet.cxx:90
void add_mm_new_speed(bool is_fwd, unsigned speed)
Sets the packet to a direction-aware 14-step MM speed-and-light packet.
Definition Packet.cxx:474
void set_dcc_speed14(A a, bool is_fwd, bool light, unsigned speed)
Adds a speed-and-direction command (dcc baseline command) ot the packet.
Definition Packet.hxx:142
void add_dcc_speed28(bool is_fwd, unsigned speed)
Adds a speed-and-direction command (dcc baseline command) to the packet.
Definition Packet.cxx:150
void start_dcc_svc_packet()
Initializes the packet structure for a regular DCC packet.
Definition Packet.hxx:106
void add_dcc_pom_write1(unsigned cv_number, uint8_t value)
Adds a DCC POM write single CV command and the xor byte.
Definition Packet.cxx:270
static const unsigned EMERGENCY_STOP
Send this speed step to emergency-stop the locomotive.
Definition Packet.hxx:56
void add_dcc_function21_28(unsigned values)
Adds a DCC function group command to the packet.
Definition Packet.hxx:200
void add_dcc_basic_accessory(unsigned address, bool is_activate)
Adds a DCC basic accessory decoder command packet and the checksum byte.
Definition Packet.cxx:342
void set_dcc_speed28(A a, bool is_fwd, unsigned speed)
Definition Packet.hxx:157
void add_mm_speed(unsigned speed)
Sets the packet to a 14-step MM speed-and-light packet.
Definition Packet.cxx:456
void set_dcc_svc_write_byte(unsigned cv_number, uint8_t value)
Sets the packet to a DCC service mode packet writing the contents of an entire CV.
Definition Packet.cxx:280
void set_dcc_basic_accy_params(bool is_normal, bool is_activate)
Call this function after setting a basic accy address to set the accessory packet options.
Definition Packet.cxx:322
void set_dcc_svc_paged_verify_reg(uint8_t reg, uint8_t value)
Sets the packet to a DCC service mode packet in Paged Mode, setting the page register.
Definition Packet.cxx:313
void set_dcc_logon_assign(uint64_t decoder_id, uint16_t address)
Sets the packet to a logon assign packet.
Definition Packet.cxx:384
bool IsPacket()
Definition Packet.hxx:84
void add_dcc_function_hi(uint8_t base, uint8_t values)
Adds a DCC function group command to the packet.
Definition Packet.cxx:220
void set_dcc_svc_write_bit(unsigned cv_number, unsigned bit, bool desired)
Sets the packet to a DCC service mode packet verifying the contents of a single bit in a CV.
Definition Packet.cxx:295
unsigned set_mm_speed_bits(unsigned speed)
Sets the speed bits of an MM packet.
Definition Packet.cxx:433
void add_dcc_pom_read1(unsigned cv_number)
Adds a DCC POM read single CV command and the xor byte.
Definition Packet.cxx:265
void add_dcc_analog_function(uint8_t fn, uint8_t value)
Adds a DCC analog function control command to the packet.
Definition Packet.cxx:248
void set_dcc_select_shortinfo(uint64_t decoder_id)
Sets the packet to a Select+GetShortInfo packet.
Definition Packet.cxx:369
Packet(DCC_IDLE i)
Constructor generating a DCC IDLE packet.
Definition Packet.hxx:71
void add_dcc_speed128(bool is_fwd, unsigned speed)
Adds a speed-and-direction command (dcc extended command) for 128 speed steps to the packet.
Definition Packet.cxx:174
void add_dcc_prog_command(uint8_t cmd_hi, unsigned cv_number, uint8_t value)
Helper function for adding programming mode packets.
Definition Packet.cxx:256
void set_dcc_svc_verify_byte(unsigned cv_number, uint8_t value)
Sets the packet to a DCC service mode packet verifying the contents of an entire CV.
Definition Packet.cxx:274
void set_dcc_svc_paged_set_page(unsigned page=1)
Sets the packet to a DCC service mode packet in Paged Mode, setting the page register.
Definition Packet.hxx:273
void set_dcc_svc_verify_bit(unsigned cv_number, unsigned bit, bool expected)
Sets the packet to a DCC service mode packet verifying the contents of a single bit in a CV.
Definition Packet.cxx:286
void add_dcc_function0_4(unsigned values)
Adds a DCC function group command to the packet.
Definition Packet.cxx:194
void add_dcc_function5_8(unsigned values)
Adds a DCC function group command to the packet.
Definition Packet.cxx:204
void clear()
Resets the packet ot empty.
Definition Packet.hxx:77
void add_dcc_speed14(bool is_fwd, bool light, unsigned speed)
Adds a speed-and-direction command (dcc baseline command) ot the packet.
Definition Packet.cxx:125
static const unsigned PAGE_REGISTER_ID
Used for page-preset packets.
Definition Packet.hxx:62
void set_cmd(uint8_t cmd)
Sets the packet to a standalone command.
Definition Packet.hxx:91
void add_mm_new_fn(unsigned fn_num, bool value, unsigned speed)
Creates a speed-and-fn packet for the new MM format.
Definition Packet.cxx:500
void start_dcc_packet()
Initializes the packet structure for a regular DCC packet.
Definition Packet.hxx:99
void set_dcc_logon_enable(Defs::LogonEnableParam param, uint16_t cid, uint8_t session_id)
Sets the packet to a logon enable packet.
Definition Packet.cxx:357
static const unsigned MAX_PAYLOAD
Maximum number of payload bytes.
Definition Packet.hxx:54
void set_dcc_speed128(A a, bool is_fwd, unsigned speed)
Definition Packet.hxx:172
static const unsigned CHANGE_DIR
Send this speed step to switch direction of the locomotive.
Definition Packet.hxx:59
void add_dcc_address(DccShortAddress address)
Adds the header to the packet needed for addressing a DCC locomotive.
Definition Packet.cxx:98
void add_dcc_ext_accessory(unsigned address, uint8_t aspect)
Adds a DCC extended accessory decoder command packet and the checksum byte.
Definition Packet.cxx:349
void add_dcc_checksum()
Appends one byte to the packet payload that represents the XOR checksum for DCC.
Definition Packet.cxx:54
void add_mm_address(MMAddress address, bool light)
Sets the address and F0 bits of an MM packet to a specific loco address.
Definition Packet.cxx:417
void add_dcc_accy_address(bool is_basic, unsigned address)
Adds the header to the packet needed for addressing a DCC accessory (e.g.
Definition Packet.cxx:113
void add_dcc_function13_20(unsigned values)
Adds a DCC function group command to the packet.
Definition Packet.hxx:193
void add_dcc_binary_state(uint16_t fn, bool value)
Adds a DCC binary state control command to the packet.
Definition Packet.cxx:232
void mm_shift()
Shifts a MM packet to the second half of the packet buffer.
Definition Packet.cxx:534
void set_dcc_svc_paged_write_reg(uint8_t reg, uint8_t value)
Sets the packet to a DCC service mode packet in Paged Mode, setting any register.
Definition Packet.cxx:304
void add_dcc_function9_12(unsigned values)
Adds a DCC function group command to the packet.
Definition Packet.cxx:212
void set_dcc_idle()
Creates a DCC idle packet.
Definition Packet.cxx:81