Commit 3304b4cd authored by Jake Read's avatar Jake Read

nearly port forwarding

parent 9f61f116
......@@ -7,10 +7,13 @@
#include "apaport.h"
void apaport_build(apaport_t *apap, uint8_t portnum, uartport_t *uart, pin_t *stlr, pin_t *stlb){
void apaport_build(apaport_t *apap, uint8_t portnum, uartport_t *uart, uartport_t *uarts, uint8_t numports, pin_t *stlr, pin_t *stlg, pin_t *stlb){
apap->uart = uart;
apap->uarts = uarts;
apap->portnum = portnum;
apap->numports = numports;
apap->stlr = stlr;
apap->stlg = stlg;
apap->stlb = stlb;
}
......@@ -21,17 +24,22 @@ void apaport_reset(apaport_t *apap){
apap->packet_position = 0;
pin_set(apap->stlr);
pin_set(apap->stlg);
pin_set(apap->stlb);
}
void apaport_scan(apaport_t *apap, uint32_t maxpackets){
// scan through for completely received packets
while(apap->packets_ready <= maxpackets && !rb_empty(apap->uart->rbrx)){
while(apap->packets_ready <= maxpackets){
if(rb_empty(apap->uart->rbrx)){
pin_set(apap->stlr);
break;
}
// pull bytes out of buffer and segment into packets
pin_clear(apap->stlb);
delay_ms(15);
pin_set(apap->stlb);
delay_ms(15);
pin_clear(apap->stlg);
delay_ms(1);
pin_set(apap->stlg);
delay_ms(1);
apap->packets[apap->packet_num][apap->packet_position] = rb_get(apap->uart->rbrx);
apap->packet_position ++;
......@@ -49,13 +57,12 @@ void apaport_scan(apaport_t *apap, uint32_t maxpackets){
while(apap->packets_ready > 0){
uint32_t p = (apap->packet_num + APAPORT_NUM_STATIC_PACKETS - apap->packets_ready) % APAPORT_NUM_STATIC_PACKETS;
// handle these!
pin_clear(apap->stlr);
pin_clear(apap->stlg);
delay_ms(150);
pin_set(apap->stlr);
pin_set(apap->stlg);
delay_ms(150);
// now to handle: 1st, a reply for debug of what we received
uart_sendchars_buffered(apap->uart, apap->packets[p], apap->packets[p][0]);//apap->packets[p][0]);
// now to handle: 1st, a reply for debug of what we received
/*
now, handle:
- packet is for us [1]th element is pointer
......@@ -63,7 +70,35 @@ void apaport_scan(apaport_t *apap, uint32_t maxpackets){
- next port, and fire on
- floods
*/
if(apap->packets[p][1] == APA_ADDR_POINTER){
// packet is ours! mark and somehow get to level up?
// application_apa_handler_t takes it?
} else if(apap->packets[p][1] == APA_ADDR_FLOOD){
// packet is flood, increment pointer and flood!
} else {
// increment pointer
for(int i = 2; i < apap->packets[p][0]; i ++){
// loop through bytes to find pointer
if(apap->packets[p][i] == APA_ADDR_POINTER){
apap->packets[p][i-1] = APA_ADDR_POINTER; // increment pointer forwards
apap->packets[p][i] = apap->portnum; // port received on is this one
}
// [1]th element is port to forward on (and check that we have that port)
}
// check that the outgoing port exists on this hardware
// if not, send to topmost
// HERE: mod this so avoid the != APA_ADDR_POINTER (should store and pass before updating, in some cases
// we send to port where [p][1] is flood ... how else u gonna send?
// launches should take place at end of ifs
if(apap->packets[p][1] > APAPORT_NUM_PORTS - 1 && apap->packets[p][1] != APA_ADDR_POINTER){
apap->packets[p][1] = APAPORT_NUM_PORTS - 1;
}
// send on next port
// HERE: finish mod & rename for ports being 0-n not 1-n
uart_sendchars_buffered(&apap->uarts[apap->packets[p][1] - 1], apap->packets[p], apap->packets[p][0]);
}
uart_sendchars_buffered(apap->uart, apap->packets[p], apap->packets[p][0]);//apap->packets[p][0]);
apap->packets_ready --;
}
}
\ No newline at end of file
......@@ -14,6 +14,7 @@
#include "pin.h"
#define APAPORT_NUM_STATIC_PACKETS 4
#define APAPORT_NUM_PORTS 5
#define APAPORT_OUTSIDE_PACKET 0
#define APAPORT_INSIDE_PACKET 1
......@@ -24,10 +25,13 @@
typedef struct{
uartport_t *uart;
uartport_t *uarts;
pin_t *stlr;
pin_t *stlb;
pin_t *stlg;
uint8_t portnum; // which port are we
uint8_t numports; // how many in the array we got
uint32_t packet_num;
uint32_t packet_position;
......@@ -36,7 +40,7 @@ typedef struct{
uint8_t packets[APAPORT_NUM_STATIC_PACKETS][256]; // packets for handling by app
}apaport_t;
void apaport_build(apaport_t *apap, uint8_t portnum, uartport_t *uart, pin_t *stlr, pin_t *stlb);
void apaport_build(apaport_t *apap, uint8_t portnum, uartport_t *uart, uartport_t *uarts, uint8_t numports, pin_t *stlr, pin_t *stlg, pin_t *stlb);
void apaport_reset(apaport_t *apap);
......
......@@ -16,6 +16,7 @@
// status lights
pin_t np1stlr;
pin_t np1stlg;
pin_t np1stlb;
pin_t np2stlr;
pin_t np2stlb;
......@@ -24,6 +25,7 @@ pin_t np3stlb;
pin_t np4stlr;
pin_t np4stlb;
pin_t np5stlr;
pin_t np5stlg;
pin_t np5stlb;
pin_t *lights[] = {&np1stlr, &np1stlb, &np2stlr, &np2stlb, &np3stlr, &np3stlb, &np4stlr, &np4stlb, &np5stlr, &np5stlb};
......
......@@ -78,6 +78,8 @@ void setupinterrupts(void){
void lightsetup(void){
pin_init(&np1stlr, PIOD, PIO_PER_P12);
pin_output(&np1stlr);
pin_init(&np1stlg, PIOA, PIO_PER_P3);
pin_output(&np1stlg);
pin_init(&np1stlb, PIOA, PIO_PER_P2);
pin_output(&np1stlb);
......@@ -98,15 +100,16 @@ void lightsetup(void){
pin_init(&np5stlr, PIOB, PIO_PER_P0);
pin_output(&np5stlr);
pin_init(&np5stlg, PIOA, PIO_PER_P20);
pin_output(&np5stlg);
pin_init(&np5stlb, PIOB, PIO_PER_P1);
pin_output(&np5stlb);
}
void lightstoggle(void){
for(int i = 2; i < 10; i++){
for(int i = 0; i < 10; i++){
pin_toggle(lights[i]);
}
}
void initports(void){
......@@ -114,35 +117,35 @@ void initports(void){
rb_init(&np1rbrx);
rb_init(&np1rbtx);
// UP1 on UART0, RX 9 TX 10 on PIOA
uart_build(&up1, UART0, PIOA, 9, 10, &np1rbrx, &np1rbtx);
uart_build(&up1, UART0, PIOA, 9, 10, &np1rbrx, &np1rbtx, &np1stlr, &np1stlb);
uart_init(&up1, 81, UART_IS_PERIPHERAL_A);
// RBs 2
rb_init(&np2rbrx);
rb_init(&np2rbtx);
// UP2 on UART1, RX 5 TX 4 on PIOA
uart_build(&up2, UART1, PIOA, 5, 4, &np2rbrx, &np2rbtx);
uart_build(&up2, UART1, PIOA, 5, 4, &np2rbrx, &np2rbtx, &np2stlr, &np2stlb);
uart_init(&up2, 81, UART_IS_PERIPHERAL_C); // 81 for FTDI 115200 :|
// RBs 3
rb_init(&np3rbrx);
rb_init(&np3rbtx);
// UP3 on UART2, RX 25 TX 26 on PIOD
uart_build(&up3, UART2, PIOD, 25, 26, &np3rbrx, &np3rbtx);
uart_build(&up3, UART2, PIOD, 25, 26, &np3rbrx, &np3rbtx, &np3stlr, &np3stlb);
uart_init(&up3, 81, UART_IS_PERIPHERAL_C);
// RBs 4
rb_init(&np4rbrx);
rb_init(&np4rbtx);
// UP4 on UART3, RX 28 TX 30 on PIOD
uart_build(&up4, UART3, PIOD, 28, 30, &np4rbrx, &np4rbtx);
uart_build(&up4, UART3, PIOD, 28, 30, &np4rbrx, &np4rbtx, &np4stlr, &np4stlb);
uart_init(&up4, 81, UART_IS_PERIPHERAL_A);
// RBs 5
rb_init(&np5rbrx);
rb_init(&np5rbtx);
// UP5 on UART4, RX 18 TX 19 on PIOD
uart_build(&up5, UART4, PIOD, 18, 19, &np5rbrx, &np5rbtx);
uart_build(&up5, UART4, PIOD, 18, 19, &np5rbrx, &np5rbtx, &np5stlr, &np5stlb);
uart_init(&up5, 81, UART_IS_PERIPHERAL_C);
}
......@@ -154,13 +157,14 @@ int main (void){
lightsetup();
initports();
apaport_build(&apap1, 1, &up1, &np1stlr, &np1stlb);
apaport_build(&apap1, 1, &up1, ups[0], 5, &np1stlr, &np1stlg, &np1stlb);
apaport_reset(&apap1);
while(1){
lightstoggle();
//lightstoggle();
apaport_scan(&apap1, 2);
pin_toggle(&np5stlg);
/*
uint8_t hello[] = {'h', 'e', 'l', 'l', 'o'};
for(int i = 0; i < 5; i ++){
......
......@@ -53,14 +53,11 @@ uint8_t rb_putdata(ringbuffer_t *rb, uint8_t *data, uint8_t size){
return 0;
} else {
*/
uint8_t i = 0;
while(i < size){
// TODO: check if this is interrupt safe?
// should be...
rb_putchar(rb, data[i]);
i ++;
}
return 1;
for(int i = 0; i < size; i ++){
rb_putchar(rb, data[i]);
}
return 1;
//}
}
......
......@@ -7,7 +7,7 @@
#include "uartport.h"
void uart_build(uartport_t *uart, Uart *com, Pio *port, uint32_t pinrx, uint32_t pintx, ringbuffer_t *rbrx, ringbuffer_t *rbtx){
void uart_build(uartport_t *uart, Uart *com, Pio *port, uint32_t pinrx, uint32_t pintx, ringbuffer_t *rbrx, ringbuffer_t *rbtx, pin_t *stlr, pin_t *stlb){
uart->com = com;
uart->port = port;
......@@ -16,6 +16,9 @@ void uart_build(uartport_t *uart, Uart *com, Pio *port, uint32_t pinrx, uint32_t
uart->pintx = pintx;
uart->pintx_bm = 1 << pintx;
uart->stlr = stlr;
uart->stlb = stlb;
uart->rbrx = rbrx;
uart->rbtx = rbtx;
}
......@@ -46,6 +49,9 @@ void uart_init(uartport_t *uart, uint32_t baud, uint32_t abcdsr){
rb_reset(uart->rbrx);
rb_reset(uart->rbtx);
pin_set(uart->stlr);
pin_set(uart->stlb);
}
void uart_sendchar_polled(uartport_t *uart, uint8_t data){
......@@ -73,13 +79,16 @@ void uart_handler(uartport_t *uart){
}
void uart_rxhandler(uartport_t *uart){
pin_clear(uart->stlr); // set with whatever reads it (apa)
rb_putchar(uart->rbrx, uart->com->UART_RHR);
}
void uart_txhandler(uartport_t *uart){
if(!rb_empty(uart->rbtx)){
pin_clear(uart->stlb);
uart->com->UART_THR = rb_get(uart->rbtx); // transmit if non-empty
} else {
pin_set(uart->stlb);
uart->com->UART_IDR = UART_IDR_TXRDY; // or turn this interrupt off
}
}
\ No newline at end of file
......@@ -11,6 +11,7 @@
#include <asf.h>
#include "ringbuffer.h"
#include "pin.h"
#define UART_IS_PERIPHERAL_A 0x00
#define UART_IS_PERIPHERAL_B 0x01
......@@ -26,11 +27,14 @@ typedef struct{
uint32_t pintx;
uint32_t pintx_bm;
pin_t *stlr;
pin_t *stlb;
ringbuffer_t *rbrx;
ringbuffer_t *rbtx;
}uartport_t;
void uart_build(uartport_t *uart, Uart *com, Pio *port, uint32_t pinrx, uint32_t pintx, ringbuffer_t *rbrx, ringbuffer_t *rbtx);
void uart_build(uartport_t *uart, Uart *com, Pio *port, uint32_t pinrx, uint32_t pintx, ringbuffer_t *rbrx, ringbuffer_t *rbtx, pin_t *stlr, pin_t *stlb);
void uart_init(uartport_t *uart, uint32_t baud, uint32_t abcdsr);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment