Repository navigation
Expand file tree
/
Copy pathPrinter3DProvider.cpp
More file actions
125 lines (111 loc) · 4.01 KB
/
Copy pathPrinter3DProvider.cpp
File metadata and controls
125 lines (111 loc) · 4.01 KB
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include "Printer3DProvider.h"
#include <WiFiClientSecure.h>
#include <PubSubClient.h>
#include "LaMetricManager.h"
#include "Config.h"
#include "StringDict.h"
#include "Utils.h"
namespace SA
{
Printer3DProvider::Printer3DProvider() = default;
Printer3DProvider::~Printer3DProvider() = default;
void Printer3DProvider::Update()
{
NetworkClientSecure networkClient;
PubSubClient mqttClient(networkClient);
networkClient.setInsecure();
mqttClient.setServer(Config::c_printerIP, 8883);
bool receivedReply = false;
mqttClient.setCallback([&](char* topic, byte* payload, unsigned int length)
{
receivedReply = true;
const StringDict dict{std::string_view(reinterpret_cast<const char*>(payload), length), "/print/"};
const char* gcodeState = *dict.GetValue<const char*>("gcode_state");
const int printPercent = *dict.GetValue<int>("mc_percent");
std::optional<LaMetricManager::Frame> frame;
if (strcmp(gcodeState, "PAUSE") == 0)
{
frame = LaMetricManager::Frame();
frame->m_text = "PAUSED";
frame->m_icon = 68593;
frame->m_goalData = {.m_start = 0, .m_current = printPercent, .m_end = 100};
}
else if (strcmp(gcodeState, "FINISH") == 0 && m_lastInProgressTime && ((millis() - *m_lastInProgressTime) < 15u * 60u * 1000u))
{
frame = LaMetricManager::Frame();
frame->m_text = "FINISHED";
frame->m_icon = 75666;
}
else
{
const auto remainingTime = dict.GetValue<int>("mc_remaining_time");
if (remainingTime && *remainingTime > 0)
{
const int remainingHours = *remainingTime / 60;
const int remainingMinutes = *remainingTime - remainingHours * 60;
frame = LaMetricManager::Frame();
char valueBuffer[16];
snprintf(valueBuffer, sizeof(valueBuffer), "%dh %dm", remainingHours, remainingMinutes);
frame->m_text = valueBuffer;
frame->m_icon = 55700;
frame->m_goalData = {.m_start = 0, .m_current = printPercent, .m_end = 100};
m_lastInProgressTime = millis();
}
}
if (frame)
{
if (m_frameHandle)
{
LaMetricManager::Get().UpdateFrame(*m_frameHandle, std::move(*frame));
}
else
{
m_frameHandle = std::make_unique<LaMetricFrameRequestHandle>(LaMetricManager::Get().AddFrame(std::move(*frame)));
}
}
else if (m_frameHandle)
{
LaMetricManager::Get().RemoveFrame(*m_frameHandle);
m_frameHandle = nullptr;
}
});
mqttClient.setBufferSize(16384);
{
char clientIDBuffer[256];
snprintf(clientIDBuffer, sizeof(clientIDBuffer), "SmartArduino_%llx", static_cast<unsigned long long>(ESP.getEfuseMac()));
mqttClient.connect(clientIDBuffer, "bblp", Config::c_printerAccessCode);
}
ON_SCOPE_EXIT( mqttClient.disconnect(); );
if (mqttClient.connected())
{
{
char reportTopicBuffer[256];
snprintf(reportTopicBuffer, sizeof(reportTopicBuffer), "device/%s/report", Config::c_printerSerial);
mqttClient.subscribe(reportTopicBuffer);
}
{
const char body[] = R"({"pushing":{"sequence_id":"0","command":"pushall","version":1,"push_target":1}})";
char requestTopicBuffer[256];
snprintf(requestTopicBuffer, sizeof(requestTopicBuffer), "device/%s/request", Config::c_printerSerial);
mqttClient.publish(requestTopicBuffer, reinterpret_cast<const uint8_t*>(body), sizeof(body) - 1);
}
unsigned long startTime = millis();
constexpr unsigned long maxWaitingTime = 2000u;
while (!receivedReply && ((millis() - startTime) < maxWaitingTime))
{
mqttClient.loop();
delay(50);
}
if (receivedReply)
{
return;
}
}
Serial.printf("[%hs] Failed to connect to the printer\n", __FUNCTION__);
if (m_frameHandle)
{
LaMetricManager::Get().RemoveFrame(*m_frameHandle);
m_frameHandle = nullptr;
}
}
}