From 99bb7af3edf99c940eab6d19637500e2754d6436 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Evan=20Rou=C3=A9?= Date: Thu, 13 Sep 2018 17:45:07 +0200 Subject: [PATCH] Update code --- .../HardwareDesign/HardwareDesign.cysch | Bin 244806 -> 248694 bytes .../ViveBeacons.cydsn/USB_commands_manager.c | 87 ++++++++++++---- .../ViveBeacons.cydsn/USB_commands_manager.h | 20 +++- .../ViveBeacons.cydsn/ViveBeacons.cydwr | 35 +++++-- .../ViveBeacons.cydsn/ViveBeacons.cyprj | 33 ++++++ code/ViveBeacons/ViveBeacons.cydsn/main.c | 94 ++++++++++++++---- code/ViveBeacons/ViveBeacons.cydsn/main.h | 1 + 7 files changed, 222 insertions(+), 48 deletions(-) diff --git a/code/ViveBeacons/ViveBeacons.cydsn/HardwareDesign/HardwareDesign.cysch b/code/ViveBeacons/ViveBeacons.cydsn/HardwareDesign/HardwareDesign.cysch index 02a62f74a002044394af14d74d48a1bf19de318d..0217fb74a90c4ebe4d831b75651d177c18af41c3 100644 GIT binary patch literal 248694 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

CaCXv8@;S-}lHHcwCBStg%%htp! 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 SQBH_WnX%n}yh2URLHs`{EAEW| diff --git a/code/ViveBeacons/ViveBeacons.cydsn/USB_commands_manager.c b/code/ViveBeacons/ViveBeacons.cydsn/USB_commands_manager.c index 9b37748..2747277 100644 --- a/code/ViveBeacons/ViveBeacons.cydsn/USB_commands_manager.c +++ b/code/ViveBeacons/ViveBeacons.cydsn/USB_commands_manager.c @@ -11,18 +11,14 @@ */ #include +#include #include "project.h" #include "USB_commands_manager.h" /* --------------------------------------------------------------------------- - This file should be a PSoC version of an Arduino library. It would have - been trans-coded from https://github.com/kroimon/Arduino-SerialCommand - - Unfortunately, because of 2018's project evolution (moving from a main - robot with a lattepanda to the summberbot using a teensy), this library is - not finished. The idea is to copy the already working UART_command_manager - here and replaced UART by USB everywhere in the firmware. + This file is a PSoC version of an Arduino library. It was trans-coded from + https://github.com/kroimon/Arduino-SerialCommand --------------------------------------------------------------------------- */ @@ -35,6 +31,16 @@ USB_commands_manager* USB_commands_manager_create() { USB_commands_manager* usb_commands_manager = (USB_commands_manager*) malloc(1*sizeof(USB_commands_manager)); + usb_commands_manager->callbacks = NULL; + usb_commands_manager->last_token = NULL; + usb_commands_manager->command_count = 0; + + strcpy(usb_commands_manager->delimiter, " "); + + // Clear buffer + usb_commands_manager->buffer[0] = '\0'; + usb_commands_manager->buffer_pos = 0; + return usb_commands_manager; } @@ -42,22 +48,67 @@ void USB_commands_manager_init(USB_commands_manager *usb_commands_manager) { USB_Serial_Start(0, USB_Serial_3V_OPERATION); while(!USB_Serial_GetConfiguration()); USB_Serial_CDC_Init(); +} + +void USB_commands_manager_register_command(USB_commands_manager *usb_commands_manager, const char *command, void (*callback_function)()) { + usb_commands_manager->callbacks = (USB_commands_manager_callback *) realloc(usb_commands_manager->callbacks, (usb_commands_manager->command_count + 1)*sizeof(USB_commands_manager_callback)); + strncpy((usb_commands_manager->callbacks[usb_commands_manager->command_count]).command, command, USB_COMMAND_MANAGER_MAX_COMMAND_LENGTH); + (usb_commands_manager->callbacks[usb_commands_manager->command_count]).callback_function = callback_function; + usb_commands_manager->command_count++; +} + +void USB_commands_manager_check_commands(USB_commands_manager *usb_commands_manager) { + char nb_char = 0; - USB_Serial_PutString("START\n"); - while(USB_Serial_CDCIsReady() == 0u); - CyDelay(1); - - CyDelay(3000); + // If we received some packets from the PC + if(USB_Serial_GetCount() != 0) { + nb_char = USB_Serial_GetCount(); + + if((usb_commands_manager->buffer_pos + nb_char) < USB_COMMAND_MANAGER_MAX_BUFFER_SIZE) { + nb_char = USB_Serial_GetData((uint8 *) (usb_commands_manager->buffer + usb_commands_manager->buffer_pos), nb_char); // Copy the received data into the buffer and update the nb of char read. + usb_commands_manager->buffer_pos += nb_char + 1; + usb_commands_manager->buffer[usb_commands_manager->buffer_pos] = '\0'; + } + } - USB_Serial_PutString("INIT\n"); - while(USB_Serial_CDCIsReady() == 0u); - CyDelay(1); + // Processing the data + for(int i = usb_commands_manager->buffer_pos - nb_char; i < usb_commands_manager->buffer_pos; i++) + { + char character = USB_Serial_GetChar(); + if(character == 0) + return; + + if(character == '\n') { + char *command = strtok_r(usb_commands_manager->buffer, usb_commands_manager->delimiter, &(usb_commands_manager->last_token)); + + if(command != NULL) { + bool matched = false; + + for(int i = 0; i < usb_commands_manager->command_count; i++) { // For each command in registered commands + if (strncmp(command, (usb_commands_manager->callbacks[i]).command, USB_COMMAND_MANAGER_MAX_COMMAND_LENGTH) == 0) { + (*((usb_commands_manager->callbacks[i]).callback_function))(); + matched = true; + break; + } + } + } + + // Clear buffer + usb_commands_manager->buffer[0] = '\0'; + usb_commands_manager->buffer_pos = 0; + } + } } +char* USB_commands_manager_get_next_token(USB_commands_manager *usb_commands_manager) { + return strtok_r(NULL, usb_commands_manager->delimiter, &(usb_commands_manager->last_token)); +} -void USB_commands_manager_send_command(USB_commands_manager *usb_commands_manager, char command[USB_COMMAND_MANAGER_MAX_COMMAND_LENGTH + 1]) { - - +void USB_commands_manager_send_command(USB_commands_manager *usb_commands_manager, char command[USB_COMMAND_MANAGER_MAX_COMMAND_LENGTH + 1], char args[USB_COMMAND_MANAGER_MAX_BUFFER_SIZE - (USB_COMMAND_MANAGER_MAX_COMMAND_LENGTH + 1) + 1]) { + USB_Serial_PutString(command); + USB_Serial_PutString(usb_commands_manager->delimiter); + USB_Serial_PutString(args); + USB_Serial_PutString("\n"); } /* [] END OF FILE */ diff --git a/code/ViveBeacons/ViveBeacons.cydsn/USB_commands_manager.h b/code/ViveBeacons/ViveBeacons.cydsn/USB_commands_manager.h index 22f0d37..c4a96ce 100644 --- a/code/ViveBeacons/ViveBeacons.cydsn/USB_commands_manager.h +++ b/code/ViveBeacons/ViveBeacons.cydsn/USB_commands_manager.h @@ -17,17 +17,31 @@ #define USB_COMMAND_MANAGER_MAX_COMMAND_LENGTH 8 #define USB_COMMAND_MANAGER_MAX_BUFFER_SIZE 8 +// Data structure +typedef struct USB_commands_manager_callback USB_commands_manager_callback; +struct USB_commands_manager_callback { + char command[USB_COMMAND_MANAGER_MAX_COMMAND_LENGTH + 1]; + void (*callback_function)(); +}; + // Attributes typedef struct USB_commands_manager USB_commands_manager; struct USB_commands_manager { - + USB_commands_manager_callback *callbacks; + char buffer[USB_COMMAND_MANAGER_MAX_BUFFER_SIZE]; + int command_count; + int buffer_pos; + char *last_token; + char delimiter[2]; }; // Public methods USB_commands_manager* USB_commands_manager_create(); void USB_commands_manager_init(USB_commands_manager *usb_commands_manager); -void USB_commands_manager_send_command(USB_commands_manager *usb_commands_manager, char command[USB_COMMAND_MANAGER_MAX_COMMAND_LENGTH + 1]); -//void USB_commands_manager_ +void USB_commands_manager_register_command(USB_commands_manager *usb_commands_manager, const char *command, void (*callback_function)()); +void USB_commands_manager_check_commands(USB_commands_manager *usb_commands_manager); +char* USB_commands_manager_get_next_token(USB_commands_manager *usb_commands_manager); +void USB_commands_manager_send_command(USB_commands_manager *usb_commands_manager, char command[USB_COMMAND_MANAGER_MAX_COMMAND_LENGTH + 1], char args[USB_COMMAND_MANAGER_MAX_BUFFER_SIZE - (USB_COMMAND_MANAGER_MAX_COMMAND_LENGTH + 1) + 1]); #endif diff --git a/code/ViveBeacons/ViveBeacons.cydsn/ViveBeacons.cydwr b/code/ViveBeacons/ViveBeacons.cydsn/ViveBeacons.cydwr index 121f2c4..56bfb91 100644 --- a/code/ViveBeacons/ViveBeacons.cydsn/ViveBeacons.cydwr +++ b/code/ViveBeacons/ViveBeacons.cydsn/ViveBeacons.cydwr @@ -363,6 +363,7 @@ + @@ -3545,10 +3546,31 @@ - + + + + + + + + + + + + + + + + + + + + + + @@ -3596,11 +3618,6 @@ - - - - - @@ -3624,6 +3641,12 @@ + + + + + + diff --git a/code/ViveBeacons/ViveBeacons.cydsn/ViveBeacons.cyprj b/code/ViveBeacons/ViveBeacons.cydsn/ViveBeacons.cyprj index 68e301b..ad99e1f 100644 --- a/code/ViveBeacons/ViveBeacons.cydsn/ViveBeacons.cyprj +++ b/code/ViveBeacons/ViveBeacons.cydsn/ViveBeacons.cyprj @@ -3026,6 +3026,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/ViveBeacons/ViveBeacons.cydsn/main.c b/code/ViveBeacons/ViveBeacons.cydsn/main.c index 20d369f..c216508 100644 --- a/code/ViveBeacons/ViveBeacons.cydsn/main.c +++ b/code/ViveBeacons/ViveBeacons.cydsn/main.c @@ -25,8 +25,14 @@ #include "position.h" #include "main.h" +#define USB_UART_jumper jumper_pins_7 + +#define ISCONNECTED(pin) if(CyPins_ReadPin(pin) == 0) +#define ISDISCONNECTED(pin) if(CyPins_ReadPin(pin) == 1) + // Handler "objects" pointers (We are in C ...) UART_commands_manager* uart_commands_manager = NULL; +USB_commands_manager* usb_commands_manager = NULL; VIVE_sensors_data* vive_sensors_data = NULL; VIVE_sensors* vive_sensors = NULL; Position_finder* position_finder = NULL; @@ -35,27 +41,46 @@ int main(void) { // Creating handler objects vive_sensors = VIVE_sensors_create(); position_finder = Position_finder_create(); - uart_commands_manager = UART_commands_manager_create(); + ISCONNECTED(USB_UART_jumper) + usb_commands_manager = USB_commands_manager_create(); + ISDISCONNECTED(USB_UART_jumper) + uart_commands_manager = UART_commands_manager_create(); CyGlobalIntEnable; /* --- Tracker initialization --- */ + ISCONNECTED(USB_UART_jumper) { + // USB init + USB_commands_manager_init(usb_commands_manager); + + // USB register commands + USB_commands_manager_register_command(usb_commands_manager, "SBPOS", callback_set_beacon_position); + USB_commands_manager_register_command(usb_commands_manager, "AYR", callback_are_you_ready); + USB_commands_manager_register_command(usb_commands_manager, "GPOS", callback_send_position); + } - // UART init - UART_commands_manager_init(uart_commands_manager); - - // UART register commands - UART_commands_manager_register_command(uart_commands_manager, "SBPOS", callback_set_beacon_position); - UART_commands_manager_register_command(uart_commands_manager, "AYR", callback_are_you_ready); - UART_commands_manager_register_command(uart_commands_manager, "GPOS", callback_send_position); + ISDISCONNECTED(USB_UART_jumper) { + // UART init + UART_commands_manager_init(uart_commands_manager); + + // UART register commands + UART_commands_manager_register_command(uart_commands_manager, "SBPOS", callback_set_beacon_position); + UART_commands_manager_register_command(uart_commands_manager, "AYR", callback_are_you_ready); + UART_commands_manager_register_command(uart_commands_manager, "GPOS", callback_send_position); + } /* VIVE sensors init : VIVE decoders and TS4231 init (It has to wait for light though). /!\ Because the tracker is waiting for light on every TS4231, the firmware can be stuck there */ VIVE_sensors_init(vive_sensors); - while(beacon_position_initialized == false) // Wait until beacon position is initialized - UART_commands_manager_check_commands(uart_commands_manager); + while(beacon_position_initialized == false) { // Wait until beacon position is initialized + ISCONNECTED(USB_UART_jumper) + USB_commands_manager_check_commands(usb_commands_manager); + + ISDISCONNECTED(USB_UART_jumper) + UART_commands_manager_check_commands(uart_commands_manager); + } // Position finder init Position_finder_init(position_finder, &beacon_position, LED_COORD_HEIGHT, tracker_led_offset); @@ -66,7 +91,11 @@ int main(void) { /* --- Main loop --- */ for(;;) { - UART_commands_manager_check_commands(uart_commands_manager); + ISCONNECTED(USB_UART_jumper) + USB_commands_manager_check_commands(usb_commands_manager); + + ISDISCONNECTED(USB_UART_jumper) + UART_commands_manager_check_commands(uart_commands_manager); if(configured) { if(VIVE_pulses_decoded) { // If configured and new pulse received, go process it ! @@ -93,14 +122,27 @@ int main(void) { reconfigure it. It will be done automatically by the main system. --------------------------------------------------------------------------- */ + void callback_set_beacon_position() { - beacon_position.x = atof(UART_commands_manager_get_next_token(uart_commands_manager)); - beacon_position.y = atof(UART_commands_manager_get_next_token(uart_commands_manager)); - beacon_position.z = atof(UART_commands_manager_get_next_token(uart_commands_manager)); + ISCONNECTED(USB_UART_jumper) { + beacon_position.x = atof(USB_commands_manager_get_next_token(usb_commands_manager)); + beacon_position.y = atof(USB_commands_manager_get_next_token(usb_commands_manager)); + beacon_position.z = atof(USB_commands_manager_get_next_token(usb_commands_manager)); - beacon_position.alpha = atof(UART_commands_manager_get_next_token(uart_commands_manager)); - beacon_position.beta = atof(UART_commands_manager_get_next_token(uart_commands_manager)); - beacon_position.gamma = atof(UART_commands_manager_get_next_token(uart_commands_manager)); + beacon_position.alpha = atof(USB_commands_manager_get_next_token(usb_commands_manager)); + beacon_position.beta = atof(USB_commands_manager_get_next_token(usb_commands_manager)); + beacon_position.gamma = atof(USB_commands_manager_get_next_token(usb_commands_manager)); + } + + ISDISCONNECTED(USB_UART_jumper) { + beacon_position.x = atof(UART_commands_manager_get_next_token(uart_commands_manager)); + beacon_position.y = atof(UART_commands_manager_get_next_token(uart_commands_manager)); + beacon_position.z = atof(UART_commands_manager_get_next_token(uart_commands_manager)); + + beacon_position.alpha = atof(UART_commands_manager_get_next_token(uart_commands_manager)); + beacon_position.beta = atof(UART_commands_manager_get_next_token(uart_commands_manager)); + beacon_position.gamma = atof(UART_commands_manager_get_next_token(uart_commands_manager)); + } beacon_position_initialized = true; } @@ -114,8 +156,13 @@ void callback_set_beacon_position() { */ void callback_are_you_ready() { - if(configured) - UART_commands_manager_send_command(uart_commands_manager, "READY", ""); + if(configured) { + ISCONNECTED(USB_UART_jumper) + USB_commands_manager_send_command(usb_commands_manager, "READY", ""); + + ISDISCONNECTED(USB_UART_jumper) + UART_commands_manager_send_command(uart_commands_manager, "READY", ""); + } } /* @@ -139,7 +186,12 @@ void callback_send_position() { // Serialize sprintf(buffer, "%d %.6f %.6f %.6f", is_valid, x, y, a); - if(configured == true) // Send the position only if the tracker is configured - UART_commands_manager_send_command(uart_commands_manager, "POS", buffer); + if(configured == true) { // Send the position only if the tracker is configured + ISCONNECTED(USB_UART_jumper) + USB_commands_manager_send_command(usb_commands_manager, "POS", buffer); + + ISDISCONNECTED(USB_UART_jumper) + UART_commands_manager_send_command(uart_commands_manager, "POS", buffer); + } } /* [] END OF FILE */ diff --git a/code/ViveBeacons/ViveBeacons.cydsn/main.h b/code/ViveBeacons/ViveBeacons.cydsn/main.h index e8cb1dc..64834d1 100644 --- a/code/ViveBeacons/ViveBeacons.cydsn/main.h +++ b/code/ViveBeacons/ViveBeacons.cydsn/main.h @@ -19,6 +19,7 @@ #include "Position_finder.h" #include "configuration.h" #include "UART_commands_manager.h" +#include "USB_commands_manager.h" /* Position of LEDs in tracker's coordinates (aka relative to its center).