Direct Stepping update (#19135)
This commit is contained in:
		
				
					committed by
					
						 Scott Lahteine
						Scott Lahteine
					
				
			
			
				
	
			
			
			
						parent
						
							1b129ede4e
						
					
				
				
					commit
					8670f475b8
				
			| @@ -56,9 +56,6 @@ namespace DirectStepping { | |||||||
|   template<typename Cfg> |   template<typename Cfg> | ||||||
|   volatile bool SerialPageManager<Cfg>::page_states_dirty; |   volatile bool SerialPageManager<Cfg>::page_states_dirty; | ||||||
|  |  | ||||||
|   template<typename Cfg> |  | ||||||
|   millis_t SerialPageManager<Cfg>::next_response; |  | ||||||
|  |  | ||||||
|   template<typename Cfg> |   template<typename Cfg> | ||||||
|   uint8_t SerialPageManager<Cfg>::pages[Cfg::NUM_PAGES][Cfg::PAGE_SIZE]; |   uint8_t SerialPageManager<Cfg>::pages[Cfg::NUM_PAGES][Cfg::PAGE_SIZE]; | ||||||
|  |  | ||||||
| @@ -80,7 +77,6 @@ namespace DirectStepping { | |||||||
|       page_states[i] = PageState::FREE; |       page_states[i] = PageState::FREE; | ||||||
|  |  | ||||||
|     fatal_error = false; |     fatal_error = false; | ||||||
|     next_response = 0; |  | ||||||
|     state = State::NEWLINE; |     state = State::NEWLINE; | ||||||
|  |  | ||||||
|     page_states_dirty = false; |     page_states_dirty = false; | ||||||
| @@ -181,15 +177,8 @@ namespace DirectStepping { | |||||||
|       return; |       return; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // Runs on a set interval also, as responses may get lost. |  | ||||||
|     if (next_response && next_response < millis()) { |  | ||||||
|       page_states_dirty = true; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (!page_states_dirty) return; |     if (!page_states_dirty) return; | ||||||
|  |  | ||||||
|     page_states_dirty = false; |     page_states_dirty = false; | ||||||
|     next_response = millis() + Cfg::RESPONSE_INTERVAL_MS; |  | ||||||
|  |  | ||||||
|     SERIAL_ECHO(Cfg::CONTROL_CHAR); |     SERIAL_ECHO(Cfg::CONTROL_CHAR); | ||||||
|     constexpr int state_bits = 2; |     constexpr int state_bits = 2; | ||||||
| @@ -238,29 +227,29 @@ const uint8_t segment_table[DirectStepping::Config::NUM_SEGMENTS][DirectStepping | |||||||
|  |  | ||||||
|   #if STEPPER_PAGE_FORMAT == SP_4x4D_128 |   #if STEPPER_PAGE_FORMAT == SP_4x4D_128 | ||||||
|  |  | ||||||
|     { 1, 1, 1, 1, 1, 1, 1, 0 }, //  0 = -7 |     { 1, 1, 1, 1, 1, 1, 1 }, //  0 = -7 | ||||||
|     { 1, 1, 1, 0, 1, 1, 1, 0 }, //  1 = -6 |     { 1, 1, 1, 0, 1, 1, 1 }, //  1 = -6 | ||||||
|     { 0, 1, 1, 0, 1, 0, 1, 1 }, //  2 = -5 |     { 1, 1, 1, 0, 1, 0, 1 }, //  2 = -5 | ||||||
|     { 0, 1, 0, 1, 0, 1, 0, 1 }, //  3 = -4 |     { 1, 1, 0, 1, 0, 1, 0 }, //  3 = -4 | ||||||
|     { 0, 1, 0, 0, 1, 0, 0, 1 }, //  4 = -3 |     { 1, 1, 0, 0, 1, 0, 0 }, //  4 = -3 | ||||||
|     { 0, 0, 1, 0, 0, 0, 1, 0 }, //  5 = -2 |     { 0, 0, 1, 0, 0, 0, 1 }, //  5 = -2 | ||||||
|     { 0, 0, 0, 0, 1, 0, 0, 0 }, //  6 = -1 |     { 0, 0, 0, 1, 0, 0, 0 }, //  6 = -1 | ||||||
|     { 0, 0, 0, 0, 0, 0, 0, 0 }, //  7 =  0 |     { 0, 0, 0, 0, 0, 0, 0 }, //  7 =  0 | ||||||
|     { 0, 0, 0, 0, 1, 0, 0, 0 }, //  8 =  1 |     { 0, 0, 0, 1, 0, 0, 0 }, //  8 =  1 | ||||||
|     { 0, 0, 1, 0, 0, 0, 1, 0 }, //  9 =  2 |     { 0, 0, 1, 0, 0, 0, 1 }, //  9 =  2 | ||||||
|     { 0, 1, 0, 0, 1, 0, 0, 1 }, // 10 =  3 |     { 1, 1, 0, 0, 1, 0, 0 }, // 10 =  3 | ||||||
|     { 0, 1, 0, 1, 0, 1, 0, 1 }, // 11 =  4 |     { 1, 1, 0, 1, 0, 1, 0 }, // 11 =  4 | ||||||
|     { 0, 1, 1, 0, 1, 0, 1, 1 }, // 12 =  5 |     { 1, 1, 1, 0, 1, 0, 1 }, // 12 =  5 | ||||||
|     { 1, 1, 1, 0, 1, 1, 1, 0 }, // 13 =  6 |     { 1, 1, 1, 0, 1, 1, 1 }, // 13 =  6 | ||||||
|     { 1, 1, 1, 1, 1, 1, 1, 0 }, // 14 =  7 |     { 1, 1, 1, 1, 1, 1, 1 }, // 14 =  7 | ||||||
|     { 0 } |     { 0 } | ||||||
|  |  | ||||||
|   #elif STEPPER_PAGE_FORMAT == SP_4x2_256 |   #elif STEPPER_PAGE_FORMAT == SP_4x2_256 | ||||||
|  |  | ||||||
|     { 0, 0, 0, 0 }, // 0 |     { 0, 0, 0 }, // 0 | ||||||
|     { 0, 1, 0, 0 }, // 1 |     { 0, 1, 0 }, // 1 | ||||||
|     { 1, 0, 1, 0 }, // 2 |     { 1, 0, 1 }, // 2 | ||||||
|     { 1, 1, 1, 0 }, // 3 |     { 1, 1, 1 }, // 3 | ||||||
|  |  | ||||||
|   #elif STEPPER_PAGE_FORMAT == SP_4x1_512 |   #elif STEPPER_PAGE_FORMAT == SP_4x1_512 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -70,7 +70,6 @@ namespace DirectStepping { | |||||||
|  |  | ||||||
|     static volatile PageState page_states[Cfg::NUM_PAGES]; |     static volatile PageState page_states[Cfg::NUM_PAGES]; | ||||||
|     static volatile bool page_states_dirty; |     static volatile bool page_states_dirty; | ||||||
|     static millis_t next_response; |  | ||||||
|  |  | ||||||
|     static uint8_t pages[Cfg::NUM_PAGES][Cfg::PAGE_SIZE]; |     static uint8_t pages[Cfg::NUM_PAGES][Cfg::PAGE_SIZE]; | ||||||
|     static uint8_t checksum; |     static uint8_t checksum; | ||||||
| @@ -94,14 +93,11 @@ namespace DirectStepping { | |||||||
|     static constexpr int DIRECTIONAL    = dir ? 1 : 0; |     static constexpr int DIRECTIONAL    = dir ? 1 : 0; | ||||||
|     static constexpr int SEGMENTS       = segments; |     static constexpr int SEGMENTS       = segments; | ||||||
|  |  | ||||||
|     static constexpr int RAW            = (BITS_SEGMENT == 1) ? 1 : 0; |  | ||||||
|     static constexpr int NUM_SEGMENTS   = 1 << BITS_SEGMENT; |     static constexpr int NUM_SEGMENTS   = 1 << BITS_SEGMENT; | ||||||
|     static constexpr int SEGMENT_STEPS  = 1 << (BITS_SEGMENT - DIRECTIONAL - RAW); |     static constexpr int SEGMENT_STEPS  = (1 << (BITS_SEGMENT - DIRECTIONAL)) - 1; | ||||||
|     static constexpr int TOTAL_STEPS    = SEGMENT_STEPS * SEGMENTS; |     static constexpr int TOTAL_STEPS    = SEGMENT_STEPS * SEGMENTS; | ||||||
|     static constexpr int PAGE_SIZE      = (NUM_AXES * BITS_SEGMENT * SEGMENTS) / 8; |     static constexpr int PAGE_SIZE      = (NUM_AXES * BITS_SEGMENT * SEGMENTS) / 8; | ||||||
|  |  | ||||||
|     static constexpr millis_t RESPONSE_INTERVAL_MS = 50; |  | ||||||
|  |  | ||||||
|     typedef typename TypeSelector<(PAGE_SIZE>256), uint16_t, uint8_t>::type write_byte_idx_t; |     typedef typename TypeSelector<(PAGE_SIZE>256), uint16_t, uint8_t>::type write_byte_idx_t; | ||||||
|     typedef typename TypeSelector<(NUM_PAGES>256), uint16_t, uint8_t>::type page_idx_t; |     typedef typename TypeSelector<(NUM_PAGES>256), uint16_t, uint8_t>::type page_idx_t; | ||||||
|   }; |   }; | ||||||
|   | |||||||
| @@ -1578,12 +1578,11 @@ void Stepper::pulse_phase_isr() { | |||||||
|  |  | ||||||
|         #if STEPPER_PAGE_FORMAT == SP_4x4D_128 |         #if STEPPER_PAGE_FORMAT == SP_4x4D_128 | ||||||
|  |  | ||||||
|           #define PAGE_SEGMENT_UPDATE(AXIS, VALUE, MID) do{ \ |           #define PAGE_SEGMENT_UPDATE(AXIS, VALUE) do{   \ | ||||||
|                  if ((VALUE) == MID) {}                     \ |                  if ((VALUE) <  7) SBI(dm, _AXIS(AXIS)); \ | ||||||
|             else if ((VALUE) <  MID) SBI(dm, _AXIS(AXIS));  \ |             else if ((VALUE) >  7) CBI(dm, _AXIS(AXIS)); \ | ||||||
|             else                     CBI(dm, _AXIS(AXIS));  \ |             page_step_state.sd[_AXIS(AXIS)] = VALUE;     \ | ||||||
|             page_step_state.sd[_AXIS(AXIS)] = VALUE;        \ |             page_step_state.bd[_AXIS(AXIS)] += VALUE;    \ | ||||||
|             page_step_state.bd[_AXIS(AXIS)] += VALUE;       \ |  | ||||||
|           }while(0) |           }while(0) | ||||||
|  |  | ||||||
|           #define PAGE_PULSE_PREP(AXIS) do{ \ |           #define PAGE_PULSE_PREP(AXIS) do{ \ | ||||||
| @@ -1592,7 +1591,7 @@ void Stepper::pulse_phase_isr() { | |||||||
|           }while(0) |           }while(0) | ||||||
|  |  | ||||||
|           switch (page_step_state.segment_steps) { |           switch (page_step_state.segment_steps) { | ||||||
|             case 8: |             case DirectStepping::Config::SEGMENT_STEPS: | ||||||
|               page_step_state.segment_idx += 2; |               page_step_state.segment_idx += 2; | ||||||
|               page_step_state.segment_steps = 0; |               page_step_state.segment_steps = 0; | ||||||
|               // fallthru |               // fallthru | ||||||
| @@ -1601,10 +1600,10 @@ void Stepper::pulse_phase_isr() { | |||||||
|                            high = page_step_state.page[page_step_state.segment_idx + 1]; |                            high = page_step_state.page[page_step_state.segment_idx + 1]; | ||||||
|               uint8_t dm = last_direction_bits; |               uint8_t dm = last_direction_bits; | ||||||
|  |  | ||||||
|               PAGE_SEGMENT_UPDATE(X, low >> 4, 7); |               PAGE_SEGMENT_UPDATE(X, low >> 4); | ||||||
|               PAGE_SEGMENT_UPDATE(Y, low & 0xF, 7); |               PAGE_SEGMENT_UPDATE(Y, low & 0xF); | ||||||
|               PAGE_SEGMENT_UPDATE(Z, high >> 4, 7); |               PAGE_SEGMENT_UPDATE(Z, high >> 4); | ||||||
|               PAGE_SEGMENT_UPDATE(E, high & 0xF, 7); |               PAGE_SEGMENT_UPDATE(E, high & 0xF); | ||||||
|  |  | ||||||
|               if (dm != last_direction_bits) { |               if (dm != last_direction_bits) { | ||||||
|                 last_direction_bits = dm; |                 last_direction_bits = dm; | ||||||
| @@ -1615,9 +1614,9 @@ void Stepper::pulse_phase_isr() { | |||||||
|             default: break; |             default: break; | ||||||
|           } |           } | ||||||
|  |  | ||||||
|           PAGE_PULSE_PREP(X), |           PAGE_PULSE_PREP(X); | ||||||
|           PAGE_PULSE_PREP(Y), |           PAGE_PULSE_PREP(Y); | ||||||
|           PAGE_PULSE_PREP(Z), |           PAGE_PULSE_PREP(Z); | ||||||
|           PAGE_PULSE_PREP(E); |           PAGE_PULSE_PREP(E); | ||||||
|  |  | ||||||
|           page_step_state.segment_steps++; |           page_step_state.segment_steps++; | ||||||
| @@ -1634,7 +1633,7 @@ void Stepper::pulse_phase_isr() { | |||||||
|           }while(0) |           }while(0) | ||||||
|  |  | ||||||
|           switch (page_step_state.segment_steps) { |           switch (page_step_state.segment_steps) { | ||||||
|             case 4: |             case DirectStepping::Config::SEGMENT_STEPS: | ||||||
|               page_step_state.segment_idx++; |               page_step_state.segment_idx++; | ||||||
|               page_step_state.segment_steps = 0; |               page_step_state.segment_steps = 0; | ||||||
|               // fallthru |               // fallthru | ||||||
| @@ -1664,7 +1663,6 @@ void Stepper::pulse_phase_isr() { | |||||||
|           }while(0) |           }while(0) | ||||||
|  |  | ||||||
|           uint8_t steps = page_step_state.page[page_step_state.segment_idx >> 1]; |           uint8_t steps = page_step_state.page[page_step_state.segment_idx >> 1]; | ||||||
|  |  | ||||||
|           if (page_step_state.segment_idx & 0x1) steps >>= 4; |           if (page_step_state.segment_idx & 0x1) steps >>= 4; | ||||||
|  |  | ||||||
|           PAGE_PULSE_PREP(X, 3); |           PAGE_PULSE_PREP(X, 3); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user