89 lines
2.0 KiB
C
89 lines
2.0 KiB
C
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <pico/stdlib.h>
|
|
#include "FreeRTOS.h"
|
|
#include <queue.h>
|
|
#include <task.h>
|
|
|
|
#define BUFFER_SIZE 256
|
|
|
|
char NULLCHAR = 0x0;
|
|
QueueHandle_t MESSAGES = NULL;
|
|
bool LIGHT = false;
|
|
|
|
void vReadSerial(void* params) {
|
|
// Setup
|
|
MESSAGES = xQueueCreate(4, BUFFER_SIZE); // Message queue
|
|
unsigned int len = 0; // Buffer ptr
|
|
int ret;
|
|
char ret_char;
|
|
char* buffer = pvPortMalloc(BUFFER_SIZE * sizeof(char));
|
|
|
|
// start loop
|
|
while(true) {
|
|
ret = getchar_timeout_us(0);
|
|
if(ret != PICO_ERROR_TIMEOUT) {
|
|
// If returned char exists, or...
|
|
ret_char = (char)ret;
|
|
if (ret_char & 0xE0) {
|
|
// If char is printable, echo it, copy to buffer, and increment ptr
|
|
printf("%c", ret_char);
|
|
memcpy(buffer+len*sizeof(char), &ret_char, sizeof(char));
|
|
len++;
|
|
} else if (len) {
|
|
// Otw, and if buffer is not empty, check special chars
|
|
switch(ret_char) {
|
|
// Backspace
|
|
// "Delete" char, ie decrement ptr
|
|
case 8:
|
|
len--;
|
|
break;
|
|
// CR, LF
|
|
// Send message to queue with null char and reset ptr
|
|
case 10:
|
|
case 13:
|
|
memcpy(buffer+len*sizeof(char), &NULLCHAR, sizeof(char));
|
|
xQueueSendToBack(MESSAGES, buffer, 50);
|
|
printf("\n");
|
|
len = 0;
|
|
break;
|
|
// Otw do nothing
|
|
default:
|
|
break;
|
|
};
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void vProcessMessages(void* params) {
|
|
// Wait for queue to be intialized
|
|
while(true) {
|
|
if (MESSAGES != NULL) { break; }
|
|
}
|
|
char* command = pvPortMalloc(BUFFER_SIZE * sizeof(char));
|
|
while(MESSAGES != NULL) {
|
|
if (xQueueReceive(MESSAGES, command, 50)) {
|
|
if (strcmp("blink", command)) {
|
|
printf("Recieved message: ");
|
|
printf("%s\n", command);
|
|
} else {
|
|
LIGHT = !LIGHT;
|
|
gpio_put(PICO_DEFAULT_LED_PIN, LIGHT);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
void main() {
|
|
stdio_init_all();
|
|
busy_wait_ms(1000);
|
|
gpio_init(PICO_DEFAULT_LED_PIN);
|
|
gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
|
|
xTaskCreate(vReadSerial, "Read serial", 128, NULL, 1, NULL);
|
|
xTaskCreate(vProcessMessages, "Process messages", 128, NULL, 1, NULL);
|
|
vTaskStartScheduler();
|
|
}
|
|
|