aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Code_Composer/twine_usblib_demo/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Code_Composer/twine_usblib_demo/main.c')
-rw-r--r--Software/Code_Composer/twine_usblib_demo/main.c102
1 files changed, 74 insertions, 28 deletions
diff --git a/Software/Code_Composer/twine_usblib_demo/main.c b/Software/Code_Composer/twine_usblib_demo/main.c
index 84cbf46b7..b2245b705 100644
--- a/Software/Code_Composer/twine_usblib_demo/main.c
+++ b/Software/Code_Composer/twine_usblib_demo/main.c
@@ -30,6 +30,8 @@
#include "MessageContainer.pb-c.h"
#include "CalculateRequest.pb-c.h"
#include "CalculateResponse.pb-c.h"
+#include "ProgressRequest.pb-c.h";
+#include "ProgressResponse.pb-c.h";
//*****************************************************************************
//
@@ -49,6 +51,7 @@ static volatile uint32_t g_ui32SysTickCount = 0;
// Flags used to pass commands from interrupt context to the main loop.
static volatile uint32_t g_ui32Flags;
+MessageContainer createContainer(MessageType type, char* token, protobuf_c_boolean completed, void* response, size_t (*packPtr)(void*, uint8_t*), size_t (*sizePtr)(void*));
//*****************************************************************************
//
@@ -73,18 +76,22 @@ void USB0Handler(void)
void receive_callback(char* buffer, size_t length)
{
- //SendChars(buffer,length);
+ //SendChars(buffer,length);
//draw_string(buffer, length);
//draw_image((uint8_t *)buffer);
- clear();
+ writeLine("Received ");
+ writeFloat(length);
+ writeString(" bytes");
+ writeLine("Parsing message...");
- MessageContainer* container = message_container__unpack(NULL, length, (uint8_t*)buffer);
+ MessageContainer* requestContainer = message_container__unpack(NULL, length, (uint8_t*)buffer);
+ MessageContainer responseContainer;
- if (container->type == MESSAGE_TYPE__CalculateRequest)
+ if (requestContainer->type == MESSAGE_TYPE__CalculateRequest)
{
- CalculateRequest* request = calculate_request__unpack(NULL, container->data.len, container->data.data);
+ CalculateRequest* request = calculate_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data);
writeLine("Calculate Request: ");
writeFloat(request->a);
@@ -95,36 +102,74 @@ void receive_callback(char* buffer, size_t length)
response.sum = request->a + request->b;
response.has_sum = true;
- MessageContainer responseContainer = MESSAGE_CONTAINER__INIT;
- responseContainer.completed = true;
- responseContainer.token = container->token;
- responseContainer.has_completed = true;
- responseContainer.has_data = true;
- responseContainer.has_type = true;
- responseContainer.type = MESSAGE_TYPE__CalculateResponse;
-
- uint8_t* d = malloc(calculate_response__get_packed_size(&response));
- size_t size = calculate_response__pack(&response, d);
- responseContainer.data.data = d;
- responseContainer.data.len = size;
-
- uint8_t* output = malloc(message_container__get_packed_size(&responseContainer));
- size = message_container__pack(&responseContainer, output);
+ responseContainer = createContainer(MESSAGE_TYPE__CalculateResponse, requestContainer->token, true, &response, &calculate_response__pack, &calculate_response__get_packed_size);
writeLine("Sending Response: ");
writeFloat(response.sum);
- SendChars(output, size);
+ free(request);
}
+ else if (requestContainer->type == MESSAGE_TYPE__ProgressRequest)
+ {
+ ProgressRequest* request = progress_request__unpack(NULL, requestContainer->data.len, requestContainer->data.data);
+
+ writeLine("Progress Request...");
+
+ ProgressResponse response = PROGRESS_RESPONSE__INIT;
+ response.has_progress = true;
+
+ int i = 0;
+ for (i = 0; i < request->amount; i++)
+ {
+ response.progress = i;
+ responseContainer = createContainer(MESSAGE_TYPE__ProgressResponse, requestContainer->token, false, &response, &progress_response__pack, &progress_response__get_packed_size);
+ uint8_t* container_buffer = malloc(message_container__get_packed_size(&responseContainer));
+ size_t container_size = message_container__pack(&responseContainer, container_buffer);
+ writeLine("Sending Progress: ");
+ writeFloat(response.progress);
+ SendChars((char*)container_buffer, container_size);
+
+ int co = 0;
+ for (co = 0; co < request->delay; co++)
+ {
+ __delay_cycles(1000000);
+ }
+ }
+
+ responseContainer = createContainer(MESSAGE_TYPE__ProgressResponse, requestContainer->token, true, &response, &progress_response__pack, &progress_response__get_packed_size);
+ uint8_t* container_buffer = malloc(message_container__get_packed_size(&responseContainer));
+ size_t container_size = message_container__pack(&responseContainer, container_buffer);
+ writeLine("Progress Completed!");
+ SendChars((char*)container_buffer, container_size);
+ return;
+ }
+
+ uint8_t* container_buffer = malloc(message_container__get_packed_size(&responseContainer));
+ size_t container_size = message_container__pack(&responseContainer, container_buffer);
+ SendChars((char*)container_buffer, container_size);
+ free(container_buffer);
+ free(requestContainer);
+}
+
+MessageContainer createContainer(MessageType type, char* token, protobuf_c_boolean completed, void* response, size_t (*packPtr)(void*, uint8_t*), size_t (*sizePtr)(void*))
+{
+ MessageContainer container = MESSAGE_CONTAINER__INIT;
+ container.completed = completed;
+ container.token = token;
+ container.has_completed = true;
+ container.has_data = true;
+ container.has_type = true;
+ container.type = type;
+
+
- free(container);
+ uint8_t* response_buffer = malloc((*sizePtr)(response));
+ size_t response_size = (*packPtr)(response, response_buffer);
+ container.data.data = response_buffer;
+ container.data.len = response_size;
-// Person* p = person__unpack (NULL, length, (uint8_t*)buffer);
-// void* buf = malloc (length);
-// person__pack (p, buf);
-// SendChars(buf,length);
-// free(p);
-// free(buf);
+ free(response);
+ return container;
}
int main(void)
@@ -148,6 +193,7 @@ int main(void)
ROM_SysTickEnable();
init_graphics(ui32SysClock);
+ clear();
RegisterReceiveCallback(&receive_callback);
StartUSB(ui32SysClock);