-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathboot_protocol.h
82 lines (66 loc) · 1.97 KB
/
boot_protocol.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#pragma once
#include <stddef.h>
#include <stdint.h>
#include "bootloader.h"
#include <modbus.h>
#include "boot_config.h"
#include <array>
namespace Bootloader
{
enum class PageProps
{
AddressLo,
AddressHi,
SizeLo,
SizeHi,
};
enum class CommandLayout :uint16_t
{
Page = 0,
Offset = 1,
Length = 2,
Command = 3,
};
enum class BootCommand : uint16_t
{
None = 0,
PageErase = 1,
PageWrite = 2,
PageRead = 3,
RunApplication = 4,
Reset = 5,
Activate = 0x5555,
};
using Mcucpp::Modbus::ModbusError;
struct CommandData
{
uint16_t page = 0;
uint16_t offset = 0;
uint16_t length = 0;
};
class BootloaderProtocol
{
BootloaderApp &_bootloader;
CommandData _commandData;
Mcucpp::Modbus::ModbusTransportRtu<BootDevice, Led> rtuTransport;
Mcucpp::Modbus::ModbusSlave modbus{rtuTransport};
uint8_t rxBuffer[256];
uint8_t txBuffer[256];
std::array<uint16_t, (PageBufferSize + 1) / 2> PageBuffer;
DataChunk rxChunk{rxBuffer, 0, sizeof(rxBuffer)};
DataChunk txChunk{txBuffer, 0, sizeof(txBuffer)};
public:
static constexpr uint16_t PageMapEntrySize = 4; // of 16 bit words
BootloaderProtocol(const BootloaderProtocol &) = delete;
BootloaderProtocol &operator=(const BootloaderProtocol &) = delete;
ModbusError WriteHoldingRegisters(uint16_t start, uint16_t count, DataBuffer &buffer);
ModbusError ReadHoldingRegisters(uint16_t start, uint16_t count, DataBuffer &buffer);
ModbusError ReadInputRegisters(uint16_t start, uint16_t count, DataBuffer &buffer);
BootloaderProtocol(BootloaderApp &bootloader);
bool Init();
uint16_t GetPageMapItem(uint16_t index);
ModbusError WriteCommand(uint16_t start, uint16_t count, DataBuffer &buffer);
ModbusError WriteBuffer(uint16_t start, uint16_t count, DataBuffer &buffer);
bool ExecuteCommand(BootCommand command);
};
} // namespace Bootloader