From db68f1c05797ccf1dd5722f3e4f6266a988472b8 Mon Sep 17 00:00:00 2001
From: Jake <jake.read@cba.mit.edu>
Date: Fri, 18 May 2018 19:14:29 -0400
Subject: [PATCH] add apaports, all functioning

---
 .../mkrouter-v06/.vs/mkrouter-v06/v14/.atsuo  | Bin 22016 -> 22016 bytes
 .../mkrouter-v06/mkrouter-v06/Debug/Makefile  |  14 ++
 .../mkrouter-v06/Debug/makedep.mk             |   4 +
 .../mkrouter-v06/mkrouter-v06/apahandler.c    |  88 +++++++++++++
 .../mkrouter-v06/mkrouter-v06/apahandler.h    |  24 ++++
 embedded/mkrouter-v06/mkrouter-v06/apaport.c  | 123 ++++++++++++++++++
 embedded/mkrouter-v06/mkrouter-v06/apaport.h  |  50 +++++++
 embedded/mkrouter-v06/mkrouter-v06/hardware.h |  19 ++-
 embedded/mkrouter-v06/mkrouter-v06/main.c     |  46 ++++++-
 .../mkrouter-v06/mkrouter-v06.cproj           |  12 ++
 embedded/mkrouter-v06/mkrouter-v06/uartport.c |  11 +-
 embedded/mkrouter-v06/mkrouter-v06/uartport.h |   2 +-
 12 files changed, 382 insertions(+), 11 deletions(-)
 create mode 100644 embedded/mkrouter-v06/mkrouter-v06/apahandler.c
 create mode 100644 embedded/mkrouter-v06/mkrouter-v06/apahandler.h
 create mode 100644 embedded/mkrouter-v06/mkrouter-v06/apaport.c
 create mode 100644 embedded/mkrouter-v06/mkrouter-v06/apaport.h

diff --git a/embedded/mkrouter-v06/.vs/mkrouter-v06/v14/.atsuo b/embedded/mkrouter-v06/.vs/mkrouter-v06/v14/.atsuo
index 52b8e4141e14ce26e14977a42cb45c34b49fc6a6..9b391be6e8abd8e75ad0de9023f8a214455cb1e2 100644
GIT binary patch
delta 755
zcmZoz!`QHfaYGIhU&HF(7yi7v%qYviz~CT1xr(WZv1amDrt>^X3=9lx3=9na|Ns9#
zIgnpv@)u?U2|fk}hJXM6{}+eSAT}=p1H;5Xh0QT60!*w8;@{5w*<8rf&$x->4D;qQ
z;%k^0Z%q#5_uhPj|1T3G<KzJQfcgN2M22LBY=&Zn7=}cK5{6ucRE8Xe7=~a5M+RR8
z7Y0)XLxy+;7X~+m0EQR_Lk2wt0|q??a|Q#37=}!SJceY39EMVc6oyoW7=~hoM21|3
z6tJEw215o5hC~KEh75+;b52j*^8dE!wHuM?n|ACHW`KI-|Ns9JBlssTkWJVma)+6>
zf`Ngdl7WGtih+Tlda^Ey_$G<NOp_1u*-nyn=4Di5U|>*&Y6OJ=YcT@@!>!4ceCmuQ
zlNa&@*OxOeFfcKK%w_<)D3c+dA%?*m?BW=P5{7(+e1;r`WQGieM6k<2{w-q21^XLB
z>oTM><S~>o=;BeU%aF&A&ydHE%Am`T%8<yA#E=OK2Y;l1$OQ*#2G|-<z@#$dF{ChL
zG9)tOfdgb;2-h>dvY6M5x6bOk$ny^YIT{qV$au29f}Ow?3C8r_ld|@v7CfC5wPQ;1
zWC7U^lY|ZqqPP=Qki5f~%wWY3!%)Cb#E{RB&QJtS1_}&mlP}tf^CKs!Vuq5<|K%CY
E0KUTCeE<Le

delta 203
zcmZoz!`QHfaYGIhtHTT97rQnWvh_1gVo?#~Wnf_V_y7NYaVY(7Vxaow7#0C0z6U)9
zFLu4V%qYviz`!6oxr(WZv3T-VrgOZEiVO@4Yzzzx|NsC0KlviR%H}WZH<%g!O$;>N
z#N*63`7o2=<`T&s#>o+yE|Xm>_ibhp*v~Zips?}eFGl{n41x>{3?SQJx+fn{WSLxH
x+_6dI4)f+a+;f;2A50F^^qzc#-)54~0mfC69W~}pPLN%&$>9L=<^zfjCID*qPQ(BJ

diff --git a/embedded/mkrouter-v06/mkrouter-v06/Debug/Makefile b/embedded/mkrouter-v06/mkrouter-v06/Debug/Makefile
index fdc3c74..a75817b 100644
--- a/embedded/mkrouter-v06/mkrouter-v06/Debug/Makefile
+++ b/embedded/mkrouter-v06/mkrouter-v06/Debug/Makefile
@@ -38,6 +38,8 @@ SUBDIRS :=  \
 
 # Add inputs and outputs from these tool invocations to the build variables 
 C_SRCS +=  \
+../apahandler.c \
+../apaport.c \
 ../board_driver_serial.c \
 ../board_driver_usb.c \
 ../clock_init.c \
@@ -60,6 +62,8 @@ ASM_SRCS +=
 
 
 OBJS +=  \
+apahandler.o \
+apaport.o \
 board_driver_serial.o \
 board_driver_usb.o \
 clock_init.o \
@@ -75,6 +79,8 @@ sam_ba_usb.o \
 uartport.o
 
 OBJS_AS_ARGS +=  \
+apahandler.o \
+apaport.o \
 board_driver_serial.o \
 board_driver_usb.o \
 clock_init.o \
@@ -90,6 +96,8 @@ sam_ba_usb.o \
 uartport.o
 
 C_DEPS +=  \
+apahandler.d \
+apaport.d \
 board_driver_serial.d \
 board_driver_usb.d \
 clock_init.d \
@@ -105,6 +113,8 @@ sam_ba_usb.d \
 uartport.d
 
 C_DEPS_AS_ARGS +=  \
+apahandler.d \
+apaport.d \
 board_driver_serial.d \
 board_driver_usb.d \
 clock_init.d \
@@ -157,6 +167,10 @@ LINKER_SCRIPT_DEP+=  \
 
 
 
+
+
+
+
 
 
 
diff --git a/embedded/mkrouter-v06/mkrouter-v06/Debug/makedep.mk b/embedded/mkrouter-v06/mkrouter-v06/Debug/makedep.mk
index d406fca..3d40a92 100644
--- a/embedded/mkrouter-v06/mkrouter-v06/Debug/makedep.mk
+++ b/embedded/mkrouter-v06/mkrouter-v06/Debug/makedep.mk
@@ -2,6 +2,10 @@
 # Automatically-generated file. Do not edit or delete the file
 ################################################################################
 
+apahandler.c
+
+apaport.c
+
 board_driver_serial.c
 
 board_driver_usb.c
diff --git a/embedded/mkrouter-v06/mkrouter-v06/apahandler.c b/embedded/mkrouter-v06/mkrouter-v06/apahandler.c
new file mode 100644
index 0000000..b30b07d
--- /dev/null
+++ b/embedded/mkrouter-v06/mkrouter-v06/apahandler.c
@@ -0,0 +1,88 @@
+/*
+ * apahandler.c
+ *
+ * Created: 3/12/2018 11:55:30 AM
+ *  Author: Jake
+ */ 
+
+#include "hardware.h"
+#include "apahandler.h"
+
+void apa_handle_packet(uint8_t *packet, uint8_t length){
+	// dirty debug reply
+	
+	// through packet
+	int i = 0;
+	int apa_handler_state = APA_HANDLER_OUTSIDE;
+	
+	while(i < length){ // prep for the messy double switch :|
+		switch (apa_handler_state){
+			case APA_HANDLER_OUTSIDE:
+				if (packet[i] == APA_END_ROUTE_DELIMITER){
+					apa_handler_state = APA_HANDLER_INSIDE;
+				} else {
+					//
+				}
+				i ++;
+				break;
+				
+			case APA_HANDLER_INSIDE:
+				switch (packet[i]){
+					
+					case DELIM_KEY_TEST:
+						apa_return_packet(packet, length);
+						pin_toggle(&stlErr);
+						i ++;
+						break;
+																
+					default:
+						// probably an error
+						i ++;
+						break;
+				} // end interior switch
+				break;
+				
+			default: 
+				// throw err
+				break;
+		} // end y/n switch
+	}
+}
+
+
+void apa_return_packet(uint8_t *packet, uint8_t length){
+	//uart_sendchar_buffered(ups[1], 120);
+	//uart_sendchars_buffered(ups[1], packet, length);
+	uint8_t ackpack[length];
+	ackpack[0] = length;
+	// find route header
+	int i = 2;
+	int stop = 0;
+	while(i < length){
+		if(packet[i] == APA_END_ROUTE_DELIMITER){
+			stop = i;
+			break;
+		}
+		i ++;
+	}
+	// do the business
+	if(!stop){
+		// error if stop == 0
+		} else {
+		// reverse the address header
+		for(int a = stop - 1, b = 1; a >= 1; a--, b++){
+			ackpack[b] = packet[a];
+		}
+		// fill the rest with same packet data
+		ackpack[stop] = APA_END_ROUTE_DELIMITER;
+		for(int u = stop; u < length; u ++){
+			ackpack[u] = packet[u];
+		}
+		uart_sendchars_buffered(ups[ackpack[1]], ackpack, length);
+		// NOW:
+		// looking for justice: why no return packet on double length hop?
+		// debug with 2nd ftdi
+		//uart_sendchar_buffered(ups[1], 121);
+		//uart_sendchars_buffered(ups[1], ackpack, length);
+	}
+}
\ No newline at end of file
diff --git a/embedded/mkrouter-v06/mkrouter-v06/apahandler.h b/embedded/mkrouter-v06/mkrouter-v06/apahandler.h
new file mode 100644
index 0000000..32c7104
--- /dev/null
+++ b/embedded/mkrouter-v06/mkrouter-v06/apahandler.h
@@ -0,0 +1,24 @@
+/*
+ * apahandler.h
+ *
+ * Created: 3/12/2018 11:55:40 AM
+ *  Author: Jake
+ */ 
+
+
+#ifndef APAHANDLER_H_
+#define APAHANDLER_H_
+
+#include "sam.h"
+
+#define APA_HANDLER_OUTSIDE 0
+#define APA_HANDLER_INSIDE 1
+
+#define DELIM_KEY_TEST 127 // toggles a light, to test network
+#define DELIM_KEY_STEPS 128 // steps (steps) uint32_t, speed (steps/s) uint32_t, dir uint8_t
+#define DELIM_KEY_BLOCK 129 // is 32 bit int
+
+void apa_handle_packet(uint8_t *packet, uint8_t length);
+void apa_return_packet(uint8_t *packet, uint8_t length);
+
+#endif /* APAHANDLER_H_ */
\ No newline at end of file
diff --git a/embedded/mkrouter-v06/mkrouter-v06/apaport.c b/embedded/mkrouter-v06/mkrouter-v06/apaport.c
new file mode 100644
index 0000000..12ea601
--- /dev/null
+++ b/embedded/mkrouter-v06/mkrouter-v06/apaport.c
@@ -0,0 +1,123 @@
+/*
+ * apaport.c
+ *
+ * Created: 2/23/2018 9:17:48 AM
+ *  Author: Jake
+ */ 
+
+#include "apaport.h"
+#include "hardware.h"
+
+apaport_t apaport_new(uint8_t portnum, uartport_t *uart, pin_t *stlr, pin_t *stlb){
+	apaport_t apap;
+	
+	apap.uart = uart;
+	apap.portnum = portnum;
+	apap.stlr = stlr; // dangerous because stlr is def'nd in hardware.h as well - watch your namespaces
+	apap.stlb = stlb;
+	
+	return apap;
+}
+
+void apaport_reset(apaport_t *apap){
+	apap->packet_num = 0;
+	apap->packets_ready = 0;
+	apap->packet_state = APAPORT_OUTSIDE_PACKET;
+	apap->packet_position = 0;
+	
+	pin_set(apap->stlr);
+	pin_set(apap->stlb);
+}
+
+void apaport_scan(apaport_t *apap, uint32_t maxpackets){
+	// scan through for completely received packets
+	while(apap->packets_ready <= maxpackets){
+		// check that we have bytes to read out of the buffer
+		if(rb_empty(apap->uart->rbrx)){
+			pin_set(apap->stlb);
+			break;
+		}
+		// pull bytes out of buffer into the packet structure
+		apap->packets[apap->packet_num][apap->packet_position] = rb_get(apap->uart->rbrx);
+		apap->packet_position ++;
+		// now segment, point to them
+		if(apap->packet_position >= apap->packets[apap->packet_num][0]){
+			// length is 1st byte, like array[n] not array[n-1]
+			// now volley for next pass
+			// packet_num is index of head of packet buffer (just an array)
+			apap->packet_num = (apap->packet_num + 1) % APAPORT_NUM_STATIC_PACKETS; // inc. and loop
+			// packets_ready is the number of ready-state packets in that buffer (array)
+			apap->packets_ready ++;
+			// the position, in bytes, where we are currently operating.
+			// at this point, we have come to the end, so we're resetting counter for the next
+			apap->packet_position = 0;
+		}
+	} 
+	// end 1st scan for packets, now we know we have apaport->packet_num packets completely received
+	// now we handle those packets	
+	while(apap->packets_ready > 0){
+		// the particular packet index
+		uint32_t p = (apap->packet_num + APAPORT_NUM_STATIC_PACKETS - apap->packets_ready) % APAPORT_NUM_STATIC_PACKETS;
+		// first we shift the old pointer out (p[1] is, at the moment, the port the last node tx'd on)
+		apapacket_shift_pointer(apap->packets[p], apap->portnum);
+		// now p[1] is next port
+		// now to handle
+		// [p][0] is length of packet
+		if(apap->packets[p][1] == APA_ROUTE_POINTER){
+			apa_handle_packet(apap->packets[p], apap->packets[p][0]);
+		} else if(apap->packets[p][1] == APA_ROUTE_FLOOD){
+			// loop through bytes to find pointer and increment
+			// now ship it out on all ports
+			for(int i = 0; i < APAPORT_NUM_PORTS; i ++){
+				if(i == apap->portnum){
+					// don't flood back
+				} else {
+					uart_sendchars_buffered(ups[i], apap->packets[p], apap->packets[p][0]);
+				}
+			}
+		} else {
+			// packet is for a particular port,
+			if(apap->packets[p][1] > APAPORT_NUM_PORTS){
+				// port does not exist, throw error
+				// pin_clear(&stlr);
+			} else {
+				uart_sendchars_buffered(ups[apap->packets[p][1]], apap->packets[p], apap->packets[p][0]);
+			}
+		}
+		// debug reply (at the moment, reply is handled in apa_handle_packet
+		// uart_sendchars_buffered(apap->uart, apap->packets[p], apap->packets[p][0]);
+		apap->packets_ready --;
+	}
+}
+
+void apapacket_shift_pointer(uint8_t *packet, uint8_t portnum){
+	int i = 2;
+	while(i < packet[0]){ // while less than length
+		if(packet[i] == APA_END_ROUTE_DELIMITER){
+			// put our port in tail
+			packet[i-1] = portnum;
+			break;
+		} else {
+			// shift 'em down
+			packet[i-1] = packet[i];
+		}
+		i ++;
+	}
+}
+
+void apaport_send_packet(uint8_t *address, uint8_t address_length, uint8_t *payload, uint8_t payloadlength){
+	// 1st byte is port out
+	// not yet implemented, using apa_return_packet ... all of these could be cleaner
+}
+
+// UNIT TESTS:
+/*
+ flood packets
+ multiple receptions? handle in app?
+ packets no end addr bar delimiter, packets no pointer, general white noise
+ packets varying length
+ packets wrong length ? very hard to catch w/o hella state ... timeout?
+	packets no end addr delimiter?
+ packets to ports not existing
+ // next: write javascript terminal packet builder for unit tests!
+*/
\ No newline at end of file
diff --git a/embedded/mkrouter-v06/mkrouter-v06/apaport.h b/embedded/mkrouter-v06/mkrouter-v06/apaport.h
new file mode 100644
index 0000000..60651f0
--- /dev/null
+++ b/embedded/mkrouter-v06/mkrouter-v06/apaport.h
@@ -0,0 +1,50 @@
+/*
+ * apaport.h
+ *
+ * Created: 2/23/2018 9:17:34 AM
+ *  Author: Jake
+ */ 
+
+
+#ifndef APAPORT_H_
+#define APAPORT_H_
+
+#include "apahandler.h"
+#include "uartport.h"
+#include "pin.h"
+
+#define APAPORT_NUM_STATIC_PACKETS 3
+#define APAPORT_NUM_PORTS 6
+
+#define APAPORT_OUTSIDE_PACKET 0
+#define APAPORT_INSIDE_PACKET 1
+
+#define APA_END_ROUTE_DELIMITER 255
+#define APA_ROUTE_POINTER 254
+#define APA_ROUTE_FLOOD 253
+
+typedef struct{
+	uartport_t *uart;
+	pin_t *stlr;
+	pin_t *stlb;
+	
+	uint8_t portnum; // which port are we
+	
+	uint32_t packet_num;
+	uint32_t packet_position;
+	uint32_t packets_ready;
+	uint32_t packet_state;
+	uint8_t packets[APAPORT_NUM_STATIC_PACKETS][256]; // packets for handling by app
+}apaport_t;
+
+apaport_t apaport_new(uint8_t portnum, uartport_t *uart, pin_t *stlr, pin_t *stlb);
+
+void apaport_reset(apaport_t *apap);
+
+void apaport_scan(apaport_t *apap, uint32_t maxpackets);
+
+void apapacket_shift_pointer(uint8_t *packet, uint8_t portnum);
+
+void apaport_send_packet(uint8_t *address, uint8_t address_length, uint8_t *payload, uint8_t payloadlength);
+
+#endif /* APAPORT_H_ */
\ No newline at end of file
diff --git a/embedded/mkrouter-v06/mkrouter-v06/hardware.h b/embedded/mkrouter-v06/mkrouter-v06/hardware.h
index 1bddc13..8ed7671 100644
--- a/embedded/mkrouter-v06/mkrouter-v06/hardware.h
+++ b/embedded/mkrouter-v06/mkrouter-v06/hardware.h
@@ -14,6 +14,7 @@
 #include "pin.h"
 #include "ringbuffer.h"
 #include "uartport.h"
+#include "apaport.h"
 
 // For if-case init
 
@@ -60,8 +61,10 @@ ringbuffer_t up0rbtx;
 
 uartport_t up0;
 
-pin_t up0stlb;
-pin_t up0stlr;
+apaport_t apap0;
+
+pin_t up0stlb; // on receive
+pin_t up0stlr; // on transmit
 
 
 /*
@@ -76,6 +79,8 @@ ringbuffer_t up1rbtx;
 
 uartport_t up1;
 
+apaport_t apap1;
+
 pin_t up1stlb;
 pin_t up1stlr;
 
@@ -91,6 +96,8 @@ ringbuffer_t up2rbtx;
 
 uartport_t up2;
 
+apaport_t apap2;
+
 pin_t up2stlb;
 pin_t up2stlr;
 
@@ -106,6 +113,8 @@ ringbuffer_t up3rbtx;
 
 uartport_t up3;
 
+apaport_t apap3;
+
 pin_t up3stlb;
 pin_t up3stlr;
 
@@ -121,6 +130,8 @@ ringbuffer_t up4rbtx;
 
 uartport_t up4;
 
+apaport_t apap4;
+
 pin_t up4stlb;
 pin_t up4stlr;
 
@@ -136,10 +147,12 @@ ringbuffer_t up5rbtx;
 
 uartport_t up5;
 
+apaport_t apap5;
+
 pin_t up5stlb;
 pin_t up5stlr;
 
-// pointers to uarports
+// pointers to uartports
 #define NUM_UPS 6
 uartport_t *ups[NUM_UPS];
 
diff --git a/embedded/mkrouter-v06/mkrouter-v06/main.c b/embedded/mkrouter-v06/mkrouter-v06/main.c
index be26e16..a08d847 100644
--- a/embedded/mkrouter-v06/mkrouter-v06/main.c
+++ b/embedded/mkrouter-v06/mkrouter-v06/main.c
@@ -77,7 +77,7 @@ void uarts_init(void){
 	rb_init(&up0rbrx);
 	rb_init(&up0rbtx);
 	// init uart 
-	up0 = uart_new(SERCOM0, &PORT->Group[0], &up0rbrx, &up0rbtx, 5, 4);
+	up0 = uart_new(SERCOM0, &PORT->Group[0], &up0rbrx, &up0rbtx, &up0stlr, &up0stlb, 5, 4);
 	MCLK->APBAMASK.bit.SERCOM0_ = 1;
 	uart_init(&up0, 7, SERCOM0_GCLK_ID_CORE, BAUD_SYSTEM, HARDWARE_ON_PERIPHERAL_D);
 	
@@ -89,7 +89,7 @@ void uarts_init(void){
 	rb_init(&up1rbrx);
 	rb_init(&up1rbtx);
 	// init uart
-	up1 = uart_new(SERCOM1, &PORT->Group[0], &up1rbrx, &up1rbtx, 1, 0);
+	up1 = uart_new(SERCOM1, &PORT->Group[0], &up1rbrx, &up1rbtx, &up1stlr, &up1stlb, 1, 0);
 	MCLK->APBAMASK.bit.SERCOM1_ = 1;
 	uart_init(&up1, 7, SERCOM1_GCLK_ID_CORE, BAUD_SYSTEM, HARDWARE_ON_PERIPHERAL_D);
 	
@@ -101,7 +101,7 @@ void uarts_init(void){
 	rb_init(&up2rbrx);
 	rb_init(&up2rbtx);
 	// init uart
-	up2 = uart_new(SERCOM2, &PORT->Group[0], &up2rbrx, &up2rbtx, 8, 9);
+	up2 = uart_new(SERCOM2, &PORT->Group[0], &up2rbrx, &up2rbtx, &up2stlr, &up2stlb, 8, 9);
 	MCLK->APBBMASK.bit.SERCOM2_ = 1;
 	uart_init(&up2, 7, SERCOM2_GCLK_ID_CORE, BAUD_SYSTEM, HARDWARE_ON_PERIPHERAL_D);
 	
@@ -113,7 +113,7 @@ void uarts_init(void){
 	rb_init(&up3rbrx);
 	rb_init(&up3rbtx);
 	// init uart
-	up3 = uart_new(SERCOM3, &PORT->Group[0], &up3rbrx, &up3rbtx, 16, 17);
+	up3 = uart_new(SERCOM3, &PORT->Group[0], &up3rbrx, &up3rbtx, &up3stlr, &up3stlb, 16, 17);
 	MCLK->APBBMASK.bit.SERCOM3_ = 1;
 	uart_init(&up3, 7, SERCOM3_GCLK_ID_CORE, BAUD_SYSTEM, HARDWARE_ON_PERIPHERAL_D);
 	
@@ -125,7 +125,7 @@ void uarts_init(void){
 	rb_init(&up4rbrx);
 	rb_init(&up4rbtx);
 	// init uart
-	up4 = uart_new(SERCOM4, &PORT->Group[0], &up4rbrx, &up4rbtx, 12, 13);
+	up4 = uart_new(SERCOM4, &PORT->Group[0], &up4rbrx, &up4rbtx, &up4stlr, &up4stlb, 12, 13);
 	MCLK->APBDMASK.bit.SERCOM4_ = 1;
 	uart_init(&up4, 7, SERCOM4_GCLK_ID_CORE, BAUD_SYSTEM, HARDWARE_ON_PERIPHERAL_D);
 	
@@ -137,7 +137,7 @@ void uarts_init(void){
 	rb_init(&up5rbrx);
 	rb_init(&up5rbtx);
 	// uart init
-	up5 = uart_new(SERCOM5, &PORT->Group[0], &up5rbrx, &up5rbtx, 22, 23);
+	up5 = uart_new(SERCOM5, &PORT->Group[0], &up5rbrx, &up5rbtx, &up5stlr, &up5stlb, 22, 23);
 	MCLK->APBDMASK.bit.SERCOM5_ = 1;
 	uart_init(&up5, 7, SERCOM5_GCLK_ID_CORE, BAUD_SYSTEM, HARDWARE_ON_PERIPHERAL_D);
 	
@@ -151,6 +151,26 @@ void uarts_init(void){
 	ups[5] = &up5;
 }
 
+void apaports_init(void){
+	apap0 = apaport_new(0, &up0, &up0stlr, &up0stlb);
+	apaport_reset(&apap0);
+
+	apap1 = apaport_new(1, &up1, &up1stlr, &up1stlb);
+	apaport_reset(&apap1);
+	
+	apap2 = apaport_new(2, &up2, &up2stlr, &up2stlb);
+	apaport_reset(&apap2);
+	
+	apap3 = apaport_new(3, &up3, &up3stlr, &up3stlb);
+	apaport_reset(&apap3);
+	
+	apap4 = apaport_new(4, &up4, &up4stlr, &up4stlb);
+	apaport_reset(&apap4);
+	
+	apap5 = apaport_new(5, &up5, &up5stlr, &up5stlb);
+	apaport_reset(&apap5);
+}
+
 static volatile bool main_b_cdc_enable = false;
 
 int main(void)
@@ -166,6 +186,9 @@ int main(void)
 	
 	// init uartports
 	uarts_init();
+	
+	// init apaports
+	apaports_init();
 		
 	// pointer to the USB struct in sam_ba_usb.h
 	P_USB_CDC pCdc; 
@@ -191,6 +214,16 @@ int main(void)
 			// loops on this
 			while(1){
 				sam_ba_monitor_run();
+				
+				apaport_scan(&apap0, 2);
+				apaport_scan(&apap1, 2);
+				apaport_scan(&apap2, 2);
+				apaport_scan(&apap3, 2);
+				apaport_scan(&apap4, 2);
+				apaport_scan(&apap5, 2);
+				
+				
+				/*
 				while(!rb_empty(up0.rbrx)){
 					uart_sendchar_buffered(&up0, rb_get(up0.rbrx));
 				}
@@ -214,6 +247,7 @@ int main(void)
 				while(!rb_empty(up5.rbrx)){
 					uart_sendchar_buffered(&up5, rb_get(up5.rbrx));
 				}
+				*/
 				//uart_sendchars_buffered(&up0, &testUart, 3);
 				// apaport loops
 			}
diff --git a/embedded/mkrouter-v06/mkrouter-v06/mkrouter-v06.cproj b/embedded/mkrouter-v06/mkrouter-v06/mkrouter-v06.cproj
index 88e975f..63d2367 100644
--- a/embedded/mkrouter-v06/mkrouter-v06/mkrouter-v06.cproj
+++ b/embedded/mkrouter-v06/mkrouter-v06/mkrouter-v06.cproj
@@ -159,6 +159,18 @@
     </ToolchainSettings>
   </PropertyGroup>
   <ItemGroup>
+    <Compile Include="apahandler.c">
+      <SubType>compile</SubType>
+    </Compile>
+    <Compile Include="apahandler.h">
+      <SubType>compile</SubType>
+    </Compile>
+    <Compile Include="apaport.c">
+      <SubType>compile</SubType>
+    </Compile>
+    <Compile Include="apaport.h">
+      <SubType>compile</SubType>
+    </Compile>
     <Compile Include="board_definitions.h">
       <SubType>compile</SubType>
     </Compile>
diff --git a/embedded/mkrouter-v06/mkrouter-v06/uartport.c b/embedded/mkrouter-v06/mkrouter-v06/uartport.c
index aef6907..e873f90 100644
--- a/embedded/mkrouter-v06/mkrouter-v06/uartport.c
+++ b/embedded/mkrouter-v06/mkrouter-v06/uartport.c
@@ -8,7 +8,7 @@
 #include "uartport.h"
 #include "hardware.h"
 
-uartport_t uart_new(Sercom *com, PortGroup *port, ringbuffer_t *rbrx, ringbuffer_t *rbtx, uint32_t rx_pin, uint32_t tx_pin){
+uartport_t uart_new(Sercom *com, PortGroup *port, ringbuffer_t *rbrx, ringbuffer_t *rbtx, pin_t *stlr, pin_t *stlb, uint32_t rx_pin, uint32_t tx_pin){
 	uartport_t uart;
 	
 	// pointers to com and port
@@ -19,6 +19,10 @@ uartport_t uart_new(Sercom *com, PortGroup *port, ringbuffer_t *rbrx, ringbuffer
 	uart.rbrx = rbrx;
 	uart.rbtx = rbtx;
 	
+	// and lights!
+	uart.stlr = stlr;
+	uart.stlb = stlb;
+	
 	// pins 
 	uart.pinrx = rx_pin;
 	uart.pinrx_bm = (uint32_t)(1 << rx_pin);
@@ -78,19 +82,23 @@ void uart_init(uartport_t *uart, uint32_t gclknum, uint32_t gclkidcore, uint16_t
 void uart_sendchar_polled(uartport_t *uart, uint8_t data){
 	while(!uart->com->USART.INTFLAG.bit.DRE);
 	uart->com->USART.DATA.reg = data;
+	pin_clear(uart->stlr);
 }
 
 void uart_sendchar_buffered(uartport_t *uart, uint8_t data){
 	rb_putchar(uart->rbtx, data); // dump it in there
+	pin_clear(uart->stlr);
 	uart->com->USART.INTENSET.bit.DRE = 1; // set up the volley
 }
 
 void uart_sendchars_buffered(uartport_t *uart, uint8_t *data, uint8_t length){
 	rb_putdata(uart->rbtx, data, length);
+	pin_clear(uart->stlr);
 	uart->com->USART.INTENSET.bit.DRE = 1;
 }
 
 void uart_rxhandler(uartport_t *uart){
+	pin_clear(uart->stlb);
 	uint8_t data = uart->com->USART.DATA.reg;
 	rb_putchar(uart->rbrx, data);
 }
@@ -100,5 +108,6 @@ void uart_txhandler(uartport_t *uart){
 		uart->com->USART.DATA.reg = rb_get(uart->rbtx);
 	} else {
 		uart->com->USART.INTENCLR.reg = SERCOM_USART_INTENCLR_DRE;
+		pin_set(uart->stlr);
 	}
 }
\ No newline at end of file
diff --git a/embedded/mkrouter-v06/mkrouter-v06/uartport.h b/embedded/mkrouter-v06/mkrouter-v06/uartport.h
index be3da15..8d8c4b6 100644
--- a/embedded/mkrouter-v06/mkrouter-v06/uartport.h
+++ b/embedded/mkrouter-v06/mkrouter-v06/uartport.h
@@ -30,7 +30,7 @@ typedef struct{
 	uint16_t baud;
 }uartport_t;
 
-uartport_t uart_new(Sercom *com, PortGroup *port, ringbuffer_t *rbrx, ringbuffer_t *rbtx, uint32_t rx_pin, uint32_t tx_pin);
+uartport_t uart_new(Sercom *com, PortGroup *port, ringbuffer_t *rbrx, ringbuffer_t *rbtx, pin_t *stlr, pin_t *stlb, uint32_t rx_pin, uint32_t tx_pin);
 
 void uart_init(uartport_t *uart, uint32_t gclknum, uint32_t gclkidcore, uint16_t baud, uint32_t peripheral);
 
-- 
GitLab