Communicate via independent and buffered UART drivers. Note that this is just an easy way to show buffered UART drivers, not a recommended application. For interaction with a human, the static variables pwOut
and pwIn
will be more effecient. Buffered UART drivers are great for interacting with other machines/microcontrollers/sensors/etc.
cmake_minimum_required(VERSION 3.12)
project(BufferedUART_Demo CXX COGCXX)
create_simple_executable(${PROJECT_NAME}
BufferedUART_Demo.cpp
buffereduarttx.cogcpp
buffereduartrx.cogcpp
)
#pragma once
#define STACK_SIZE 64
typedef struct {
unsigned int stack[STACK_SIZE];
volatile CharQueue *queue;
CharQueue *buffer = *
reinterpret_cast<CharQueue **
>(
PAR);
const UARTTX tx;
while (1) {
while (buffer->is_empty());
const char c = buffer->dequeue();
tx.send(static_cast<uint16_t>(c));
}
}
CharQueue *buffer = *
reinterpret_cast<CharQueue **
>(
PAR);
const UARTRX rx;
while (1) {
const char c = static_cast<char>(rx.receive());
while (buffer->is_full());
buffer->enqueue(c);
}
}
static const size_t BUFFER_SIZE = 256;
static void runScannerDemo (Printer &queuePrinter, Scanner &queueScanner);
static bool isAnswerNo (char const userInput[]);
char transmitBuffer[BUFFER_SIZE];
CharQueue transmitQueue(transmitBuffer, BUFFER_SIZE,
locknew());
transmitMailbox.
queue = &transmitQueue;
extern unsigned int _load_start_buffereduarttx_cog[];
cognew(_load_start_buffereduarttx_cog, &transmitMailbox.queue);
Printer queuePrinter(transmitQueue);
char receiveBuffer[BUFFER_SIZE];
CharQueue receiveQueue(receiveBuffer);
receiveMailbox.queue = &receiveQueue;
extern unsigned int _load_start_buffereduartrx_cog[];
cognew(_load_start_buffereduartrx_cog, &receiveMailbox.queue);
Scanner queueScanner(receiveQueue, &queuePrinter);
runScannerDemo(queuePrinter, queueScanner);
while (1);
}
void runScannerDemo (Printer &queuePrinter, Scanner &queueScanner) {
char userInput[64];
char name[64];
unsigned int age;
queuePrinter << "Hello! I'd like to teach you how to use PropWare to read from the terminal!\n";
do {
queuePrinter << "First, what's your name?\n>>> ";
queueScanner >> name;
queuePrinter << "And how old are you?\n>>> ";
queueScanner >> age;
queuePrinter << "Is your name " << name << " and are you " << age << " years old?\n>>> ";
queueScanner.input_prompt("", "Please enter either 'yes' or 'no' (y/n)\n>>> ", userInput, sizeof(userInput),
} while (isAnswerNo(userInput));
queuePrinter << "Hello, " << name << "!\n";
}
bool isAnswerNo (char const userInput[]) {
return 0 == strcmp("n", userInput) || 0 == strcmp("no", userInput);
}