From 5010b8cdb16a0055aa60bc7c8a9a2469f0c5d96e Mon Sep 17 00:00:00 2001
From: Jake <jake.read@cba.mit.edu>
Date: Tue, 1 May 2018 20:05:17 -0400
Subject: [PATCH] stepper sends acks on complete block, should be ready to send
 mocontrol from js

---
 circuit/mkstepper/eagle.epf                   |  8 ++--
 .../mkstepper-v011/apahandler.c               |  6 ++-
 .../mkstepper-v011/mkstepper-v011/apaport.c   |  5 +++
 .../mkstepper-v011/mkstepper-v011/apaport.h   |  2 +
 embedded/mkstepper-v011/mkstepper-v011/main.c | 26 +-----------
 .../mkstepper-v011/mkstepper-v011/stepper.c   | 42 ++++++++++---------
 .../mkstepper-v011/mkstepper-v011/stepper.h   |  6 +--
 7 files changed, 42 insertions(+), 53 deletions(-)

diff --git a/circuit/mkstepper/eagle.epf b/circuit/mkstepper/eagle.epf
index cf506ef..dce4515 100644
--- a/circuit/mkstepper/eagle.epf
+++ b/circuit/mkstepper/eagle.epf
@@ -40,7 +40,7 @@ UsedLibrary="C:/EAGLE 8.3.2/lbr/ltspice/sym.lbr"
 Type="Schematic Editor"
 Number=1
 File="mkstepper.sch"
-View="134.406 87.3199 359.838 304.764"
+View="85.2318 92.065 241.782 243.068"
 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"
@@ -79,14 +79,14 @@ ArcDirection=0
 AddLevel=2
 PadsSameType=0
 Layer=91
-Views=" 1: 134.406 87.3199 359.838 304.764"
+Views=" 1: 85.2318 92.065 241.782 243.068"
 Sheet="1"
 
 [Win_2]
 Type="Board Editor"
 Number=2
 File="mkstepper.brd"
-View="-11.172 -7.65215 62.1037 46.9423"
+View="-3.15469 12.1004 39.2502 43.6944"
 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"
@@ -131,7 +131,7 @@ Type="Control Panel"
 Number=0
 
 [Desktop]
-Screen="1920 1080"
+Screen="3840 1080"
 Window="Win_1"
 Window="Win_2"
 Window="Win_3"
diff --git a/embedded/mkstepper-v011/mkstepper-v011/apahandler.c b/embedded/mkstepper-v011/mkstepper-v011/apahandler.c
index 222f131..957c500 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/apahandler.c
+++ b/embedded/mkstepper-v011/mkstepper-v011/apahandler.c
@@ -11,7 +11,7 @@
 
 void apa_handle_packet(uint8_t *packet, uint8_t length){
 	// dirty debug reply
-	apa_return_packet(packet, length);
+	
 	// through packet
 	int i = 0;
 	int apa_handler_state = APA_HANDLER_OUTSIDE;
@@ -31,12 +31,14 @@ void apa_handle_packet(uint8_t *packet, uint8_t length){
 				switch (packet[i]){
 					
 					case DELIM_KEY_TEST:
+						apa_return_packet(packet, length);
 						pin_toggle(&stlb);
 						i ++;
 						break;
 						
 					case DELIM_KEY_STEPS:
 					// take steps (int32_t) and speed (uint32_t) and dir (uint8_t) to step
+						apa_return_packet(packet, length);
 						if(i + 8 > length){
 							i ++; // avoid hangup, but give up on this
 						} else {
@@ -62,8 +64,8 @@ void apa_handle_packet(uint8_t *packet, uint8_t length){
 							// in steps/s
 							uint32_t deccellength = (packet[i+17] << 24) | (packet[i+18] << 16) | (packet[i+19] << 8) | packet[i+20];
 							// do the business
-							stepper_new_block(&stepper, steps, entryspeed, accel, accellength, deccellength);
 							i += 13; // ? not 12 ?
+							stepper_new_block(packet, i, &stepper, steps, entryspeed, accel, accellength, deccellength);
 						}
 						break;
 																
diff --git a/embedded/mkstepper-v011/mkstepper-v011/apaport.c b/embedded/mkstepper-v011/mkstepper-v011/apaport.c
index ac13490..c25b46e 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/apaport.c
+++ b/embedded/mkstepper-v011/mkstepper-v011/apaport.c
@@ -101,6 +101,11 @@ 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){
+	// 1st byte is port out
+	// not yet implemented, using apa_return_packet ... all of these could be cleaner
+}
+
 // UNIT TESTS:
 /*
  flood packets
diff --git a/embedded/mkstepper-v011/mkstepper-v011/apaport.h b/embedded/mkstepper-v011/mkstepper-v011/apaport.h
index 5ff68b4..22a90f3 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/apaport.h
+++ b/embedded/mkstepper-v011/mkstepper-v011/apaport.h
@@ -45,4 +45,6 @@ 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/mkstepper-v011/mkstepper-v011/main.c b/embedded/mkstepper-v011/mkstepper-v011/main.c
index 561ad97..881db2d 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/main.c
+++ b/embedded/mkstepper-v011/mkstepper-v011/main.c
@@ -247,38 +247,16 @@ int main(void)
 
 	tickup0tx = pin_new(&PORT->Group[0], 13);
 	pin_output(&tickup0tx);
-	
-	//pin_clear(&stlb);
-		
+			
     while (1) 
     {
 		apaport_scan(&apap1, 2);
     }
 }
 
-/*
-next steps (haha)
-- speed and timing: what the heck
-- reduce error accumulation in stepper: track proper last time
-- segment command
-- steps @ speed command
-
-*/
-
 void SysTick_Handler(void){
 	// slow ticker
-	//pin_toggle(&stlb);
-	
-	//uart_sendchar_buffered(&up0, 120);
-
-	/*
-	if(stepper.position_ticks_target == stepper.position_ticks){
-		stpcnt ++;
-		stepper_targetposition_steps(&stepper, 500 * (stpcnt %2));
-		//stepper_targetspeed_steps(&stepper, 10000);
-		//stepper_goto(&stepper, 360 * (stpcnt % 2), 1200);
-	}
-	*/
+	pin_toggle(&stlb);
 }
 
 void SERCOM4_0_Handler(void){
diff --git a/embedded/mkstepper-v011/mkstepper-v011/stepper.c b/embedded/mkstepper-v011/mkstepper-v011/stepper.c
index 2b7872e..84a0d21 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/stepper.c
+++ b/embedded/mkstepper-v011/mkstepper-v011/stepper.c
@@ -66,9 +66,17 @@ void stepper_steps(stepper_t *stepper, int32_t steps, uint32_t speed){
 	stepper->last_step = now;
 }
 
-void stepper_new_block(stepper_t *stepper, int32_t steps, uint32_t entryspeed, uint32_t accel, uint32_t accellength, uint32_t deccellength){
+void stepper_new_block(uint8_t *packet, uint8_t packet_length, stepper_t *stepper, int32_t steps, uint32_t entryspeed, uint32_t accel, uint32_t accellength, uint32_t deccellength){
 	// does assignments and adds to queue
 	
+	// track this address so that we can ack to it when the move is complete
+	// a sloppy copy, I'm sure
+	for(int i = 0; i < packet_length; i ++){
+		stepper->block[stepper->blockhead].packet[i] = packet[i];
+	}
+	
+	stepper->block[stepper->blockhead].packet_length = packet_length;
+	
 	// TODO: should block the execution of this block while we do this, so that we 
 	// have an interrupt safe ringbuffer
 	
@@ -97,14 +105,6 @@ void stepper_new_block(stepper_t *stepper, int32_t steps, uint32_t entryspeed, u
 	
 	// increment block head ptr: should catch full queue HERE but not bothering
 	stepper->blockhead = (stepper->blockhead + 1) % stepper->blocksize;
-	
-	// reset times
-	/*
-	TICKER_SYNC;
-	unsigned long now = TICKER;
-	stepper->last_accel = now;
-	stepper->last_step = now;
-	*/
 }
 
 void stepper_update(stepper_t *stepper){
@@ -112,7 +112,6 @@ void stepper_update(stepper_t *stepper){
 		// pin_clear(&stlb);
 		// bail, no steps to make, ringbuffer is empty
 	} else if(stepper->block[stepper->blocktail].position_end > stepper->position_ticks){ 
-		pin_set(&stlb);
 		// we have somewhere to go
 		TICKER_SYNC;
 		unsigned long now = TICKER;
@@ -123,14 +122,13 @@ void stepper_update(stepper_t *stepper){
 			stepper->speed_period = stepper->one_minute / stepper->speed;
 			
 			// and set the dir
-			if(stepper->block[stepper->blocktail].dir < 0){
-				pin_clear(stepper->dir_pin);
-			} else {
+			if(stepper->block[stepper->blocktail].dir > 0){
 				pin_set(stepper->dir_pin);
+			} else {
+				pin_clear(stepper->dir_pin);
 			}
 			
-			// and clear the distance
-			stepper->position_ticks = 0;
+			// and distance was 0'd after last move
 			
 			// and then clear this flag
 			stepper->block[stepper->blocktail].is_new = 0; 
@@ -165,12 +163,16 @@ void stepper_update(stepper_t *stepper){
 		} // end step cycle
 		
 	} else {
-		pin_clear(&stlb);
-		// we've just finished a block, next time we'll be running with that, or call an empty queue
-		stepper->blocktail = (stepper->blocktail + 1) % stepper->blocksize;
-		stepper->position_ticks = 0;
+		// looks a lot like we're done here
 		
+		// send a reply for windowed transmission
+		// this is dirty because we're passing the backet (referenced here in the ringbuffer) by reference,
+		// properly return_packet should take a copy of the packet so that we can be done with it now, but *it* goes faster than *this* (almost for sure...)
+		// so, we shrugman for now
+		apa_return_packet(stepper->block[stepper->blocktail].packet, stepper->block[stepper->blocktail].packet_length);
 		
-		// call end-block - will want to send the ack now
+		// increment ringbuffer along
+		stepper->blocktail = (stepper->blocktail + 1) % stepper->blocksize;
+		stepper->position_ticks = 0; // clear so that we evaluate new block as having steps to make
 	}
 }
\ No newline at end of file
diff --git a/embedded/mkstepper-v011/mkstepper-v011/stepper.h b/embedded/mkstepper-v011/mkstepper-v011/stepper.h
index d3ae30f..5ff3e67 100644
--- a/embedded/mkstepper-v011/mkstepper-v011/stepper.h
+++ b/embedded/mkstepper-v011/mkstepper-v011/stepper.h
@@ -17,8 +17,8 @@
 // one movement
 typedef struct {
 	// from whence you came
-	uint8_t return_address[8]; // C quesion: how to do this properly with malloc() ? malloc() on embedded sys?
-	uint8_t return_address_length;
+	uint8_t packet[8]; // C quesion: how to do this properly with malloc() ? malloc() on embedded sys?
+	uint8_t packet_length;
 	
 	// tracking
 	uint8_t is_new;
@@ -70,7 +70,7 @@ void stepper_reset(stepper_t *stepper);
 void stepper_steps(stepper_t *stepper, int32_t steps, uint32_t speed);
 
 // steps discrete, mm/min, mm/min/s (mm/s better but we want more discrete resolution)
-void stepper_new_block(stepper_t *stepper, int32_t steps, uint32_t entryspeed, uint32_t accel, uint32_t accellength, uint32_t deccellength);
+void stepper_new_block(uint8_t *packet, uint8_t packet_length, stepper_t *stepper, int32_t steps, uint32_t entryspeed, uint32_t accel, uint32_t accellength, uint32_t deccellength);
 
 void stepper_update(stepper_t *stepper);
 
-- 
GitLab