-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.cpp
99 lines (85 loc) · 3.93 KB
/
main.cpp
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#define DEBUG_BUILD true
#include <iostream>
#include <chrono>
#include <thread>
#include <Poco/JSON/ParseHandler.h>
#include <Poco/Environment.h>
#include <catch.hpp>
#include <clara.hpp>
#include <asio.hpp>
#include "src/commandline/parse.h"
#include "src/utils/enum_constants.h"
#include "src/json//deviceParser.h"
#include "src/json/configFinder.h"
#include "src/serial/Serial.h"
#include "src/units/Byte.h"
#include "src/json/ConfigManager.h"
#include "src/loader/DataSendManager.h"
#include "src/loader/HexReader.h"
#include "src/utils/utils.h"
[[nodiscard]] int pgmEnd() {
#if defined(DEBUG_BUILD) && defined(_MSC_VER)
std::this_thread::sleep_until(std::chrono::system_clock::now() + std::chrono::hours(std::numeric_limits<int>::max()));
#endif
return 0;
}
int main(int argc, const char* argv[]) {
using jsonOpts = firmware::json::config::JsonOptions;
Parse clParser{argc, argv};
if(!clParser) {
std::cout << clParser;
return pgmEnd();
}
using namespace CustomDataTypes::ComputerScience::literals;
using namespace utils::printable;
firmware::json::config::ConfigManager configManager{clParser.device()};
if (!configManager) {
std::cout << "Error: " << *configManager.errorMessage() << std::endl;
return pgmEnd();
}
std::cout << "Device: " << configManager.getJSONValue<jsonOpts::deviceVendor>()
<< " " << configManager.getJSONValue<jsonOpts::deviceArch>()
<< " [" << configManager.getJSONValue<jsonOpts::deviceSubArch>()
<< "]" << ", " << configManager.getJSONValue<jsonOpts::deviceName>()
<< std::endl;
if (clParser.baud() < configManager.getJSONValue<jsonOpts::serialMinBaudRate>() &&
clParser.baud() > configManager.getJSONValue<jsonOpts::serialMaxBaudRate>())
{
std::cout << "Given Baudrate is not within the allowed min and max\n\r";
std::cout << "Allowed Minimum: " << configManager.getJSONValue<jsonOpts::serialMinBaudRate>() << "\n\r";
std::cout << "Allowed Maximum: " << configManager.getJSONValue<jsonOpts::serialMaxBaudRate>() << "\n\r";
std::cout << "Given Value: " << clParser.baud();
return pgmEnd();
}
std::optional<firmware::serial::DataSendManager> sendManager;
if (auto timeVal = CustomDataTypes::parseUnit<std::chrono::milliseconds>(clParser.waitTime())) {
sendManager.emplace(configManager, firmware::serial::CommunicationData{ clParser.port(), clParser.baud() }, *timeVal);
} else if (sendManager == std::nullopt) {
sendManager.emplace(configManager, firmware::serial::CommunicationData{ clParser.port(), clParser.baud() });
}
if (!sendManager->isOpen()) {
return pgmEnd();
} else {
std::cout << "Connection to " << clParser.port() << " successful!" << std::endl;
if (configManager.getJSONValue<jsonOpts::binaryFormat>() == serial::utils::BinaryFormats::Unknown) {
std::cout << "Unknown Format!" << std::endl;
return pgmEnd();
}
firmware::reader::HexReader reader{ clParser.binary(), configManager.getJSONValue<jsonOpts::deviceFlashAvailable>() };
if(!reader) {
std::cout << *reader.errorMessage();
return pgmEnd();
}
auto maxAvail = configManager.getJSONValue<jsonOpts::deviceFlashAvailable>();
std::cout << "Used " << reader.getFileSize() << " / " << maxAvail
<< " (" << (static_cast<long double>(reader.getFileSize()) /
static_cast<long double>(static_cast<decltype(reader.getFileSize())>(maxAvail).count())) << "%)" << std::endl;
std::cout << "Start Address: 0x" << std::hex << reader.getStartAddress() << std::dec << std::endl;
auto t1 = std::chrono::high_resolution_clock::now();
*sendManager << reader;
sendManager->flush();
auto t2 = std::chrono::high_resolution_clock::now();
std::cout << "Transmission took " << std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1) << std::endl;
}
return pgmEnd();
}