static const uint8_t msg_queue_len = 5;
static QueueHandle_t msg_queue;
static QueueHandle_t msg_count;
static const int led_pin = 2;
static const char command[] = "delay "; // Note the space!
uint8_t cmd_len = strlen(command);
uint8_t blink_count = 0;
void enterBlinkRate(void * parameter) {
char ch;
char buff[20];
int idx = 0;
char * message;
while (1) {
// read the msg_count queue
if (xQueueReceive(msg_count, (void *)&message, 0) == pdTRUE) {
Serial.println(message);
}
//clear the buffer
int delayTime ;
if (Serial.available() > 0) {
ch = Serial.read();
if (ch == '\n') {
buff[idx] = '\0';
if (memcmp(buff, command, cmd_len) == 0) {
char* tail = buff + cmd_len;
delayTime = atoi(tail);
delayTime = abs(delayTime);
if (xQueueSend(msg_queue, (void *) &delayTime, 10) != pdTRUE) {
Serial.println("Queue full");
}
} else {
Serial.print("Task 1 echos back : ");
Serial.println(buff);
}
idx = 0 ;
} else {
if (idx < 19) {
buff[idx] = ch;
idx++;
}
}
} else {
vTaskDelay(10 / portTICK_PERIOD_MS);
}
}
}
void changeBlinkRate(void * parameters) {
int rate = 500;
while (1) {
int newValue;
if (xQueueReceive(msg_queue, (void *)&newValue, 0) == pdTRUE) {
rate = newValue;
blink_count = 0 ;
}
digitalWrite(led_pin, HIGH);
vTaskDelay(rate / portTICK_PERIOD_MS );
digitalWrite(led_pin, LOW);
vTaskDelay(rate / portTICK_PERIOD_MS);
blink_count ++ ;
if (blink_count = 1000) {
char * message = "I blinked 1000 times" ;
if (xQueueSend(msg_count, (void *) &message, 10) != pdTRUE) {
Serial.println("Queue full");
}
blink_count = 0 ;
}
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
pinMode(led_pin, OUTPUT);
// Wait a moment to start (so we don;t miss Serial output)
vTaskDelay(1000 / portTICK_PERIOD_MS);
Serial.println();
Serial.println("----FreeRTOS QUEUE Challenge ----");
msg_queue = xQueueCreate(msg_queue_len, sizeof(int));
xTaskCreate(enterBlinkRate,
"Enter blink rate",
1024,
NULL,
1,
NULL
);
xTaskCreate(changeBlinkRate,
"Change blink rate",
1024,
NULL,
1,
NULL
);
}
void loop() {
// put your main code here, to run repeatedly:
delay(10); // this speeds up the simulation
}