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