This commit is contained in:
2026-03-10 18:14:23 -04:00
parent 9986b07362
commit 894a8131d4
7 changed files with 45 additions and 28 deletions

View File

@@ -1,8 +1,8 @@
[requires] [requires]
libcontrol/1.0.0 libcontrol/1.0.3
flatbuffers/24.12.23 flatbuffers/24.12.23
spdlog/1.16.0 spdlog/1.16.0
librpc/1.1.7 librpc/1.1.8
[generators] [generators]
CMakeDeps CMakeDeps

View File

@@ -3,6 +3,7 @@
#include <cstring> #include <cstring>
#include <format> #include <format>
#include <iostream> #include <iostream>
#include <random>
#include <thread> #include <thread>
#include <vector> #include <vector>
@@ -10,19 +11,27 @@
#include "rpc/RemoteManagement.h" #include "rpc/RemoteManagement.h"
void progress_monitor_task(std::shared_ptr<RemoteManagement> rm, uint8_t module_id) { void progress_monitor_task(std::shared_ptr<RemoteManagement> rm, uint8_t module_id) {
std::random_device dev;
std::mt19937 rng(dev());
std::uniform_int_distribution<std::mt19937::result_type> dist6(10, 100);
std::cout << dist6(rng) << std::endl;
while (true) { while (true) {
std::this_thread::sleep_for(std::chrono::seconds(5)); std::this_thread::sleep_for(std::chrono::milliseconds(5000 + dist6(rng)));
std::cout << "Module " << (int)module_id << ": " << rm->ota_progress() * 100 << "% complete\n"; std::cout << "Module " << (int)module_id << ": " << rm->ota_progress() * 100 << "% complete"
if (rm->ota_progress() >= 1.0) return; << std::endl;
if (rm->ota_progress() >= 1.0)
return;
} }
} }
void task(std::shared_ptr<RobotController> controller, uint8_t module_id, const std::string& filepath) { void task(std::shared_ptr<RobotController> controller, uint8_t module_id,
const std::string &filepath) {
auto rm = std::make_shared<RemoteManagement>(module_id, filepath, controller); auto rm = std::make_shared<RemoteManagement>(module_id, filepath, controller);
std::thread t(progress_monitor_task, rm, module_id); std::thread t(progress_monitor_task, rm, module_id);
rm->perform_ota(); rm->perform_ota();
t.join(); t.join();
std::cout << "Done updating " << (int)module_id << "\n"; std::cout << "Done updating " << (int)module_id << std::endl;
} }
int main() { int main() {
@@ -31,10 +40,12 @@ int main() {
std::this_thread::sleep_for(std::chrono::seconds(5)); std::this_thread::sleep_for(std::chrono::seconds(5));
std::vector<uint8_t> to_update{}; std::vector<uint8_t> to_update{};
for (const auto& maybe_module : robot_controller->getModules()) { for (const auto &maybe_module : robot_controller->getModules()) {
if (const auto &module = maybe_module.lock()) { if (const auto &module = maybe_module.lock()) {
if (module->get_leader() != module->get_device_id()) { continue; } if (module->get_leader() != module->get_device_id()) {
std::cout << "Updating module " << (int)module->get_device_id(); continue;
}
std::cout << "Updating module " << (int)module->get_device_id() << std::endl;
to_update.emplace_back(module->get_device_id()); to_update.emplace_back(module->get_device_id());
} }
} }
@@ -44,8 +55,7 @@ int main() {
return 0; return 0;
} }
std::string filename = std::string filename = "/home/jslightham/Documents/capstone/firmware/build/firmware.bin";
"/Users/jslightham/Documents/Classes/capstone/firmware/build/firmware.bin";
std::vector<std::thread> threads; std::vector<std::thread> threads;
for (int i = 0; i < to_update.size(); i++) { for (int i = 0; i < to_update.size(); i++) {
threads.emplace_back(task, robot_controller, to_update[i], filename); threads.emplace_back(task, robot_controller, to_update[i], filename);

View File

@@ -23,7 +23,7 @@ bool RemoteManagement::perform_ota() {
m_file.seekg(0, std::ios::end); m_file.seekg(0, std::ios::end);
std::streamsize total_size = m_file.tellg(); std::streamsize total_size = m_file.tellg();
m_file.seekg(0, std::ios::beg); m_file.seekg(0, std::ios::beg);
m_total_packets = total_size/OTA_CHUNK_SIZE; m_total_packets = total_size / OTA_CHUNK_SIZE;
// std::cout << "Total number of chunks: " << total_size/OTA_CHUNK_SIZE << std::endl; // std::cout << "Total number of chunks: " << total_size/OTA_CHUNK_SIZE << std::endl;
while (m_file) { while (m_file) {
@@ -62,11 +62,15 @@ void RemoteManagement::restart() {
bool RemoteManagement::start_ota() { bool RemoteManagement::start_ota() {
// std::cout << "Starting OTA" << std::endl; // std::cout << "Starting OTA" << std::endl;
const auto maybe = m_robot_controller->remote_call(4, m_module_id, {}); int attempts = 0;
if (maybe) { while (attempts < MAX_PACKET_TX_ATTEMPTS) {
// std::cout << "Got valid response" << std::endl; const auto maybe = m_robot_controller->remote_call(4, m_module_id, {});
m_sequence_num = 1; if (maybe) {
return (*maybe)->at(0) > 0; // std::cout << "Got valid response" << std::endl;
m_sequence_num = 1;
return (*maybe)->at(0) > 0;
}
attempts++;
} }
return false; return false;
} }

View File

@@ -1,8 +1,8 @@
[requires] [requires]
libcontrol/1.0.0 libcontrol/1.0.3
flatbuffers/24.12.23 flatbuffers/24.12.23
spdlog/1.16.0 spdlog/1.16.0
librpc/1.1.7 librpc/1.1.8
[generators] [generators]
CMakeDeps CMakeDeps

View File

@@ -24,17 +24,20 @@ int main() {
std::cout << "Found " << controller->getModules().size() << " modules" << std::endl; std::cout << "Found " << controller->getModules().size() << " modules" << std::endl;
for (const auto &maybe_module : controller->getModules()) { for (const auto &maybe_module : controller->getModules()) {
if (const auto &module = maybe_module.lock()) { if (const auto &module = maybe_module.lock()) {
if (module->get_type() == ModuleType_DC_MOTOR) { if (module->get_type() == ModuleType_SERVO_2 ||
module->get_type() == ModuleType_SERVO_1) {
std::cout << "Actuating " << (int)module->get_device_id() << " leader "
<< (int)module->get_leader() << std::endl;
int randomNumber = dist(gen); int randomNumber = dist(gen);
if (module->get_position() > 90) { if (module->get_position() > 90) {
module->actuate(70 - randomNumber); module->actuate(50 - randomNumber);
} else { } else {
module->actuate(110 + randomNumber); module->actuate(150 + randomNumber);
} }
std::this_thread::sleep_for(std::chrono::milliseconds(250));
} }
} }
} }
std::this_thread::sleep_for(std::chrono::milliseconds(100));
} }
return 0; return 0;

View File

@@ -10,13 +10,13 @@
class Actuator : public Module { class Actuator : public Module {
public: public:
explicit Actuator(uint8_t device_id) : Module(device_id) {}; explicit Actuator(uint8_t device_id) : Module(device_id){};
Actuator(uint8_t device_id, ModuleType module_type) : Module(device_id, module_type) {}; Actuator(uint8_t device_id, ModuleType module_type) : Module(device_id, module_type){};
Actuator(uint8_t device_id, ModuleType module_type, Messaging::ConnectionType connection_type, Actuator(uint8_t device_id, ModuleType module_type, Messaging::ConnectionType connection_type,
uint8_t leader) uint8_t leader)
: Module(device_id, module_type, connection_type, leader) {}; : Module(device_id, module_type, connection_type, leader){};
protected: protected:
virtual std::vector<uint8_t> get_actuation_message() = 0; virtual std::vector<uint8_t> get_actuation_message() = 0;

View File

@@ -16,7 +16,7 @@ class PositionalActuator1D final : public Actuator {
public: public:
PositionalActuator1D(uint8_t device_id, ModuleType type) PositionalActuator1D(uint8_t device_id, ModuleType type)
: Actuator(device_id, type), : Actuator(device_id, type),
m_acm_builder(std::make_unique<Flatbuffers::AngleControlMessageBuilder>()) {}; m_acm_builder(std::make_unique<Flatbuffers::AngleControlMessageBuilder>()){};
double get_position() override; double get_position() override;
void actuate(double position) override; void actuate(double position) override;