Skip to content
Snippets Groups Projects
Commit 3304b4cd authored by Jake Read's avatar Jake Read
Browse files

nearly port forwarding

parent 9f61f116
No related branches found
No related tags found
No related merge requests found
......@@ -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, 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,13 +53,10 @@ 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...
for(int i = 0; i < size; i ++){
rb_putchar(rb, data[i]);
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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment