|
11 | 11 | */ |
12 | 12 |
|
13 | 13 | #include <stdlib.h> |
| 14 | +#include <stdbool.h> |
14 | 15 | #include "project.h" |
15 | 16 | #include "USB_commands_manager.h" |
16 | 17 |
|
17 | 18 | /* |
18 | 19 | --------------------------------------------------------------------------- |
19 | | - This file should be a PSoC version of an Arduino library. It would have |
20 | | - been trans-coded from https://github.com/kroimon/Arduino-SerialCommand |
21 | | - |
22 | | - Unfortunately, because of 2018's project evolution (moving from a main |
23 | | - robot with a lattepanda to the summberbot using a teensy), this library is |
24 | | - not finished. The idea is to copy the already working UART_command_manager |
25 | | - here and replaced UART by USB everywhere in the firmware. |
| 20 | + This file is a PSoC version of an Arduino library. It was trans-coded from |
| 21 | + https://github.com/kroimon/Arduino-SerialCommand |
26 | 22 | --------------------------------------------------------------------------- |
27 | 23 | */ |
28 | 24 |
|
|
35 | 31 | USB_commands_manager* USB_commands_manager_create() { |
36 | 32 | USB_commands_manager* usb_commands_manager = (USB_commands_manager*) malloc(1*sizeof(USB_commands_manager)); |
37 | 33 |
|
| 34 | + usb_commands_manager->callbacks = NULL; |
| 35 | + usb_commands_manager->last_token = NULL; |
| 36 | + usb_commands_manager->command_count = 0; |
| 37 | + |
| 38 | + strcpy(usb_commands_manager->delimiter, " "); |
| 39 | + |
| 40 | + // Clear buffer |
| 41 | + usb_commands_manager->buffer[0] = '\0'; |
| 42 | + usb_commands_manager->buffer_pos = 0; |
| 43 | + |
38 | 44 | return usb_commands_manager; |
39 | 45 | } |
40 | 46 |
|
41 | 47 | void USB_commands_manager_init(USB_commands_manager *usb_commands_manager) { |
42 | 48 | USB_Serial_Start(0, USB_Serial_3V_OPERATION); |
43 | 49 | while(!USB_Serial_GetConfiguration()); |
44 | 50 | USB_Serial_CDC_Init(); |
| 51 | +} |
| 52 | + |
| 53 | +void USB_commands_manager_register_command(USB_commands_manager *usb_commands_manager, const char *command, void (*callback_function)()) { |
| 54 | + usb_commands_manager->callbacks = (USB_commands_manager_callback *) realloc(usb_commands_manager->callbacks, (usb_commands_manager->command_count + 1)*sizeof(USB_commands_manager_callback)); |
| 55 | + strncpy((usb_commands_manager->callbacks[usb_commands_manager->command_count]).command, command, USB_COMMAND_MANAGER_MAX_COMMAND_LENGTH); |
| 56 | + (usb_commands_manager->callbacks[usb_commands_manager->command_count]).callback_function = callback_function; |
| 57 | + usb_commands_manager->command_count++; |
| 58 | +} |
| 59 | + |
| 60 | +void USB_commands_manager_check_commands(USB_commands_manager *usb_commands_manager) { |
| 61 | + char nb_char = 0; |
45 | 62 |
|
46 | | - USB_Serial_PutString("START\n"); |
47 | | - while(USB_Serial_CDCIsReady() == 0u); |
48 | | - CyDelay(1); |
49 | | - |
50 | | - CyDelay(3000); |
| 63 | + // If we received some packets from the PC |
| 64 | + if(USB_Serial_GetCount() != 0) { |
| 65 | + nb_char = USB_Serial_GetCount(); |
| 66 | + |
| 67 | + if((usb_commands_manager->buffer_pos + nb_char) < USB_COMMAND_MANAGER_MAX_BUFFER_SIZE) { |
| 68 | + 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. |
| 69 | + usb_commands_manager->buffer_pos += nb_char + 1; |
| 70 | + usb_commands_manager->buffer[usb_commands_manager->buffer_pos] = '\0'; |
| 71 | + } |
| 72 | + } |
51 | 73 |
|
52 | | - USB_Serial_PutString("INIT\n"); |
53 | | - while(USB_Serial_CDCIsReady() == 0u); |
54 | | - CyDelay(1); |
| 74 | + // Processing the data |
| 75 | + for(int i = usb_commands_manager->buffer_pos - nb_char; i < usb_commands_manager->buffer_pos; i++) |
| 76 | + { |
| 77 | + char character = USB_Serial_GetChar(); |
| 78 | + if(character == 0) |
| 79 | + return; |
| 80 | + |
| 81 | + if(character == '\n') { |
| 82 | + char *command = strtok_r(usb_commands_manager->buffer, usb_commands_manager->delimiter, &(usb_commands_manager->last_token)); |
| 83 | + |
| 84 | + if(command != NULL) { |
| 85 | + bool matched = false; |
| 86 | + |
| 87 | + for(int i = 0; i < usb_commands_manager->command_count; i++) { // For each command in registered commands |
| 88 | + if (strncmp(command, (usb_commands_manager->callbacks[i]).command, USB_COMMAND_MANAGER_MAX_COMMAND_LENGTH) == 0) { |
| 89 | + (*((usb_commands_manager->callbacks[i]).callback_function))(); |
| 90 | + matched = true; |
| 91 | + break; |
| 92 | + } |
| 93 | + } |
| 94 | + } |
| 95 | + |
| 96 | + // Clear buffer |
| 97 | + usb_commands_manager->buffer[0] = '\0'; |
| 98 | + usb_commands_manager->buffer_pos = 0; |
| 99 | + } |
| 100 | + } |
55 | 101 | } |
56 | 102 |
|
| 103 | +char* USB_commands_manager_get_next_token(USB_commands_manager *usb_commands_manager) { |
| 104 | + return strtok_r(NULL, usb_commands_manager->delimiter, &(usb_commands_manager->last_token)); |
| 105 | +} |
57 | 106 |
|
58 | | -void USB_commands_manager_send_command(USB_commands_manager *usb_commands_manager, char command[USB_COMMAND_MANAGER_MAX_COMMAND_LENGTH + 1]) { |
59 | | - |
60 | | - |
| 107 | +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]) { |
| 108 | + USB_Serial_PutString(command); |
| 109 | + USB_Serial_PutString(usb_commands_manager->delimiter); |
| 110 | + USB_Serial_PutString(args); |
| 111 | + USB_Serial_PutString("\n"); |
61 | 112 | } |
62 | 113 |
|
63 | 114 | /* [] END OF FILE */ |
0 commit comments