From 6f6ca885c9622fceab4cf70ff668480c8f7be286 Mon Sep 17 00:00:00 2001 From: Johnnykoch02 Date: Wed, 14 Feb 2024 00:58:24 -0500 Subject: [PATCH 1/4] Fixing linker errors --- README.md | 10 +++---- common.mk | 8 +++--- firmware/libvex.a | Bin 39328 -> 43372 bytes include/TerriBull/DeviceManager.hpp | 22 ++++++---------- include/TerriBull/Devices/device.hpp | 3 +++ include/protos/vex.pb.h | 3 +++ src/DeviceManager.cpp | 38 +++++++++------------------ src/SerialController.cpp | 2 +- 8 files changed, 36 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index c4846bc..b2a8846 100644 --- a/README.md +++ b/README.md @@ -33,17 +33,17 @@ You should now have generated the `.pb.h` and `.pb.c` files. ```bash mkdir ./obj/ -arm-none-eabi-gcc -c -o ./obj/vex.pb.o ./include/protos/vex.pb.c -I./nanopb/ -I. -arm-none-eabi-gcc -c -o ./obj/pb_encode.o ./nanopb/pb_encode.c -I./nanopb/ -I. -arm-none-eabi-gcc -c -o ./obj/pb_decode.o ./nanopb/pb_decode.c -I./nanopb/ -I. -arm-none-eabi-gcc -c -o ./obj/pb_common.o ./nanopb/pb_common.c -I./nanopb/ -I. +arm-none-eabi-g++ -c -o ./obj/vex.pb.o ./include/protos/vex.pb.c -I./nanopb/ -I. +arm-none-eabi-g++ -c -o ./obj/pb_encode.o ./nanopb/pb_encode.c -I./nanopb/ -I. +arm-none-eabi-g++ -c -o ./obj/pb_decode.o ./nanopb/pb_decode.c -I./nanopb/ -I. +arm-none-eabi-g++ -c -o ./obj/pb_common.o ./nanopb/pb_common.c -I./nanopb/ -I. ``` - You should now have the obj files linked in the obj/ directory. Run: ```bash -ar rcs firmware/libvex.a obj/vex.pb.o obj/pb_encode.o obj/pb_decode.o obj/pb_common.o +arm-none-eabi-ar rcs firmware/libvex.a obj/vex.pb.o obj/pb_encode.o obj/pb_decode.o obj/pb_common.o ``` ## Usage diff --git a/common.mk b/common.mk index f069d58..8ec6928 100644 --- a/common.mk +++ b/common.mk @@ -29,10 +29,10 @@ wlprefix=-Wl,$(subst $(SPACE),$(COMMA),$1) LNK_FLAGS=--gc-sections --start-group $(strip $(LIBRARIES)) -lgcc -lstdc++ --end-group -T$(FWDIR)/v5-common.ld ASMFLAGS=$(MFLAGS) $(WARNFLAGS) +NANOPB_DIR := $(realpath ./nanopb) CFLAGS=$(MFLAGS) $(CPPFLAGS) $(WARNFLAGS) $(GCCFLAGS) --std=gnu11 CFLAGS+= -I$(NANOPB_DIR) CXXFLAGS=$(MFLAGS) $(CPPFLAGS) $(WARNFLAGS) $(GCCFLAGS) --std=gnu++17 -NANOPB_DIR := $(realpath ./nanopb) CXXFLAGS += -I$(NANOPB_DIR) @@ -228,7 +228,7 @@ $(MONOLITH_BIN): $(MONOLITH_ELF) $(BINDIR) $(MONOLITH_ELF): $(ELF_DEPS) $(LIBRARIES) $(call _pros_ld_timestamp) - $(call test_output_2,Linking project with $(ARCHIVE_TEXT_LIST) ,$(LD) $(LDFLAGS) $(ELF_DEPS) $(LDTIMEOBJ) $(call wlprefix,-T$(FWDIR)/v5.ld $(LNK_FLAGS)) L./firmware -lvex -o $@,$(OK_STRING)) + $(call test_output_2,Linking project with $(ARCHIVE_TEXT_LIST) ,$(LD) $(LDFLAGS) $(ELF_DEPS) $(LDTIMEOBJ) $(call wlprefix,-T$(FWDIR)/v5.ld $(LNK_FLAGS)) -lvex -o $@,$(OK_STRING)) @echo Section sizes: -$(VV)$(SIZETOOL) $(SIZEFLAGS) $@ $(SIZES_SED) $(SIZES_NUMFMT) @@ -237,7 +237,7 @@ $(COLD_BIN): $(COLD_ELF) $(COLD_ELF): $(COLD_LIBRARIES) $(VV)mkdir -p $(dir $@) - $(call test_output_2,Creating cold package with $(ARCHIVE_TEXT_LIST) ,$(LD) $(LDFLAGS) $(call wlprefix,--gc-keep-exported --whole-archive $^ -lstdc++ --no-whole-archive) $(call wlprefix,-T$(FWDIR)/v5.ld $(LNK_FLAGS) L./firmware -lvex -o $@),$(OK_STRING)) + $(call test_output_2,Creating cold package with $(ARCHIVE_TEXT_LIST) ,$(LD) $(LDFLAGS) $(call wlprefix,--gc-keep-exported --whole-archive $^ -lstdc++ --no-whole-archive) $(call wlprefix,-T$(FWDIR)/v5.ld $(LNK_FLAGS) -o $@),$(OK_STRING)) $(call test_output_2,Stripping cold package ,$(OBJCOPY) --strip-symbol=install_hot_table --strip-symbol=__libc_init_array --strip-symbol=_PROS_COMPILE_DIRECTORY --strip-symbol=_PROS_COMPILE_TIMESTAMP --strip-symbol=_PROS_COMPILE_TIMESTAMP_INT $@ $@, $(DONE_STRING)) @echo Section sizes: -$(VV)$(SIZETOOL) $(SIZEFLAGS) $@ $(SIZES_SED) $(SIZES_NUMFMT) @@ -247,7 +247,7 @@ $(HOT_BIN): $(HOT_ELF) $(COLD_BIN) $(HOT_ELF): $(COLD_ELF) $(ELF_DEPS) $(call _pros_ld_timestamp) - $(call test_output_2,Linking hot project with $(COLD_ELF) and $(ARCHIVE_TEXT_LIST) ,$(LD) -nostartfiles $(LDFLAGS) $(call wlprefix,-R $<) $(filter-out $<,$^) $(LDTIMEOBJ) $(LIBRARIES) $(call wlprefix,-T$(FWDIR)/v5-hot.ld $(LNK_FLAGS) L./firmware -lvex -o $@),$(OK_STRING)) + $(call test_output_2,Linking hot project with $(COLD_ELF) and $(ARCHIVE_TEXT_LIST) ,$(LD) -nostartfiles $(LDFLAGS) $(call wlprefix,-R $<) $(filter-out $<,$^) $(LDTIMEOBJ) $(LIBRARIES) $(call wlprefix,-T$(FWDIR)/v5-hot.ld $(LNK_FLAGS) -o $@),$(OK_STRING)) @printf "%s\n" "Section sizes:" -$(VV)$(SIZETOOL) $(SIZEFLAGS) $@ $(SIZES_SED) $(SIZES_NUMFMT) diff --git a/firmware/libvex.a b/firmware/libvex.a index 4698b90c1766ba261bfd3bbd82bd496513ba8536..4d6e245cc7c1e05ccbc0819237897eaabc542285 100644 GIT binary patch literal 43372 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 #ifdef __cplusplus extern "C" { -#include "../protos/vex.pb.h" // Adjust the path as necessary + #include "../protos/vex.pb.h" // Adjust the path as necessary } #endif @@ -18,22 +17,17 @@ extern "C" { #include class DeviceManager { - private: - std::map devices; public: + DeviceManager() = default; + ~DeviceManager(); // Implement cleanup in the CPP file - DeviceManager() {} - ~DeviceManager(); // TODO: delete all devices - /** - * @brief Adds a device to the manager - * - * @param device DeviceHeader* to keep track of on a port - */ - void add_device(DeviceHeader* device); // get port from device (device->port) - DeviceHeader* get_device(uint8_t port); + bool serializeMessage(const TerriBullDevices_FunctionCall* message, uint8_t* buffer, size_t buffer_size, size_t* message_length); + void add_device(TerriBullDevices_DeviceHeader* device); + TerriBullDevices_DeviceHeader* get_device(uint32_t port); bool processMessage(const uint8_t* buffer, size_t size); - bool serializeMessage(const FunctionCall* message, uint8_t* buffer, size_t buffer_size, size_t* message_length); + private: + std::map devices; }; diff --git a/include/TerriBull/Devices/device.hpp b/include/TerriBull/Devices/device.hpp index ddc8b18..3a0dfa4 100644 --- a/include/TerriBull/Devices/device.hpp +++ b/include/TerriBull/Devices/device.hpp @@ -1,7 +1,10 @@ #ifndef __TERRIBULL_DEVICES__ #define __TERRIBULL_DEVICES__ +extern class DeviceManager; + #include "../TerriBull.hpp" +#include "../DeviceManager.hpp" // namespace TerriBull { /** diff --git a/include/protos/vex.pb.h b/include/protos/vex.pb.h index 0d5a574..b20eba4 100644 --- a/include/protos/vex.pb.h +++ b/include/protos/vex.pb.h @@ -4,6 +4,9 @@ #ifndef PB_TERRIBULLDEVICES_INCLUDE_PROTOS_VEX_PB_H_INCLUDED #define PB_TERRIBULLDEVICES_INCLUDE_PROTOS_VEX_PB_H_INCLUDED #include +#include +#include +#include #if PB_PROTO_HEADER_VERSION != 40 #error Regenerate this file with the current version of nanopb generator. diff --git a/src/DeviceManager.cpp b/src/DeviceManager.cpp index c394942..135337d 100644 --- a/src/DeviceManager.cpp +++ b/src/DeviceManager.cpp @@ -1,21 +1,21 @@ #include "../include/TerriBull/DeviceManager.hpp" -bool DeviceManager::serializeMessage(const FunctionCall* message, uint8_t* buffer, size_t buffer_size, size_t* message_length) { +bool DeviceManager::serializeMessage(const TerriBullDevices_FunctionCall* message, uint8_t* buffer, size_t buffer_size, size_t* message_length) { pb_ostream_t stream = pb_ostream_from_buffer(buffer, buffer_size); - if (!pb_encode(&stream, FunctionCall_fields, message)) { - // Handle encode error + if (!pb_encode(&stream, TerriBullDevices_FunctionCall_fields, message)) { + // Log or handle encode error + std::cerr << "Encoding failed: " << PB_GET_ERROR(&stream) << std::endl; return false; } *message_length = stream.bytes_written; return true; } -void DeviceManager::add_device(DeviceHeader* device) { - // Assumes device->port is accessible and is the unique identifier for the device. +void DeviceManager::add_device(TerriBullDevices_DeviceHeader* device) { devices[device->port] = device; } -DeviceHeader* DeviceManager::get_device(uint8_t port) { +TerriBullDevices_DeviceHeader* DeviceManager::get_device(uint32_t port) { auto it = devices.find(port); if (it != devices.end()) { return it->second; @@ -23,30 +23,16 @@ DeviceHeader* DeviceManager::get_device(uint8_t port) { return nullptr; // Return nullptr if device not found } - -bool TerriBull::DeviceManager::processMessage(const uint8_t* buffer, size_t size) { - FunctionCall message = FunctionCall_init_zero; // Initialize to defaults +bool DeviceManager::processMessage(const uint8_t* buffer, size_t size) { + TerriBullDevices_FunctionCall message = TerriBullDevices_FunctionCall_init_zero; // Initialize to defaults pb_istream_t stream = pb_istream_from_buffer(buffer, size); - if (!pb_decode(&stream, FunctionCall_fields, &message)) { + if (!pb_decode(&stream, TerriBullDevices_FunctionCall_fields, &message)) { std::cerr << "Decoding failed: " << PB_GET_ERROR(&stream) << std::endl; return false; } - // Process the message, e.g., call appropriate methods based on message content - // Example: - if (message.has_motorInitializeData) { - // motorInitializeCallback(message.motorInitializeData); - } else if (message.has_motorSetVelocityData) { - // motorSetVelocityCallback(message.motorSetVelocityData); - } - // Add more conditions for other types of messages + // Process the message based on its type + // Example: if (message.which_callbackData == TerriBullDevices_FunctionCall_motorInitializeData_tag) {...} return true; -} - -DeviceManager::~DeviceManager() { - for (auto& pair : devices) { - delete pair.second; // Assuming dynamic allocation of DeviceHeader* - } - devices.clear(); -} +} \ No newline at end of file diff --git a/src/SerialController.cpp b/src/SerialController.cpp index 0fa9ad1..68b5b38 100644 --- a/src/SerialController.cpp +++ b/src/SerialController.cpp @@ -13,7 +13,7 @@ #include #include -#include "../../include/TerriBull/SerialController.hpp" +#include "../include/TerriBull/SerialController.hpp" std::string SerialController::input_buffer; pros::Mutex SerialController::input_mutex; From a5da8d9d09354e7eefdb08cfb8994057dfb8842e Mon Sep 17 00:00:00 2001 From: Johnnykoch02 Date: Thu, 15 Feb 2024 20:38:25 -0500 Subject: [PATCH 2/4] Builds with device implementations, added proto to callback handling, demoed basic function calling. TODo: add response construction and sending logic. --- README.md | 29 ++++++++-- firmware/libvex.a | Bin 43372 -> 43648 bytes include/TerriBull/DeviceManager.hpp | 8 +-- include/TerriBull/Devices/device.hpp | 72 ++++++++++++------------- include/TerriBull/SerialController.hpp | 2 - include/protos/vex.pb.c | 3 ++ include/protos/vex.pb.h | 35 ++++++++++-- include/protos/vex.proto | 14 +++-- src/DeviceManager.cpp | 32 +++++++++-- src/SerialController.cpp | 31 +++++------ src/device.cpp | 39 ++++++++++++++ 11 files changed, 186 insertions(+), 79 deletions(-) create mode 100644 src/device.cpp diff --git a/README.md b/README.md index b2a8846..7585406 100644 --- a/README.md +++ b/README.md @@ -13,20 +13,33 @@ The TerriBull Device Manager is a comprehensive system designed for managing var - PROS library for VEX Robotics - nanopb -## Installation +## Installation/Compilation 1. Ensure the PROS library is installed and properly configured in your development environment. 2. Clone this repository into your project's directory. 3. Include the `TerriBull.hpp` and the `Devices` directory in your project's include paths. ### Creating protobuf Definitions: -1. Ensure `nanopb` is installed, let `$nanopb_path` be the path to the nanopb/generator file. +1. Ensure `nanopb` is installed in the project. 2. cd into project 3. ```bash -python $nanopb_path/nanopb_generator.py --out=. ./include/protos/vex.proto +python python nanopb/generator/nanopb_generator.py --out=. ./include/protos/vex.proto ``` -You should now have generated the `.pb.h` and `.pb.c` files. +- You should now have generated the `.pb.h` and `.pb.c` files. + +- To finish this process, find the `vex.pb.h` file and modify the top of the file to look like this: +```c +/* Automatically generated nanopb header */ +/* Generated by nanopb-0.4.9-dev */ + +#ifndef PB_TERRIBULLDEVICES_INCLUDE_PROTOS_VEX_PB_H_INCLUDED +#define PB_TERRIBULLDEVICES_INCLUDE_PROTOS_VEX_PB_H_INCLUDED +#include +#include +#include +#include +``` ### Creating the obj Files - Ensure you have `arm-none-eabi` compiler for Cortex @@ -46,6 +59,14 @@ Run: arm-none-eabi-ar rcs firmware/libvex.a obj/vex.pb.o obj/pb_encode.o obj/pb_decode.o obj/pb_common.o ``` +### Building with Pros +- Ensure you have Pros CLI installed on your computer. +- An error will occur if +Run: +```bash +pros build +``` + ## Usage ### Initializing a Motor diff --git a/firmware/libvex.a b/firmware/libvex.a index 4d6e245cc7c1e05ccbc0819237897eaabc542285..12e03e92389ecf9a4e829c0577d467763b5aff03 100644 GIT binary patch delta 726 zcmb7?&nrYx6vxlK-oyNU&##%mFpRv-q%lnyB|mD?C>E3~nKGo17=vo;=227J`gZ!9bNk+NPB(YOcW=1fyAuva{Dm`P1%NI9 z+5R`x=m7uKNCx1i;=dE+`QQ-*&3yRk z>`_~2OzMLB0n#G2VZX~AY^R%o0>vJM&xK%$Vuieedi~_QvEXtsE^*va+T~IDgLyns u0xXJ`ipCc4MbR7?4zNP9(Ca>IQ=4QvISt@gJRtYk0LGCiwMJUaAASJwHi8ZS delta 601 zcmZp;%Jk+E(*(sIMe-9G>ACUhBiLbx{G>Z{oULcU~fW&VG@>>vmHijiY zfjyf&xjLCQYx8+90^I>}4ihT_g9wy%0nyTvSMjSWN;5EQ0r6xZjsU4T09Ew_qUsaB zxs43a$v`WZN|5Rf5Fbcy0MQCS(?GN$&@`y{fz7o7{EUoOCLi<=p1eR% zfVG5^f#JsFt%Ayo9FuPfsx#V5W)xEA&0zxi3W$M{4APSwJ*C;!0KIXHWpbF15~~j| Q;RH@r^bp=WLFmJD024WDEC2ui diff --git a/include/TerriBull/DeviceManager.hpp b/include/TerriBull/DeviceManager.hpp index 6d9308c..19955cc 100644 --- a/include/TerriBull/DeviceManager.hpp +++ b/include/TerriBull/DeviceManager.hpp @@ -10,6 +10,8 @@ extern "C" { #include "../protos/vex.pb.h" // Adjust the path as necessary } +#include "Devices/device.hpp" + #endif #include @@ -22,12 +24,12 @@ class DeviceManager { ~DeviceManager(); // Implement cleanup in the CPP file bool serializeMessage(const TerriBullDevices_FunctionCall* message, uint8_t* buffer, size_t buffer_size, size_t* message_length); - void add_device(TerriBullDevices_DeviceHeader* device); - TerriBullDevices_DeviceHeader* get_device(uint32_t port); + void add_device(DeviceHeader* device); + DeviceHeader* get_device(uint32_t port); bool processMessage(const uint8_t* buffer, size_t size); private: - std::map devices; + std::map devices; }; diff --git a/include/TerriBull/Devices/device.hpp b/include/TerriBull/Devices/device.hpp index 3a0dfa4..5c80441 100644 --- a/include/TerriBull/Devices/device.hpp +++ b/include/TerriBull/Devices/device.hpp @@ -1,11 +1,9 @@ #ifndef __TERRIBULL_DEVICES__ #define __TERRIBULL_DEVICES__ -extern class DeviceManager; - #include "../TerriBull.hpp" -#include "../DeviceManager.hpp" -// namespace TerriBull { + +class DeviceManager; /** * E_DEVICE_NONE = 0, @@ -20,7 +18,7 @@ extern class DeviceManager; * E_DEVICE_GPS = 20, * E_DEVICE_SERIAL = 129, */ -typedef struct { +typedef struct { pros::c::v5_device_e_t pros_device_type; uint8_t port; } DeviceHeader; @@ -39,9 +37,10 @@ typedef struct { */ typedef enum device_callback_return_code { - SUCCESS = 0, - DEVICE_TYPE_MISMATCH = 1, - DEVICE_NOT_EXIST = 2, + FUNC_NOT_FOUND = 0, + SUCCESS = 1, + DEVICE_TYPE_MISMATCH = 2, + DEVICE_NOT_EXIST = 3 }; typedef struct { @@ -53,30 +52,11 @@ typedef struct { // Other motor-specific members } MotorDevice; -/** - * @brief Should Initialize device with Port and proto data - * - * @param port - * @param data contains {uint8_t port, int GEAR_SET, int BREAK_MODE} - * @return device_callback_return_code - */ + typedef struct { uint8_t port; int GEAR_SET; int BREAK_MODE; } motor_initialize_callback_data; -device_callback_return_code motor_device_initalize(DeviceManager* _motherSys, motor_initialize_callback_data data) { - MotorDevice* device = (MotorDevice*) malloc(sizeof(MotorDevice)); - device->header.pros_device_type = pros::c::v5_device_e_t::E_DEVICE_MOTOR; - device->header.port = data.port; - device->gear_set = (pros::motor_gearset_e_t) data.GEAR_SET; - device->break_mode = (pros::motor_brake_mode_e_t) data.BREAK_MODE; - pros::c::motor_tare_position(device->header.port); - pros::c::motor_set_brake_mode(device->header.port, device->break_mode); - pros::c::motor_set_gearing(device->header.port, device->gear_set); - device->velocity = pros::c::motor_get_actual_velocity(device->header.port); - _motherSys->add_device(device); // pointer to device - return device_callback_return_code::SUCCESS; -} /** * @brief Should set motors velocity to the proto data @@ -91,19 +71,10 @@ typedef struct { int16_t velocity; } motor_set_velocity_callback_data; -device_callback_return_code motor_device_set_velocity(DeviceManager* _motherSys, motor_set_velocity_callback_data data) { - DeviceHeader* device = _motherSys->get_device(data.port); - if (device != nullptr) return device_callback_return_code::DEVICE_NOT_EXIST; - if( ! device->pros_device_type == pros::c::v5_device_e_t::E_DEVICE_MOTOR) return device_callback_return_code::DEVICE_TYPE_MISMATCH; - - MotorDevice* motor = static_cast((void*)device); - pros::c::motor_move_velocity(motor->header.port, data.velocity); - return device_callback_return_code::SUCCESS; -} typedef struct { - DeviceHeader header; // First member is the DeviceHeader + DeviceHeader header; float roll; float yaw; float pitch; @@ -111,8 +82,31 @@ typedef struct { } IMUDevice; typedef struct { - DeviceHeader header; // First member is the DeviceHeader + DeviceHeader header; float value; } AnalogDevice; + +#include "../DeviceManager.hpp" + +// Callbacks and Function Definitions + +/** + * @brief Should Initialize motor device with Port and proto data + * + * @param data contains {uint8_t port, int GEAR_SET, int BREAK_MODE} + * @return device_callback_return_code + */ +device_callback_return_code motor_device_initalize(DeviceManager* _motherSys, motor_initialize_callback_data data); +/** + * @brief Should set motors velocity to the proto data + * + * @param port + * @param data contains {uint8_t port, int GEAR_SET, int BREAK_MODE} + * @return device_callback_return_code + * This velocity corresponds to different actual speeds depending on the gearset used for the motor. This results in a range of +-100 for E_MOTOR_GEARSET_36, +-200 for E_MOTOR_GEARSET_18, and +-600 for blue. The velocity is held with PID to ensure consistent speed, as opposed to setting the motor’s voltage. + */ +device_callback_return_code motor_device_set_velocity(DeviceManager* _motherSys, motor_set_velocity_callback_data data); + + #endif \ No newline at end of file diff --git a/include/TerriBull/SerialController.hpp b/include/TerriBull/SerialController.hpp index 92b1f45..0322518 100644 --- a/include/TerriBull/SerialController.hpp +++ b/include/TerriBull/SerialController.hpp @@ -42,8 +42,6 @@ class SerialController { private: static constexpr char __end_of_transmission[4] = { (char)0, (char)0, (char)10, (char)10 }; - map Callbacks; - map tmpCallbacks; vector ScheduledUpdates; DeviceManager* motherSys; diff --git a/include/protos/vex.pb.c b/include/protos/vex.pb.c index 4dde279..b6c350f 100644 --- a/include/protos/vex.pb.c +++ b/include/protos/vex.pb.c @@ -33,6 +33,9 @@ PB_BIND(TerriBullDevices_DeviceValue, TerriBullDevices_DeviceValue, AUTO) PB_BIND(TerriBullDevices_FunctionCall, TerriBullDevices_FunctionCall, AUTO) +PB_BIND(TerriBullDevices_ReturnData, TerriBullDevices_ReturnData, AUTO) + + diff --git a/include/protos/vex.pb.h b/include/protos/vex.pb.h index b20eba4..7e1d78c 100644 --- a/include/protos/vex.pb.h +++ b/include/protos/vex.pb.h @@ -41,9 +41,10 @@ typedef enum _TerriBullDevices_MotorBrakeMode { } TerriBullDevices_MotorBrakeMode; typedef enum _TerriBullDevices_DeviceCallbackReturnCode { - TerriBullDevices_DeviceCallbackReturnCode_SUCCESS = 0, - TerriBullDevices_DeviceCallbackReturnCode_DEVICE_TYPE_MISMATCH = 1, - TerriBullDevices_DeviceCallbackReturnCode_DEVICE_NOT_EXIST = 2 + TerriBullDevices_DeviceCallbackReturnCode_FUNC_NOT_FOUND = 0, + TerriBullDevices_DeviceCallbackReturnCode_SUCCESS = 1, + TerriBullDevices_DeviceCallbackReturnCode_DEVICE_TYPE_MISMATCH = 2, + TerriBullDevices_DeviceCallbackReturnCode_DEVICE_NOT_EXIST = 3 } TerriBullDevices_DeviceCallbackReturnCode; /* Struct definitions */ @@ -114,6 +115,14 @@ typedef struct _TerriBullDevices_FunctionCall { } callbackData; } TerriBullDevices_FunctionCall; +typedef struct _TerriBullDevices_ReturnData { + pb_size_t which_returnValue; + union { + TerriBullDevices_DeviceValue deviceValue; + } returnValue; + TerriBullDevices_DeviceCallbackReturnCode return_code; +} TerriBullDevices_ReturnData; + #ifdef __cplusplus extern "C" { @@ -132,7 +141,7 @@ extern "C" { #define _TerriBullDevices_MotorBrakeMode_MAX TerriBullDevices_MotorBrakeMode_BRAKE_MODE_HOLD #define _TerriBullDevices_MotorBrakeMode_ARRAYSIZE ((TerriBullDevices_MotorBrakeMode)(TerriBullDevices_MotorBrakeMode_BRAKE_MODE_HOLD+1)) -#define _TerriBullDevices_DeviceCallbackReturnCode_MIN TerriBullDevices_DeviceCallbackReturnCode_SUCCESS +#define _TerriBullDevices_DeviceCallbackReturnCode_MIN TerriBullDevices_DeviceCallbackReturnCode_FUNC_NOT_FOUND #define _TerriBullDevices_DeviceCallbackReturnCode_MAX TerriBullDevices_DeviceCallbackReturnCode_DEVICE_NOT_EXIST #define _TerriBullDevices_DeviceCallbackReturnCode_ARRAYSIZE ((TerriBullDevices_DeviceCallbackReturnCode)(TerriBullDevices_DeviceCallbackReturnCode_DEVICE_NOT_EXIST+1)) @@ -150,6 +159,8 @@ extern "C" { +#define TerriBullDevices_ReturnData_return_code_ENUMTYPE TerriBullDevices_DeviceCallbackReturnCode + /* Initializer values for message structs */ #define TerriBullDevices_DeviceHeader_init_default {_TerriBullDevices_DeviceType_MIN, 0} @@ -161,6 +172,7 @@ extern "C" { #define TerriBullDevices_MotorSetVelocityCallbackData_init_default {0, 0} #define TerriBullDevices_DeviceValue_init_default {0, {TerriBullDevices_MotorDevice_init_default}} #define TerriBullDevices_FunctionCall_init_default {0, {TerriBullDevices_MotorInitializeCallbackData_init_default}} +#define TerriBullDevices_ReturnData_init_default {0, {TerriBullDevices_DeviceValue_init_default}, _TerriBullDevices_DeviceCallbackReturnCode_MIN} #define TerriBullDevices_DeviceHeader_init_zero {_TerriBullDevices_DeviceType_MIN, 0} #define TerriBullDevices_MotorDevice_init_zero {false, TerriBullDevices_DeviceHeader_init_zero, 0, 0, _TerriBullDevices_MotorGearSet_MIN, _TerriBullDevices_MotorBrakeMode_MIN} #define TerriBullDevices_IMUAccel_init_zero {0, 0, 0} @@ -170,6 +182,7 @@ extern "C" { #define TerriBullDevices_MotorSetVelocityCallbackData_init_zero {0, 0} #define TerriBullDevices_DeviceValue_init_zero {0, {TerriBullDevices_MotorDevice_init_zero}} #define TerriBullDevices_FunctionCall_init_zero {0, {TerriBullDevices_MotorInitializeCallbackData_init_zero}} +#define TerriBullDevices_ReturnData_init_zero {0, {TerriBullDevices_DeviceValue_init_zero}, _TerriBullDevices_DeviceCallbackReturnCode_MIN} /* Field tags (for use in manual encoding/decoding) */ #define TerriBullDevices_DeviceHeader_pros_device_type_tag 1 @@ -199,6 +212,8 @@ extern "C" { #define TerriBullDevices_DeviceValue_analogDevice_tag 3 #define TerriBullDevices_FunctionCall_motorInitializeData_tag 1 #define TerriBullDevices_FunctionCall_motorSetVelocityData_tag 2 +#define TerriBullDevices_ReturnData_deviceValue_tag 1 +#define TerriBullDevices_ReturnData_return_code_tag 2 /* Struct field encoding specification for nanopb */ #define TerriBullDevices_DeviceHeader_FIELDLIST(X, a) \ @@ -273,6 +288,13 @@ X(a, STATIC, ONEOF, MESSAGE, (callbackData,motorSetVelocityData,callbackDa #define TerriBullDevices_FunctionCall_callbackData_motorInitializeData_MSGTYPE TerriBullDevices_MotorInitializeCallbackData #define TerriBullDevices_FunctionCall_callbackData_motorSetVelocityData_MSGTYPE TerriBullDevices_MotorSetVelocityCallbackData +#define TerriBullDevices_ReturnData_FIELDLIST(X, a) \ +X(a, STATIC, ONEOF, MESSAGE, (returnValue,deviceValue,returnValue.deviceValue), 1) \ +X(a, STATIC, SINGULAR, UENUM, return_code, 2) +#define TerriBullDevices_ReturnData_CALLBACK NULL +#define TerriBullDevices_ReturnData_DEFAULT NULL +#define TerriBullDevices_ReturnData_returnValue_deviceValue_MSGTYPE TerriBullDevices_DeviceValue + extern const pb_msgdesc_t TerriBullDevices_DeviceHeader_msg; extern const pb_msgdesc_t TerriBullDevices_MotorDevice_msg; extern const pb_msgdesc_t TerriBullDevices_IMUAccel_msg; @@ -282,6 +304,7 @@ extern const pb_msgdesc_t TerriBullDevices_MotorInitializeCallbackData_msg; extern const pb_msgdesc_t TerriBullDevices_MotorSetVelocityCallbackData_msg; extern const pb_msgdesc_t TerriBullDevices_DeviceValue_msg; extern const pb_msgdesc_t TerriBullDevices_FunctionCall_msg; +extern const pb_msgdesc_t TerriBullDevices_ReturnData_msg; /* Defines for backwards compatibility with code written before nanopb-0.4.0 */ #define TerriBullDevices_DeviceHeader_fields &TerriBullDevices_DeviceHeader_msg @@ -293,9 +316,10 @@ extern const pb_msgdesc_t TerriBullDevices_FunctionCall_msg; #define TerriBullDevices_MotorSetVelocityCallbackData_fields &TerriBullDevices_MotorSetVelocityCallbackData_msg #define TerriBullDevices_DeviceValue_fields &TerriBullDevices_DeviceValue_msg #define TerriBullDevices_FunctionCall_fields &TerriBullDevices_FunctionCall_msg +#define TerriBullDevices_ReturnData_fields &TerriBullDevices_ReturnData_msg /* Maximum encoded size of messages (where known) */ -#define TERRIBULLDEVICES_INCLUDE_PROTOS_VEX_PB_H_MAX_SIZE TerriBullDevices_DeviceValue_size +#define TERRIBULLDEVICES_INCLUDE_PROTOS_VEX_PB_H_MAX_SIZE TerriBullDevices_ReturnData_size #define TerriBullDevices_AnalogDevice_size 16 #define TerriBullDevices_DeviceHeader_size 9 #define TerriBullDevices_DeviceValue_size 45 @@ -305,6 +329,7 @@ extern const pb_msgdesc_t TerriBullDevices_FunctionCall_msg; #define TerriBullDevices_MotorDevice_size 29 #define TerriBullDevices_MotorInitializeCallbackData_size 14 #define TerriBullDevices_MotorSetVelocityCallbackData_size 17 +#define TerriBullDevices_ReturnData_size 49 #ifdef __cplusplus } /* extern "C" */ diff --git a/include/protos/vex.proto b/include/protos/vex.proto index 25398a5..37ec958 100644 --- a/include/protos/vex.proto +++ b/include/protos/vex.proto @@ -30,9 +30,10 @@ enum MotorBrakeMode { } enum DeviceCallbackReturnCode { - SUCCESS = 0; - DEVICE_TYPE_MISMATCH = 1; - DEVICE_NOT_EXIST = 2; + FUNC_NOT_FOUND = 0; + SUCCESS = 1; + DEVICE_TYPE_MISMATCH = 2; + DEVICE_NOT_EXIST = 3; } message DeviceHeader { @@ -98,4 +99,9 @@ message FunctionCall { } } -// Now create a DeviceManager class which implements a C definition of the proto file and \ No newline at end of file +message ReturnData { + oneof returnValue { + DeviceValue deviceValue = 1; + } + DeviceCallbackReturnCode return_code = 2; +} \ No newline at end of file diff --git a/src/DeviceManager.cpp b/src/DeviceManager.cpp index 135337d..f424c27 100644 --- a/src/DeviceManager.cpp +++ b/src/DeviceManager.cpp @@ -11,11 +11,11 @@ bool DeviceManager::serializeMessage(const TerriBullDevices_FunctionCall* messag return true; } -void DeviceManager::add_device(TerriBullDevices_DeviceHeader* device) { +void DeviceManager::add_device(DeviceHeader* device) { devices[device->port] = device; } -TerriBullDevices_DeviceHeader* DeviceManager::get_device(uint32_t port) { +DeviceHeader* DeviceManager::get_device(uint32_t port) { auto it = devices.find(port); if (it != devices.end()) { return it->second; @@ -32,7 +32,33 @@ bool DeviceManager::processMessage(const uint8_t* buffer, size_t size) { } // Process the message based on its type - // Example: if (message.which_callbackData == TerriBullDevices_FunctionCall_motorInitializeData_tag) {...} + device_callback_return_code r_code = FUNC_NOT_FOUND; + switch (message.which_callbackData) { + case TerriBullDevices_FunctionCall_motorInitializeData_tag: { + motor_initialize_callback_data data; + data.port = message.callbackData.motorInitializeData.port; + data.GEAR_SET = message.callbackData.motorInitializeData.GEAR_SET; + data.BREAK_MODE = message.callbackData.motorInitializeData.BREAK_MODE; + r_code = motor_device_initalize(this, data); + break; + } + + + case TerriBullDevices_FunctionCall_motorSetVelocityData_tag: { + motor_set_velocity_callback_data data; + data.port = message.callbackData.motorSetVelocityData.port; + data.velocity = message.callbackData.motorSetVelocityData.velocity; + r_code = motor_device_set_velocity(this, data); + break; + } + + // case TerriBullDevices_FunctionCall_... + + default: + break; + } + + // TODO: CREATE A RETURN MESSAGE BASED ON EACH FUNCTION CALL return true; } \ No newline at end of file diff --git a/src/SerialController.cpp b/src/SerialController.cpp index 68b5b38..fa1d42a 100644 --- a/src/SerialController.cpp +++ b/src/SerialController.cpp @@ -18,7 +18,7 @@ std::string SerialController::input_buffer; pros::Mutex SerialController::input_mutex; -SerialController::SerialController(DeviceManager *_motherSys) : motherSys(_motherSys), tagExchange(false), isCollectingTags(false) +SerialController::SerialController(DeviceManager *_motherSys) : motherSys(_motherSys) { ::pros::c::serctl(SERCTL_DISABLE_COBS, nullptr); pros::Task input_task(SerialController::read_input_task); @@ -26,16 +26,16 @@ SerialController::SerialController(DeviceManager *_motherSys) : motherSys(_mothe void SerialController::ScheduleUpdate(std::string tag_name, float frequency) { - CallbackItem* update = this->FindInternal(tag_name); - if (update != nullptr) { - ScheduledUpdate* scheduledUpdate = new ScheduledUpdate(); - scheduledUpdate->callbackItem = update; - scheduledUpdate->frequency = frequency; - this->ScheduledUpdates.push_back(scheduledUpdate); - } - else { - throw new exception; - } + // CallbackItem* update = this->FindInternal(tag_name); + // if (update != nullptr) { + // ScheduledUpdate* scheduledUpdate = new ScheduledUpdate(); + // scheduledUpdate->callbackItem = update; + // scheduledUpdate->frequency = frequency; + // this->ScheduledUpdates.push_back(scheduledUpdate); + // } + // else { + // throw new exception; + // } } void SerialController::Update(float delta) @@ -92,16 +92,9 @@ bool SerialController::ReadBuffer() void SerialController::SendData(std::string data) { - for (auto c : SerialController::__packet_header) - { - std::cout << c; - } std::cout << data; - for (auto c : SerialController::__end_of_transmission) + for (char c : SerialController::__end_of_transmission) { std::cout << c; } - - // std::cout << (char)0 << (char)0 << (char)10 << (char)10; - // std::cout << SerialController::__end_of_transmission; } \ No newline at end of file diff --git a/src/device.cpp b/src/device.cpp new file mode 100644 index 0000000..729a1b2 --- /dev/null +++ b/src/device.cpp @@ -0,0 +1,39 @@ +#include "../include/TerriBull/Devices/device.hpp" + + +device_callback_return_code motor_device_initialize(DeviceManager* _motherSys, motor_initialize_callback_data data) { + // Dynamically allocate a new MotorDevice instance + MotorDevice* device = new MotorDevice(); + device->header.pros_device_type = pros::c::v5_device_e_t::E_DEVICE_MOTOR; + device->header.port = data.port; + device->gear_set = static_cast(data.GEAR_SET); + device->break_mode = static_cast(data.BREAK_MODE); + + // Initialize the motor using PROS library functions + pros::c::motor_tare_position(device->header.port); + pros::c::motor_set_brake_mode(device->header.port, device->break_mode); + pros::c::motor_set_gearing(device->header.port, device->gear_set); + + // Retrieve and store the actual velocity + device->velocity = pros::c::motor_get_actual_velocity(device->header.port); + + // Add the device to the DeviceManager + _motherSys->add_device(&device->header); // Adjust this to your actual method for adding a device + + return SUCCESS; +} + +device_callback_return_code motor_device_set_velocity(DeviceManager* _motherSys, motor_set_velocity_callback_data data) { + // Retrieve the device using its port + DeviceHeader* deviceHeader = _motherSys->get_device(data.port); + if (deviceHeader == nullptr) return DEVICE_NOT_EXIST; + if (deviceHeader->pros_device_type != pros::c::v5_device_e_t::E_DEVICE_MOTOR) return DEVICE_TYPE_MISMATCH; + + // Cast the DeviceHeader back to MotorDevice to access motor-specific fields + MotorDevice* motorDevice = (MotorDevice*)(void*)deviceHeader; + + // Set the motor's velocity + pros::c::motor_move_velocity(motorDevice->header.port, data.velocity); + + return SUCCESS; +} \ No newline at end of file From a7287598b69560b2b7ca0328674c71412926201b Mon Sep 17 00:00:00 2001 From: Johnnykoch02 Date: Thu, 15 Feb 2024 20:39:39 -0500 Subject: [PATCH 3/4] update readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7585406..962c2a1 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ The TerriBull Device Manager is a comprehensive system designed for managing var ### Creating protobuf Definitions: 1. Ensure `nanopb` is installed in the project. 2. cd into project -3. + ```bash python python nanopb/generator/nanopb_generator.py --out=. ./include/protos/vex.proto ``` @@ -64,7 +64,7 @@ arm-none-eabi-ar rcs firmware/libvex.a obj/vex.pb.o obj/pb_encode.o obj/pb_decod - An error will occur if Run: ```bash -pros build +pros build --verbose ``` ## Usage From 1914b5c4f6d85ede2b79578fac68d6ed13a40755 Mon Sep 17 00:00:00 2001 From: Johnnykoch02 Date: Thu, 15 Feb 2024 20:42:12 -0500 Subject: [PATCH 4/4] update readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 962c2a1..5c91213 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # TerriBull Device Manager ## Overview -The TerriBull Device Manager is a comprehensive system designed for managing various types of robotic devices. It provides a framework for initializing and controlling devices such as motors, IMUs, and other peripherals using a unified interface. This system is built on top of the PROS library for VEX Robotics, leveraging its functionalities for device communication and control. +The TerriBull Device Manager is a comprehensive system designed for managing various types of VEX devices. It provides a framework for initializing and controlling devices such as motors, IMUs, and other peripherals using a unified interface. This system is built on top of the PROS library for VEX Robotics, leveraging its functionalities for device communication and control. More specific documentation related to using the library will be coming soon. ## Features - **Device Support**: Supports a wide range of devices including motors, IMUs, distance sensors, vision sensors, and more. @@ -12,6 +12,7 @@ The TerriBull Device Manager is a comprehensive system designed for managing var ## Requirements - PROS library for VEX Robotics - nanopb +- arm-none-eabi compiler Toolset for Linux or WSL ## Installation/Compilation 1. Ensure the PROS library is installed and properly configured in your development environment.