#define FW_STR "1.0 Extender-T"
/*
IO1 - PA4 - OUTPUT
IO2 - PA2 - OUTPUT
IO3 - PA0 - OUTPUT
IO4 - PA7 - OUTPUT
IO5 - PA6 - OUTPUT
IO6 - PA3 - INPUT
IO7 - PA1 - INPUT
IO8 - PA13 - INPUT
IO9 - PB1 - INPUT
IO10 - BOOT
IOx - PA5 - INPUT PULLED DONW R10K
LED - PF0
*/
var GPIO_OUT = [PA4.VALUE, PA2.VALUE, PA0.VALUE, PA7.VALUE, PA6.VALUE];
var GPIO_IN = [PA3.VALUE, PA1.VALUE, PA13.VALUE, PB1.VALUE, PB1.VALUE];
var io_setup() {
// OUTPUTS
PA4.MODE = GPIO_MODE_OUTPUT|GPIO_INIT_LOW|GPIO_OTYPE_PP;
PA2.MODE = GPIO_MODE_OUTPUT|GPIO_INIT_LOW|GPIO_OTYPE_PP;
PA0.MODE = GPIO_MODE_OUTPUT|GPIO_INIT_LOW|GPIO_OTYPE_PP;
PA7.MODE = GPIO_MODE_OUTPUT|GPIO_INIT_LOW|GPIO_OTYPE_PP;
PA6.MODE = GPIO_MODE_OUTPUT|GPIO_INIT_LOW|GPIO_OTYPE_PP;
// INPUTS
PA3.MODE = GPIO_MODE_INPUT | GPIO_PULL_UP;
PA1.MODE = GPIO_MODE_INPUT | GPIO_PULL_UP;
PA13.MODE = GPIO_MODE_INPUT | GPIO_PULL_UP;
PB1.MODE = GPIO_MODE_INPUT | GPIO_PULL_UP;
PA5.MODE = GPIO_MODE_INPUT | GPIO_PULL_DOWN; // unused
// LED - PF0
PF0.MODE = GPIO_MODE_OUTPUT|GPIO_INIT_HIGH|GPIO_OTYPE_PP;
// UART
UART0.CFG = UART_MODE_PLAIN | UART_CONFIG_START;
__enable_irq();
}
var _msg() {
if(MSG.PORT == 4) {
memcpy(&RING.BUF, &MSG.RX, MSG.SIZE);
}
}
var main() {
var c;
var pstate;
var p_index;
var p;
io_setup();
if((RING.ALLOC = 16) != 16) {
return 1;
}
SYS.WDG = 1;
while(1){
if(RING.QUEUE > 0) {
c = RING.PULL;
if (c == '~') {
pstate = 1;
p_index = 0;
} else if (pstate == 1) {
pstate = 0;
switch (c) {
case 'I':
sprintf(&UART0.TX, "~I%s\n", FW_STR);
pstate = 0;
break;
case 'B':
SYS.RESET = 1;
break;
case 'A':
sprintf(&UART0.TX, "~A%d%d%d%d%d\n", *GPIO_IN[0], *GPIO_IN[1], *GPIO_IN[2], *GPIO_IN[3], *GPIO_IN[4]);
pstate = 0;
break;
case 'S':
case 'R':
case 'G':
case 'P':
pstate = c;
break;
default:
break;
}
} else if (pstate) {
p = c - '0';
if (pstate == 'S' || pstate == 'R') { // ~S or ~R
if (p > 0 && p < 6) {
GPIO_OUT[p - 1] = (pstate == 'S');
sprintf(&UART0.TX, "~%c%d\n", pstate, p);
} else {
sprintf(&UART0.TX, "Err\n");
}
pstate = 0;
} else if (pstate == 'G') { // ~G
if (p > 0 && p < 6) {
sprintf(&UART0.TX, "~G%d\n", *GPIO_IN[p - 1]);
} else {
sprintf(&UART0.TX, "Err\n");
}
pstate = 0;
} else if (pstate == 'P') { // ~P
GPIO_OUT[p_index++] = (c == '1');
if (p_index == 5) {
sprintf(&UART0.TX, "~P%d%d%d%d%d\n", *GPIO_OUT[0], *GPIO_OUT[1], *GPIO_OUT[2], *GPIO_OUT[3], *GPIO_OUT[4]);
pstate = 0;
}
}
}
} else {
delay(10);
}
SYS.WDG = 42;
}
return 0;
}
#define FW_STR "2.1 02 Aug 2021"
/*
IO1 - PA4 - ADC
IO2 - PA2 - OUTPUT
IO3 - PA0 - SPI CS
IO4 - PA7 - SPI MOSI
IO5 - PA6 - SPI MISO
IO6 - PA3 - INPUT
IO7 - PA1 - PWM OUTPUT
IO8 - NC
IO9 - PB1 - PWM INPUT
IOx - PA5 - SPI SCK
LED - PF0
*/
var _msg() {
var c = stoi(&MSG.RX, 'c');
memcpy(SYS.RAM, &MSG.RX, MSG.SIZE);
switch (c) {
case 'S':
PA2.VALUE = 1;
break;
case 'R':
PA2.VALUE = 0;
break;
case 'A':
sprintf(&UART0.TX, "A%d\n", PA4.VALUE);
break;
case 'K':
PA0.VALUE = 0;
memcpy(&SPI.DR, SYS.RAM+1, MSG.SIZE-1);
sprintf(&UART0.TX, "K%d\n", SYS.RAM+1);
PA0.VALUE = 1;
break;
case 'G':
sprintf(&UART0.TX, "G%d\n", PA3.VALUE);
break;
case 'F':
sprintf(&UART0.TX, "F%d\n", PB1.VALUE);
break;
case 'I':
sprintf(&UART0.TX, "I%s\n", FW_STR);
break;
default:
break;
}
}
var io_setup() {
// IO1 - PA4 - ADC
PA4.MODE = GPIO_MODE_ADC;
// IO2 - PA2 - OUTPUT
PA2.MODE = GPIO_MODE_OUTPUT|GPIO_INIT_LOW|GPIO_OTYPE_PP;
// IO6 - PA3 - INPUT
PA3.MODE = GPIO_MODE_INPUT | GPIO_PULL_DOWN;
// IO7 - PA1 - PWM OUTPUT
PA1.MODE = GPIO_MODE_OPWM|GPIO_INIT_LOW|GPIO_OTYPE_PP;
// IO9 - PB1 - PWM INPUT
PB1.MODE = GPIO_MEASURE_FREQ|GPIO_MODE_IPWM|GPIO_INIT_LOW;
// LED - PF0
PF0.MODE = GPIO_MODE_OUTPUT|GPIO_INIT_HIGH|GPIO_OTYPE_PP;
// IO3 - PA0 - SPI CS
// IO5 - PA7 - SPI MOSI
// IO5 - PA6 - SPI MISO
// IOx - PA5 - SPI SCK
PA0.MODE = GPIO_INIT_LOW|GPIO_OTYPE_PP|GPIO_TYPE_SOFTWARE|GPIO_MODE_OUTPUT;
SPI.SETUP = SPI_SETUP_POLARITY_LOW|SPI_SETUP_EDGE_LEADING|1000/*kBod*/;
SPI.EN = 1;
PA1.PWM = 128;
TIM2.FREQ = TIM3.FREQ = 2;
TIM2.EN = TIM3.EN = 1;
UART0.CFG = UART_MODE_PLAIN | UART_CONFIG_START;
__enable_irq();
}
var main() {
io_setup();
while (1) {};
return 0;
}