From 3e8bedd15ff42aa10b500827899284cd2713a1ce Mon Sep 17 00:00:00 2001
From: Jake <jake.read@cba.mit.edu>
Date: Mon, 12 Mar 2018 18:16:08 -0400
Subject: [PATCH] ready to drum on things, probably almost

---
 circuit/mkstepper/eagle.epf                   |   4 +-
 .../.vs/mkstepper-v011/v14/.atsuo             | Bin 93696 -> 93696 bytes
 .../mkstepper-v011/Debug/Makefile             |  18 ++-
 .../mkstepper-v011/Debug/makedep.mk           |   4 +
 .../mkstepper-v011/apahandler.c               |  87 +++++++++++++++
 .../mkstepper-v011/apahandler.h               |  24 ++++
 .../mkstepper-v011/mkstepper-v011/apaport.c   | 104 ++++++++++++++++++
 .../mkstepper-v011/mkstepper-v011/apaport.h   |  50 +++++++++
 .../mkstepper-v011/mkstepper-v011/hardware.h  |  25 ++++-
 embedded/mkstepper-v011/mkstepper-v011/main.c |  87 ++++++++-------
 .../mkstepper-v011/mkstepper-v011.cproj       |  12 ++
 .../mkstepper-v011/ringbuffer.c               |  16 +--
 .../mkstepper-v011/mkstepper-v011/stepper.c   |  21 +++-
 .../mkstepper-v011/mkstepper-v011/stepper.h   |   4 +
 .../mkstepper-v011/mkstepper-v011/tmc26.c     |   2 +-
 .../mkstepper-v011/mkstepper-v011/uartport.c  |  33 +++---
 .../mkstepper-v011/mkstepper-v011/uartport.h  |  13 ++-
 17 files changed, 426 insertions(+), 78 deletions(-)
 create mode 100644 embedded/mkstepper-v011/mkstepper-v011/apahandler.c
 create mode 100644 embedded/mkstepper-v011/mkstepper-v011/apahandler.h
 create mode 100644 embedded/mkstepper-v011/mkstepper-v011/apaport.c
 create mode 100644 embedded/mkstepper-v011/mkstepper-v011/apaport.h

diff --git a/circuit/mkstepper/eagle.epf b/circuit/mkstepper/eagle.epf
index 443d625..b7746cf 100644
--- a/circuit/mkstepper/eagle.epf
+++ b/circuit/mkstepper/eagle.epf
@@ -136,7 +136,7 @@ Loc="0 0 1919 1016"
 State=1
 Number=2
 File="mkstepper.brd"
-View="1.28827 14.4541 62.3512 59.9496"
+View="0.634931 11.1659 35.9723 37.4943"
 WireWidths=" 0.0762 0.1016 0.127 0.15 0.2 0.2032 0.254 0.3048 0.4064 0.508 0.6096 0.8128 1.016 1.27 2.54 0.1524"
 PadDiameters=" 0.254 0.3048 0.4064 0.6096 0.8128 1.016 1.27 1.4224 1.6764 1.778 1.9304 2.1844 2.54 3.81 6.4516 0"
 PadDrills=" 0.2 0.25 0.3 0.35 0.4 0.45 0.5 0.55 0.65 0.7 0.75 0.8 0.85 0.9 1 0.6"
@@ -183,7 +183,7 @@ State=1
 Number=0
 
 [Desktop]
-Screen="1920 1080"
+Screen="3840 1080"
 Window="Win_1"
 Window="Win_2"
 Window="Win_3"
diff --git a/embedded/mkstepper-v011/.vs/mkstepper-v011/v14/.atsuo b/embedded/mkstepper-v011/.vs/mkstepper-v011/v14/.atsuo
index 7fe5d562843ce2d6165dffb2b5051d7c2e912c9c..2a163195ec2d360f156b89f2e032ad41f585a747 100644
GIT binary patch
delta 698
zcmZp;!`g6%bwdsl>j!arDWlDWZ2gRrSVTg(85kJ;LjeyGTLj291!5K;76M{nAcm>q
z0J5ck*bs>MfmjKM{{kiXfV4CaZ=O6+L4I-viw6rx$L1?6GZ<MnyqgTRbv0uo7f=aE
zLJ&xUtO2n>fDOn7StSF+|A2e}Ak7KHAUSMS$wB2n^0GiS$Xa2LwG(4FHs9dL=Hz5h
z2MTKf@npFerO5_NY^=>d&W*{HLSCGVAZ=R6a_vCQy~#g?ye1!JGGy%r@*YgC6!xC%
zB5W}Ei?H5gB_TBy6b&%L>KQ@Wyg5KNX(O8mGXr8`Kgh(*KOMapIdp(bP$<IOHMzvO
zXOoi)BL_%3n#8)vN?A%AAlK?5>DXN2(8IV$hGmk)0me;}4@#|+E?~%H$YaoBNM?w)
zd#k^(U2;}WyrfI|de;VqiGk9S7f35iGIf|_=fVLph8x8wy9<mQ8bA>P6w$0TjGGli
z7BfyhENsYK50ttC#6U3pp$((r<OI{Yi3Kc^7iq{%K47+HdQJwT+2%!>aeR|h1U3s;
zd|;gZ$c9k?o2to+%uh_tk`@roV9=D;l@!gomz?;q(7*eWZWz#^!kZVEB`^XFX%?{C
KE?~#_K_39&ncwyR

delta 712
zcmZp;!`g6%bwdslo5Kmw`ei#e7cnhj3{_xYVE7LOCO|d^l+OaBg`sRtApIAph6hOh
zgQ}GRvJIi~N>G{)NDBh-=81vgEFwV0<Q5hm7E_SO6_y!{tPGmzl?s~+*;X?KDgXsx
z)(Ro9*??>=BtA$D$XPJ!q=9UZbs*<}tdjxa%|I+Xd7^<Z+)h@Io&Ppp<;dgYWK;*T
zHGz1tT#V9W112`sW+3Om<Vulx#z&KXig-^xB5c6g4HSDcxl$O&lQNk6MObgMlG;MX
z$%kD{8E<X=sd@^+ytDbIG&|E|2a__vEA^XRdD?zeR^K6*@^0sAPKJqr!c4*Jo99@h
zFfNi|nHZumS;Jrsqrm2)2G)$zC#Ev`Z1&M9VPxDg`JlP~^o6O6HgLYC<76fgHx|;|
z$kq??1;gZD@&&3H42cXy3@HrdU^<mSk0FEMLh$4%pM$D-d6k*8#eG#8LGGKpNJEZs
z&*Xy&D^*LuN=q0D81jKyOMqIE87@4Q)tful%l`<sP)OUs<=!AIn-^)u@l8_9+MH!E
zjd7BNz+?e26DDqk$q!5vfMLluxkN00LjdR!P`tnbm`w-Bc@jAJmzWm^DE>gn2qrhV
wMBJZ~K?^7XN>ngWHdP?!3e)6Yt`HrPNOGG?+<F)%DY-Pe*ll;QW89+;0Lj7c&Hw-a

diff --git a/embedded/mkstepper-v011/mkstepper-v011/Debug/Makefile b/embedded/mkstepper-v011/mkstepper-v011/Debug/Makefile
index c1f9222..b582b1c 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/Debug/Makefile
+++ b/embedded/mkstepper-v011/mkstepper-v011/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 \
 ../Device_Startup/startup_samd51.c \
 ../Device_Startup/system_samd51.c \
 ../main.c \
@@ -56,6 +58,8 @@ ASM_SRCS +=
 
 
 OBJS +=  \
+apahandler.o \
+apaport.o \
 Device_Startup/startup_samd51.o \
 Device_Startup/system_samd51.o \
 main.o \
@@ -67,6 +71,8 @@ tmc26.o \
 uartport.o
 
 OBJS_AS_ARGS +=  \
+apahandler.o \
+apaport.o \
 Device_Startup/startup_samd51.o \
 Device_Startup/system_samd51.o \
 main.o \
@@ -78,6 +84,8 @@ tmc26.o \
 uartport.o
 
 C_DEPS +=  \
+apahandler.d \
+apaport.d \
 Device_Startup/startup_samd51.d \
 Device_Startup/system_samd51.d \
 main.d \
@@ -89,6 +97,8 @@ tmc26.d \
 uartport.d
 
 C_DEPS_AS_ARGS +=  \
+apahandler.d \
+apaport.d \
 Device_Startup/startup_samd51.d \
 Device_Startup/system_samd51.d \
 main.d \
@@ -134,14 +144,18 @@ LINKER_SCRIPT_DEP+=  \
 
 
 
-Device_Startup/%.o: ../Device_Startup/%.c
+
+
+
+
+./%.o: .././%.c
 	@echo Building file: $<
 	@echo Invoking: ARM/GNU C Compiler : 6.3.1
 	$(QUOTE)C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-gcc.exe$(QUOTE)  -x c -mthumb -D__SAMD51J18A__ -DDEBUG  -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\arm\CMSIS\5.0.1\CMSIS\Include" -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\SAMD51_DFP\1.0.70\include"  -O1 -ffunction-sections -mlong-calls -g3 -Wall -mcpu=cortex-m4 -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)"   -o "$@" "$<" 
 	@echo Finished building: $<
 	
 
-./%.o: .././%.c
+Device_Startup/%.o: ../Device_Startup/%.c
 	@echo Building file: $<
 	@echo Invoking: ARM/GNU C Compiler : 6.3.1
 	$(QUOTE)C:\Program Files (x86)\Atmel\Studio\7.0\toolchain\arm\arm-gnu-toolchain\bin\arm-none-eabi-gcc.exe$(QUOTE)  -x c -mthumb -D__SAMD51J18A__ -DDEBUG  -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\arm\CMSIS\5.0.1\CMSIS\Include" -I"C:\Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\SAMD51_DFP\1.0.70\include"  -O1 -ffunction-sections -mlong-calls -g3 -Wall -mcpu=cortex-m4 -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)"   -o "$@" "$<" 
diff --git a/embedded/mkstepper-v011/mkstepper-v011/Debug/makedep.mk b/embedded/mkstepper-v011/mkstepper-v011/Debug/makedep.mk
index 7dc1a30..1e1e106 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/Debug/makedep.mk
+++ b/embedded/mkstepper-v011/mkstepper-v011/Debug/makedep.mk
@@ -2,6 +2,10 @@
 # Automatically-generated file. Do not edit or delete the file
 ################################################################################
 
+apahandler.c
+
+apaport.c
+
 Device_Startup\startup_samd51.c
 
 Device_Startup\system_samd51.c
diff --git a/embedded/mkstepper-v011/mkstepper-v011/apahandler.c b/embedded/mkstepper-v011/mkstepper-v011/apahandler.c
new file mode 100644
index 0000000..ac9c4b8
--- /dev/null
+++ b/embedded/mkstepper-v011/mkstepper-v011/apahandler.c
@@ -0,0 +1,87 @@
+/*
+ * apahandler.c
+ *
+ * Created: 3/12/2018 11:55:30 AM
+ *  Author: Jake
+ */ 
+
+#include "hardware.h"
+#include "apahandler.h"
+#include "stepper.h"
+
+void apa_handle_packet(uint8_t *packet, uint8_t length){
+	// dirty debug reply
+	uart_sendchars_buffered(&up0, packet, length);
+	// through packet
+	int i = 0;
+	int apa_handler_state = APA_HANDLER_OUTSIDE;
+	
+	while(i < length){ // prep for the messy double switch :|
+		pin_clear(&stlr);
+		switch (apa_handler_state){
+			case APA_HANDLER_OUTSIDE:
+				if (packet[i] == APA_END_ADDR_DELIMITER){
+					apa_handler_state = APA_HANDLER_INSIDE;
+				} else {
+					//
+				}
+				i ++;
+				break;
+				
+			case APA_HANDLER_INSIDE:
+				switch (packet[i]){
+					case DELIM_KEY_POSITION_FLOAT:
+						if(i + 5 < length){
+							break; // broken data
+						} else {
+							float position = 0;
+							position = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb
+							stepper_targetposition_float(&stepper, position);
+							i += 5; // bring packet ptr to next key (should)
+							break;
+						}
+						
+					case DELIM_KEY_POSITION_STEPS:
+						if(i + 5 < length){
+							break; // broken data
+						} else {
+							int32_t steps = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb
+							stepper_targetposition_steps(&stepper, steps);
+							i += 5; // bring packet ptr to next key (should)
+							break;
+						}
+						
+					case DELIM_KEY_SPEED_FLOAT:
+						if(i + 5 < length){
+							break; // broken data
+						} else {
+							float speed = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb
+							stepper_targetspeed_float(&stepper, speed);
+							i += 5; // bring packet ptr to next key (should)
+							break;
+						}
+					
+					case DELIM_KEY_SPEED_STEPS:
+						if(i + 5 < length){
+							break; // broken data
+						} else {
+							int32_t speed = (packet[i+1] << 24) | (packet[i+2] << 16) | (packet[i+3] << 8) | packet[i+4]; // msb
+							stepper_targetspeed_steps(&stepper, speed);
+							i += 5; // bring packet ptr to next key (should)
+							break;
+						}
+																
+					default:
+						// probably an error
+						break;
+				} // end interior switch
+				i ++;
+				break;
+				
+			default: 
+				// throw err
+				break;
+		} // end y/n switch
+	}
+	pin_set(&stlr);
+}
\ No newline at end of file
diff --git a/embedded/mkstepper-v011/mkstepper-v011/apahandler.h b/embedded/mkstepper-v011/mkstepper-v011/apahandler.h
new file mode 100644
index 0000000..fbda15f
--- /dev/null
+++ b/embedded/mkstepper-v011/mkstepper-v011/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_POSITION_FLOAT 127 // is 32 bit float
+#define DELIM_KEY_SPEED_FLOAT 128 // is 32 bit float
+#define DELIM_KEY_POSITION_STEPS 129 // is 32 bit int
+#define DELIM_KEY_SPEED_STEPS 130 // is 32 bit int
+
+void apa_handle_packet(uint8_t *packet, uint8_t length);
+
+#endif /* APAHANDLER_H_ */
\ No newline at end of file
diff --git a/embedded/mkstepper-v011/mkstepper-v011/apaport.c b/embedded/mkstepper-v011/mkstepper-v011/apaport.c
new file mode 100644
index 0000000..40a6e26
--- /dev/null
+++ b/embedded/mkstepper-v011/mkstepper-v011/apaport.c
@@ -0,0 +1,104 @@
+/*
+ * apaport.c
+ *
+ * Created: 2/23/2018 9:17:48 AM
+ *  Author: Jake
+ */ 
+
+#include "apaport.h"
+#include "hardware.h"
+
+void apaport_build(apaport_t *apap, uint8_t portnum, uartport_t *uart, uartport_t **uarts, uint8_t numports, pin_t *stlr, pin_t *stlb){
+	apap->uart = uart;
+	apap->uarts = uarts;
+	apap->portnum = portnum;
+	apap->numports = numports;
+	apap->stlr = stlr;
+	apap->stlb = stlb;
+}
+
+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->stlr);
+			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;
+		// now to handle
+		// [p][0] is length of packet
+		if(apap->packets[p][1] == APA_ADDR_POINTER){
+			apa_handle_packet(apap->packets[p], apap->packets[p][0]);
+		} else if(apap->packets[p][1] == APA_ADDR_FLOOD){
+			// loop through bytes to find pointer and increment
+			apapacket_increment_pointer(apap->packets[p], apap->portnum);
+			// 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(apap->uarts[i], apap->packets[p], apap->packets[p][0]);
+				}
+			}
+		} else {
+			// packet is for a particular port,
+			// we pull that out of the packet now in case the pointer decrements into [1]
+			uint8_t port = apap->packets[p][1];
+			// and check that we're sending it out on a port that exists
+			if (port >= APAPORT_NUM_PORTS){
+				port = APAPORT_NUM_PORTS - 1;
+			}
+			// now we can increment, safely moving pointer
+			apapacket_increment_pointer(apap->packets[p], apap->portnum);
+			// send on next port
+			// HERE: failing on send to other ports?
+			// double / triple check pointer to pointer
+			uart_sendchars_buffered(apap->uarts[port], 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_increment_pointer(uint8_t *packet, uint8_t portnum){
+	for(int i = 2; i < packet[0]; i ++){ 
+		// loop through bytes to find pointer and increment
+		if(packet[i] == APA_ADDR_POINTER){
+			packet[i-1] = APA_ADDR_POINTER; // increment pointer forwards
+			packet[i] = portnum; // port received on is this one
+			break; // we can finish scan now, not looping senselessly through rest of packet
+		}
+	}
+}
\ No newline at end of file
diff --git a/embedded/mkstepper-v011/mkstepper-v011/apaport.h b/embedded/mkstepper-v011/mkstepper-v011/apaport.h
new file mode 100644
index 0000000..248733a
--- /dev/null
+++ b/embedded/mkstepper-v011/mkstepper-v011/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 4
+#define APAPORT_NUM_PORTS 5
+
+#define APAPORT_OUTSIDE_PACKET 0
+#define APAPORT_INSIDE_PACKET 1
+
+#define APA_END_ADDR_DELIMITER 255
+#define APA_ADDR_POINTER 254
+#define APA_ADDR_FLOOD 253
+
+typedef struct{
+	uartport_t *uart;
+	uartport_t **uarts; // ptr to array of ptrs ?
+	pin_t *stlr;
+	pin_t *stlb;
+	
+	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;
+	uint32_t packets_ready;
+	uint32_t packet_state;
+	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, uartport_t **uarts, uint8_t numports, pin_t *stlr, pin_t *stlb);
+
+void apaport_reset(apaport_t *apap);
+
+void apaport_scan(apaport_t *apap, uint32_t maxpackets);
+
+void apapacket_increment_pointer(uint8_t *packet, uint8_t portnum);
+
+#endif /* APAPORT_H_ */
\ No newline at end of file
diff --git a/embedded/mkstepper-v011/mkstepper-v011/hardware.h b/embedded/mkstepper-v011/mkstepper-v011/hardware.h
index c86c98a..d78aa62 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/hardware.h
+++ b/embedded/mkstepper-v011/mkstepper-v011/hardware.h
@@ -11,27 +11,42 @@
 
 #include "pin.h"
 #include "uartport.h"
+#include "apaport.h"
 #include "spiport.h"
 #include "ringbuffer.h"
 #include "tmc26.h"
 #include "stepper.h"
 
+// LIGHTS
+
 pin_t stlr;
 pin_t stlb;
 
+// PORTS
+
+pin_t up0_stlr;
+pin_t up0_stlb;
+pin_t up1_stlr;
+pin_t up1_stlb;
+
+ringbuffer_t up0_rbrx;
+ringbuffer_t up0_rbtx;
 ringbuffer_t up1_rbrx;
 ringbuffer_t up1_rbtx;
-ringbuffer_t up2_rbrx;
-ringbuffer_t up2_rbtx;
 
+uartport_t up0;
 uartport_t up1;
-uartport_t up2;
 
 // array of ptrs to uartports
 // inits in main.c
 #define NUM_UPS 2
 uartport_t *ups[NUM_UPS];
 
+apaport_t apap0;
+apaport_t apap1;
+
+// TMC26x
+
 spiport_t spi_tmc;
 
 pin_t step_pin;
@@ -41,6 +56,8 @@ pin_t sg_pin;
 
 tmc26_t tmc;
 
+// TIMERS
+
 uint32_t overflows;
 
 uint32_t blindcounter;
@@ -51,6 +68,8 @@ uint32_t blindcounter;
 #define TICKER_SYNC (TC0->COUNT32.CTRLBSET.reg = TCC_CTRLBSET_CMD_READSYNC)
 #define TICKER (TC0->COUNT32.COUNT.reg)
 
+// STEPPER
+
 stepper_t stepper;
 
 #endif /* HARDWARE_H_ */
\ No newline at end of file
diff --git a/embedded/mkstepper-v011/mkstepper-v011/main.c b/embedded/mkstepper-v011/mkstepper-v011/main.c
index ec3e8d7..25747e0 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/main.c
+++ b/embedded/mkstepper-v011/mkstepper-v011/main.c
@@ -10,6 +10,7 @@
 #include "pin.h"
 #include "uartport.h"
 #include "spiport.h"
+#include "apaport.h"
 
 #include "hardware.h"
 
@@ -76,6 +77,7 @@ void clock_init(void){
 	OSCCTRL->DFLLCTRLB.reg = OSCCTRL_DFLLCTRLB_WAITLOCK | OSCCTRL_DFLLCTRLB_CCDIS | OSCCTRL_DFLLCTRLB_USBCRM;
 	while(!OSCCTRL->STATUS.bit.DFLLRDY);
 	
+	// this is generating a reference for our 120mhz
 	GCLK->GENCTRL[5].reg = GCLK_GENCTRL_SRC(GCLK_GENCTRL_SRC_DFLL_Val) | GCLK_GENCTRL_GENEN | GCLK_GENCTRL_DIV(24u);
 	while(GCLK->SYNCBUSY.bit.GENCTRL5);
 	
@@ -159,7 +161,7 @@ int main(void)
     /* Initialize the SAM system */
     SystemInit();
 	clock_init();
-	SysTick_Config(5000000);
+	SysTick_Config(12000000);
 	
 	pin_t clockpin = pin_new(&PORT->Group[1], 2);
 	pin_output(&clockpin);
@@ -182,20 +184,26 @@ int main(void)
 	NVIC_EnableIRQ(TC2_IRQn);
 	
 	// ringbuffers (for uart ports)
+	rb_init(&up0_rbrx);
+	rb_init(&up0_rbtx);
 	rb_init(&up1_rbrx);
 	rb_init(&up1_rbtx);
-	rb_init(&up2_rbrx);
-	rb_init(&up2_rbtx);
 	
 	// uarts (ports)
-	// TODO: have used PMUXO and PMUXE incorrectly: only set one of these, based on whether / not pin is even / odd !
-	
-	up1 = uart_new(SERCOM4, &PORT->Group[0], &up1_rbrx, &up1_rbtx, 12, 13, HARDWARE_IS_APBD, HARDWARE_ON_PERIPHERAL_D); 
+	// there's some chance we should really be using one gclk channel for all of the peripherals
+	// and running that at 100MHz or so 
+	up0 = uart_new(SERCOM4, &PORT->Group[0], &up0_rbrx, &up0_rbtx, 12, 13, HARDWARE_IS_APBD, HARDWARE_ON_PERIPHERAL_D); 
 	MCLK->APBDMASK.reg |= MCLK_APBDMASK_SERCOM4;
-	uart_init(&up1, 6, SERCOM4_GCLK_ID_CORE, 63018); // baud: 45402 for 921600, 63018 for 115200
-	up2 = uart_new(SERCOM5, &PORT->Group[1], &up2_rbrx, &up2_rbtx, 3, 2, HARDWARE_IS_APBD, HARDWARE_ON_PERIPHERAL_D);
+	uart_init(&up0, 6, SERCOM4_GCLK_ID_CORE, 62675); // baud: 45402 for 921600, 63018 for 115200
+	up1 = uart_new(SERCOM5, &PORT->Group[1], &up1_rbrx, &up1_rbtx, 3, 2, HARDWARE_IS_APBD, HARDWARE_ON_PERIPHERAL_D);
 	MCLK->APBDMASK.reg |= MCLK_APBDMASK_SERCOM5;
-	uart_init(&up2, 7, SERCOM5_GCLK_ID_CORE, 63018);
+	uart_init(&up1, 7, SERCOM5_GCLK_ID_CORE, 62675);
+	
+	ups[0] = &up0;
+	ups[1] = &up1;
+	
+	apaport_build(&apap0, 0, &up0, ups, 2, &up0_stlr, &up0_stlb);
+	apaport_reset(&apap0);
 	
 	// SPI
 	// TMC_MOSI		PA07 / SER0-3
@@ -237,75 +245,72 @@ int main(void)
 	pin_output(&dir_pin);
 	
 	stepper = stepper_new(&step_pin, &dir_pin, 360.0, 64);
-		
-	stepper_goto(&stepper, 360, 360); // should do 5 turns in 10 seconds
+	
+	stepper_targetspeed_steps(&stepper, 400);
+	
+	uint8_t lpcnt = 0;
+	uint8_t stpcnt = 0;
 	
     while (1) 
     {
-		pin_toggle(&clockpin);
+		apaport_scan(&apap0, 2);
+		lpcnt ++;
+		pin_toggle(&stlb);
+	
+		if(stepper.position_ticks_target == stepper.position_ticks){
+			stpcnt ++;
+			//stepper_targetposition_steps(&stepper, 1000 * (stpcnt %2));
+			//stepper_targetspeed_steps(&stepper, 10000);
+			//stepper_goto(&stepper, 360 * (stpcnt % 2), 1200);
+		}
     }
 }
 
 /*
 next steps (haha)
-- poll uart receive line, look for network packets
-- on finding position / time period packets, parse, put into buffer of step moves
-- roll through buffer of step moves, do them
+- plug into mods
+- do float positions / conversions
+- make sure you can run -ve positions
+- mostly, build the thing, put it together so that you can test
 
 further reading:	
 - quadratic interpolation for position @ time w/ velocity @ endpoint step commands
 
 minors:
-- inverting direction
-- get up to 120MHz for very happy stepping
 - bring baud rate to 1M, at least! what the heck, FTDI!
 */
 
-uint8_t lpcnt = 0;
-uint8_t stpcnt = 0;
 
 
 void SysTick_Handler(void){
-	
 	// slow ticker
+	/*
 	lpcnt ++;
 	pin_toggle(&stlb);
-	/*
-	while(!rb_empty(up1.rbrx)){
-		uart_sendchar_buffered(&up1, rb_get(up1.rbrx));
-	}
-	*/
-	int32_t watch = stepper.position_ticks;
-	uint8_t w1 = watch >> 24;
-	uint8_t w2 = watch >> 16;
-	uint8_t w3 = watch >> 8;
-	uint8_t w4 = watch;
-	/*
-	uart_sendchar_buffered(&up1, w1);
-	uart_sendchar_buffered(&up1, w2);
-	uart_sendchar_buffered(&up1, w3);
-	uart_sendchar_buffered(&up1, w4);
-	*/
+	
 	if(stepper.position_ticks_target == stepper.position_ticks){
 		stpcnt ++;
-		stepper_goto(&stepper, 360 * (stpcnt % 2), 1200);
+		stepper_targetposition_steps(&stepper, 500 * (stpcnt %2));
+		//stepper_targetspeed_steps(&stepper, 10000);
+		//stepper_goto(&stepper, 360 * (stpcnt % 2), 1200);
 	}
+	*/
 }
 
 void SERCOM4_0_Handler(void){
-	uart_txhandler(&up1);
+	uart_txhandler(&up0);
 }
 
 void SERCOM4_2_Handler(void){
-	uart_rxhandler(&up1);
+	uart_rxhandler(&up0);
 }
 
 void SERCOM5_0_Handler(void){
-	uart_txhandler(&up2);
+	uart_txhandler(&up1);
 }
 
 void SERCOM5_2_Handler(void){
-	uart_rxhandler(&up2);
+	uart_rxhandler(&up1);
 }
 
 void TC0_Handler(void){ // fires rarely, for counting overflows of time-ticker
diff --git a/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.cproj b/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.cproj
index 87125a9..c32fc67 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.cproj
+++ b/embedded/mkstepper-v011/mkstepper-v011/mkstepper-v011.cproj
@@ -160,6 +160,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="Device_Startup\startup_samd51.c">
       <SubType>compile</SubType>
     </Compile>
diff --git a/embedded/mkstepper-v011/mkstepper-v011/ringbuffer.c b/embedded/mkstepper-v011/mkstepper-v011/ringbuffer.c
index c7743e4..fb87a8c 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/ringbuffer.c
+++ b/embedded/mkstepper-v011/mkstepper-v011/ringbuffer.c
@@ -47,16 +47,18 @@ uint8_t rb_putchar(ringbuffer_t *rb, uint8_t data){
 }
 
 uint8_t rb_putdata(ringbuffer_t *rb, uint8_t *data, uint8_t size){
-	if(rb_freespace(rb) <= size){
+	/*
+	if(rb_freespace(rb) >= size){
+		// rb_freespace, not working?
 		return 0;
 	} else {
-		uint8_t i = 0;
-		while(i < size){
-			rb_putchar(rb, data[i]);
-			i ++;
-		}
-		return 1;
+		*/
+	for(int i = 0; i < size; i ++){
+		rb_putchar(rb, data[i]);
 	}
+	
+	return 1;
+	//}
 }
 
 uint8_t rb_get(ringbuffer_t *rb){
diff --git a/embedded/mkstepper-v011/mkstepper-v011/stepper.c b/embedded/mkstepper-v011/mkstepper-v011/stepper.c
index df2466e..eabea0c 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/stepper.c
+++ b/embedded/mkstepper-v011/mkstepper-v011/stepper.c
@@ -44,10 +44,23 @@ void stepper_goto(stepper_t *stepper, float position, float speed){
 	// in 3rds of microseconds (a result of timer settings)
 	stepper->speed_period = 3000000 / discrete_speed; 
 	// in steps pulses
-	stepper->position_ticks_target = (position / (stepper->position_per_200_steps / 200)) * stepper->microsteps;; 
-	
-	TICKER_SYNC;
-	stepper->last_time = TICKER;
+	stepper->position_ticks_target = (position / (stepper->position_per_200_steps / 200)) * stepper->microsteps;
+}
+
+void stepper_targetposition_float(stepper_t *stepper, float position){
+	// do the business
+}
+
+void stepper_targetposition_steps(stepper_t *stepper, int32_t position){
+	stepper->position_ticks_target = position;
+}
+
+void stepper_targetspeed_float(stepper_t *stepper, float speed){
+	// do more business
+}
+
+void stepper_targetspeed_steps(stepper_t *stepper, int32_t speed){
+	stepper->speed_period = 3000000 / ((speed / (stepper->position_per_200_steps / 200)) * stepper->microsteps);
 }
 
 void stepper_update(stepper_t *stepper){	
diff --git a/embedded/mkstepper-v011/mkstepper-v011/stepper.h b/embedded/mkstepper-v011/mkstepper-v011/stepper.h
index 63f31c2..e9462d1 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/stepper.h
+++ b/embedded/mkstepper-v011/mkstepper-v011/stepper.h
@@ -38,6 +38,10 @@ stepper_t stepper_new(pin_t *step_pin, pin_t *dir_pin, float position_per_200_st
 void stepper_reset(stepper_t *stepper);
 
 void stepper_goto(stepper_t *stepper, float position, float speed);
+void stepper_targetposition_steps(stepper_t *stepper, int32_t steps);
+void stepper_targetposition_float(stepper_t *stepper, float position);
+void stepper_targetspeed_steps(stepper_t *stepper, int32_t speed);
+void stepper_targetspeed_float(stepper_t *stepper, float speed);
 
 void stepper_update(stepper_t *stepper);
 
diff --git a/embedded/mkstepper-v011/mkstepper-v011/tmc26.c b/embedded/mkstepper-v011/mkstepper-v011/tmc26.c
index 13687c7..ab25078 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/tmc26.c
+++ b/embedded/mkstepper-v011/mkstepper-v011/tmc26.c
@@ -41,7 +41,7 @@ void tmc26_init(tmc26_t *tmc){
 	uint32_t sgthresh_mask = 0b00000111111100000000;
 	int32_t sgthres_val = 60;
 	uint32_t cscale_mask = 0b00000000000000011111;
-	uint32_t cscale_val = 12;
+	uint32_t cscale_val = 28;
 	uint32_t sgcsconf = 0b11010000000000000000 | ((sgthres_val << 8) & sgthresh_mask) | (cscale_val & cscale_mask);
 	tmc26_write(tmc, sgcsconf);
 	
diff --git a/embedded/mkstepper-v011/mkstepper-v011/uartport.c b/embedded/mkstepper-v011/mkstepper-v011/uartport.c
index 3ecefeb..b20889a 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/uartport.c
+++ b/embedded/mkstepper-v011/mkstepper-v011/uartport.c
@@ -16,10 +16,10 @@ uartport_t uart_new(Sercom *com, PortGroup *port, ringbuffer_t *rbrx, ringbuffer
 	uart.rbrx = rbrx;
 	uart.rbtx = rbtx;
 	
-	uart.rx_pin = rx_pin;
-	uart.rx_bm = (uint32_t)(1 << rx_pin);
-	uart.tx_pin = tx_pin;
-	uart.tx_bm = (uint32_t)(1 << tx_pin);
+	uart.pinrx = rx_pin;
+	uart.pinrx_bm = (uint32_t)(1 << rx_pin);
+	uart.pintx = tx_pin;
+	uart.pintx_bm = (uint32_t)(1 << tx_pin);
 	uart.apbx = apbx;
 	uart.peripheral = peripheral;
 	// add ringbuffers
@@ -28,20 +28,20 @@ uartport_t uart_new(Sercom *com, PortGroup *port, ringbuffer_t *rbrx, ringbuffer
 
 void uart_init(uartport_t *uart, uint32_t gclknum, uint32_t gclkidcore, uint16_t baud){
 	// rx pin setups
-	uart->port->DIRCLR.reg = uart->rx_bm;
-	uart->port->PINCFG[uart->rx_pin].bit.PMUXEN = 1;
-	if(uart->rx_pin % 2){ // yes if odd
-		uart->port->PMUX[uart->rx_pin >> 1].reg |= PORT_PMUX_PMUXO(uart->peripheral);
+	uart->port->DIRCLR.reg = uart->pinrx_bm;
+	uart->port->PINCFG[uart->pinrx].bit.PMUXEN = 1;
+	if(uart->pinrx % 2){ // yes if odd
+		uart->port->PMUX[uart->pinrx >> 1].reg |= PORT_PMUX_PMUXO(uart->peripheral);
 		} else {
-		uart->port->PMUX[uart->rx_pin >> 1].reg |= PORT_PMUX_PMUXE(uart->peripheral);
+		uart->port->PMUX[uart->pinrx >> 1].reg |= PORT_PMUX_PMUXE(uart->peripheral);
 	}
 	// tx pin setups
-	uart->port->DIRSET.reg = uart->tx_bm;
-	uart->port->PINCFG[uart->tx_pin].bit.PMUXEN = 1;	
-	if(uart->tx_pin % 2){ // yes if odd
-		uart->port->PMUX[uart->tx_pin >> 1].reg |= PORT_PMUX_PMUXO(uart->peripheral);
+	uart->port->DIRSET.reg = uart->pintx_bm;
+	uart->port->PINCFG[uart->pintx].bit.PMUXEN = 1;	
+	if(uart->pintx % 2){ // yes if odd
+		uart->port->PMUX[uart->pintx >> 1].reg |= PORT_PMUX_PMUXO(uart->peripheral);
 		} else {
-		uart->port->PMUX[uart->tx_pin >> 1].reg |= PORT_PMUX_PMUXE(uart->peripheral);
+		uart->port->PMUX[uart->pintx >> 1].reg |= PORT_PMUX_PMUXE(uart->peripheral);
 	}
 	
 	// unmask the clock
@@ -83,6 +83,11 @@ void uart_sendchar_buffered(uartport_t *uart, uint8_t data){
 	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);
+	uart->com->USART.INTENSET.bit.DRE = 1;
+}
+
 void uart_rxhandler(uartport_t *uart){
 	uint8_t data = uart->com->USART.DATA.reg;
 	rb_putchar(uart->rbrx, data);
diff --git a/embedded/mkstepper-v011/mkstepper-v011/uartport.h b/embedded/mkstepper-v011/mkstepper-v011/uartport.h
index 9551ce3..d92c97c 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/uartport.h
+++ b/embedded/mkstepper-v011/mkstepper-v011/uartport.h
@@ -10,6 +10,7 @@
 
 #include "sam.h"
 #include "ringbuffer.h"
+#include "pin.h"
 
 #define HARDWARE_IS_APBA 0
 #define HARDWARE_IS_APBB 1
@@ -25,13 +26,16 @@ typedef struct{
 	Sercom *com;
 	PortGroup *port;
 	
+	uint32_t pinrx;
+	uint32_t pinrx_bm;
+	uint32_t pintx;
+	uint32_t pintx_bm;
+	
 	ringbuffer_t *rbrx;
 	ringbuffer_t *rbtx;
 	
-	uint32_t rx_pin;
-	uint32_t rx_bm;
-	uint32_t tx_pin;
-	uint32_t tx_bm;
+	pin_t *stlr;
+	pin_t *stlb;
 	
 	uint32_t apbx;
 	uint32_t peripheral;
@@ -44,6 +48,7 @@ void uart_init(uartport_t *uart, uint32_t gclknum, uint32_t gclkidcore, uint16_t
 
 void uart_sendchar_polled(uartport_t *uart, uint8_t data);
 void uart_sendchar_buffered(uartport_t *uart, uint8_t data);
+void uart_sendchars_buffered(uartport_t *uart, uint8_t *data, uint8_t length);
 
 void uart_rxhandler(uartport_t *uart);
 void uart_txhandler(uartport_t *uart);
-- 
GitLab