void Conveyor::on_module_loaded() { register_for_event(ON_IDLE); register_for_event(ON_HALT); // Attach to the end_of_move stepper event //THEKERNEL->step_ticker->finished_fnc = std::bind( &Conveyor::all_moves_finished, this); queue_size = THEKERNEL->config->value(planner_queue_size_checksum)->by_default(32)->as_number(); queue_delay_time_ms = THEKERNEL->config->value(queue_delay_time_ms_checksum)->by_default(100)->as_number(); }
void Touchprobe::on_module_loaded() { // if the module is disabled -> do nothing this->enabled = THEKERNEL->config->value( touchprobe_enable_checksum )->by_default(false)->as_bool(); if( !(this->enabled) ){ // as this module is not needed free up the resource delete this; return; } this->probe_rate = 5; // load settings this->on_config_reload(this); // register event-handlers register_for_event(ON_CONFIG_RELOAD); register_for_event(ON_GCODE_RECEIVED); register_for_event(ON_IDLE); }
void SimpleShell::on_module_loaded(){ this->current_path = "/"; this->register_for_event(ON_CONSOLE_LINE_RECEIVED); this->reset_delay_secs= 0; register_for_event(ON_SECOND_TICK); }
void ModbusSpindleControl::on_module_loaded() { spindle_on = false; PinName rx_pin; PinName tx_pin; PinName dir_pin; // preparing PinName objects from the config string { Pin *smoothie_pin = new Pin(); smoothie_pin->from_string(THEKERNEL->config->value(spindle_checksum, spindle_rx_pin_checksum)->by_default("nc")->as_string()); smoothie_pin->as_input(); rx_pin = port_pin((PortName)smoothie_pin->port_number, smoothie_pin->pin); smoothie_pin->from_string(THEKERNEL->config->value(spindle_checksum, spindle_tx_pin_checksum)->by_default("nc")->as_string()); smoothie_pin->as_input(); tx_pin = port_pin((PortName)smoothie_pin->port_number, smoothie_pin->pin); smoothie_pin->from_string(THEKERNEL->config->value(spindle_checksum, spindle_dir_pin_checksum)->by_default("nc")->as_string()); smoothie_pin->as_input(); dir_pin = port_pin((PortName)smoothie_pin->port_number, smoothie_pin->pin); delete smoothie_pin; } // setup the Modbus interface modbus = new Modbus(tx_pin, rx_pin, dir_pin); // register for events register_for_event(ON_GCODE_RECEIVED); }
void Endstops::on_module_loaded() { // Do not do anything if not enabled if ( THEKERNEL->config->value( endstops_module_enable_checksum )->by_default(true)->as_bool() == false ) { delete this; return; } register_for_event(ON_GCODE_RECEIVED); register_for_event(ON_GET_PUBLIC_DATA); register_for_event(ON_SET_PUBLIC_DATA); // Settings this->load_config(); THEKERNEL->slow_ticker->attach(1000, this, &Endstops::read_endstops); }
void Switch::on_module_loaded(){ register_for_event(ON_CONFIG_RELOAD); this->register_for_event(ON_GCODE_RECEIVED); this->register_for_event(ON_GCODE_EXECUTE); // Settings this->on_config_reload(this); // PWM this->kernel->slow_ticker->attach(1000, &output_pin, &Pwm::on_tick); }
void RotaryDeltaCalibration::on_module_loaded() { // if the module is disabled -> do nothing if(!THEKERNEL->config->value( rotarydelta_checksum, enable_checksum )->by_default(false)->as_bool()) { // as this module is not needed free up the resource delete this; return; } // register event-handlers register_for_event(ON_GCODE_RECEIVED); }
void LPC17XX_Ethernet::on_module_loaded() { LPC_PINCON->PINSEL2 = (1 << 0) | (1 << 2) | (1 << 8) | (1 << 16) | (1 << 18) | (1 << 20) | (1 << 28) | (1 << 30); LPC_PINCON->PINSEL3 &= (2 << 0) | (2 << 2); LPC_PINCON->PINSEL3 |= (1 << 0) | (1 << 2); printf("EMAC_INIT\n"); emac_init(); printf("INIT OK\n"); //register_for_event(ON_IDLE); register_for_event(ON_SECOND_TICK); }
void SCARAcal::on_module_loaded() { // if the module is disabled -> do nothing if(!THEKERNEL->config->value( scaracal_checksum, enable_checksum )->by_default(false)->as_bool()) { // as this module is not needed free up the resource delete this; return; } // load settings this->on_config_reload(this); // register event-handlers register_for_event(ON_GCODE_RECEIVED); }
void Switch::on_module_loaded() { this->switch_changed = false; register_for_event(ON_CONFIG_RELOAD); this->register_for_event(ON_GCODE_RECEIVED); this->register_for_event(ON_GCODE_EXECUTE); this->register_for_event(ON_MAIN_LOOP); this->register_for_event(ON_GET_PUBLIC_DATA); this->register_for_event(ON_SET_PUBLIC_DATA); // Settings this->on_config_reload(this); }
void TemperatureControl::on_module_loaded(){ // We start not desiring any temp this->target_temperature = UNDEFINED; // Settings this->on_config_reload(this); // Register for events register_for_event(ON_CONFIG_RELOAD); this->register_for_event(ON_GCODE_EXECUTE); this->register_for_event(ON_GCODE_RECEIVED); this->register_for_event(ON_MAIN_LOOP); this->register_for_event(ON_SECOND_TICK); this->register_for_event(ON_GET_PUBLIC_DATA); this->register_for_event(ON_SET_PUBLIC_DATA); }
void Extruder::on_module_loaded() { // Do not do anything if not enabledd if( this->kernel->config->value( extruder_module_enable_checksum )->by_default(false)->as_bool() == false ){ return; } // Settings this->on_config_reload(this); // We start with the enable pin off this->en_pin.set(1); // We work on the same Block as Stepper, so we need to know when it gets a new one and drops one register_for_event(ON_CONFIG_RELOAD); this->register_for_event(ON_BLOCK_BEGIN); this->register_for_event(ON_BLOCK_END); this->register_for_event(ON_GCODE_RECEIVED); this->register_for_event(ON_GCODE_EXECUTE); this->register_for_event(ON_PLAY); this->register_for_event(ON_PAUSE); this->register_for_event(ON_SPEED_CHANGE); // Start values this->target_position = 0; this->current_position = 0; this->current_steps = 0; this->current_block = NULL; this->mode = OFF; // Update speed every *acceleration_ticks_per_second* // TODO: Make this an independent setting this->kernel->slow_ticker->attach( this->kernel->stepper->acceleration_ticks_per_second , this, &Extruder::acceleration_tick ); // Stepper motor object for the extruder this->stepper_motor = this->kernel->step_ticker->add_stepper_motor( new StepperMotor(&step_pin, &dir_pin, &en_pin) ); this->stepper_motor->attach(this, &Extruder::stepper_motor_finished_move ); }
// Get config void Endstops::load_config() { this->pins[0].from_string( THEKERNEL->config->value(alpha_min_endstop_checksum )->by_default("nc" )->as_string())->as_input(); this->pins[1].from_string( THEKERNEL->config->value(beta_min_endstop_checksum )->by_default("nc" )->as_string())->as_input(); this->pins[2].from_string( THEKERNEL->config->value(gamma_min_endstop_checksum )->by_default("nc" )->as_string())->as_input(); this->pins[3].from_string( THEKERNEL->config->value(alpha_max_endstop_checksum )->by_default("nc" )->as_string())->as_input(); this->pins[4].from_string( THEKERNEL->config->value(beta_max_endstop_checksum )->by_default("nc" )->as_string())->as_input(); this->pins[5].from_string( THEKERNEL->config->value(gamma_max_endstop_checksum )->by_default("nc" )->as_string())->as_input(); // These are the old ones in steps still here for backwards compatibility this->fast_rates[0] = THEKERNEL->config->value(alpha_fast_homing_rate_checksum )->by_default(4000 )->as_number() / STEPS_PER_MM(0); this->fast_rates[1] = THEKERNEL->config->value(beta_fast_homing_rate_checksum )->by_default(4000 )->as_number() / STEPS_PER_MM(1); this->fast_rates[2] = THEKERNEL->config->value(gamma_fast_homing_rate_checksum )->by_default(6400 )->as_number() / STEPS_PER_MM(2); this->slow_rates[0] = THEKERNEL->config->value(alpha_slow_homing_rate_checksum )->by_default(2000 )->as_number() / STEPS_PER_MM(0); this->slow_rates[1] = THEKERNEL->config->value(beta_slow_homing_rate_checksum )->by_default(2000 )->as_number() / STEPS_PER_MM(1); this->slow_rates[2] = THEKERNEL->config->value(gamma_slow_homing_rate_checksum )->by_default(3200 )->as_number() / STEPS_PER_MM(2); this->retract_mm[0] = THEKERNEL->config->value(alpha_homing_retract_checksum )->by_default(400 )->as_number() / STEPS_PER_MM(0); this->retract_mm[1] = THEKERNEL->config->value(beta_homing_retract_checksum )->by_default(400 )->as_number() / STEPS_PER_MM(1); this->retract_mm[2] = THEKERNEL->config->value(gamma_homing_retract_checksum )->by_default(1600 )->as_number() / STEPS_PER_MM(2); // newer mm based config values override the old ones, convert to steps/mm and steps, defaults to what was set in the older config settings above this->fast_rates[0] = THEKERNEL->config->value(alpha_fast_homing_rate_mm_checksum )->by_default(this->fast_rates[0])->as_number(); this->fast_rates[1] = THEKERNEL->config->value(beta_fast_homing_rate_mm_checksum )->by_default(this->fast_rates[1])->as_number(); this->fast_rates[2] = THEKERNEL->config->value(gamma_fast_homing_rate_mm_checksum )->by_default(this->fast_rates[2])->as_number(); this->slow_rates[0] = THEKERNEL->config->value(alpha_slow_homing_rate_mm_checksum )->by_default(this->slow_rates[0])->as_number(); this->slow_rates[1] = THEKERNEL->config->value(beta_slow_homing_rate_mm_checksum )->by_default(this->slow_rates[1])->as_number(); this->slow_rates[2] = THEKERNEL->config->value(gamma_slow_homing_rate_mm_checksum )->by_default(this->slow_rates[2])->as_number(); this->retract_mm[0] = THEKERNEL->config->value(alpha_homing_retract_mm_checksum )->by_default(this->retract_mm[0])->as_number(); this->retract_mm[1] = THEKERNEL->config->value(beta_homing_retract_mm_checksum )->by_default(this->retract_mm[1])->as_number(); this->retract_mm[2] = THEKERNEL->config->value(gamma_homing_retract_mm_checksum )->by_default(this->retract_mm[2])->as_number(); // NOTE the debouce count is in milliseconds so probably does not need to beset anymore this->debounce_ms= THEKERNEL->config->value(endstop_debounce_ms_checksum )->by_default(0)->as_number(); this->debounce_count= THEKERNEL->config->value(endstop_debounce_count_checksum )->by_default(100)->as_number(); // get homing direction and convert to boolean where true is home to min, and false is home to max this->home_direction[0]= THEKERNEL->config->value(alpha_homing_direction_checksum)->by_default("home_to_min")->as_string() != "home_to_max"; this->home_direction[1]= THEKERNEL->config->value(beta_homing_direction_checksum)->by_default("home_to_min")->as_string() != "home_to_max"; this->home_direction[2]= THEKERNEL->config->value(gamma_homing_direction_checksum)->by_default("home_to_min")->as_string() != "home_to_max"; this->homing_position[0]= this->home_direction[0] ? THEKERNEL->config->value(alpha_min_checksum)->by_default(0)->as_number() : THEKERNEL->config->value(alpha_max_checksum)->by_default(200)->as_number(); this->homing_position[1]= this->home_direction[1] ? THEKERNEL->config->value(beta_min_checksum )->by_default(0)->as_number() : THEKERNEL->config->value(beta_max_checksum )->by_default(200)->as_number(); this->homing_position[2]= this->home_direction[2] ? THEKERNEL->config->value(gamma_min_checksum)->by_default(0)->as_number() : THEKERNEL->config->value(gamma_max_checksum)->by_default(200)->as_number(); // used to set maximum movement on homing, set by alpha_max_travel if defined // for backward compatibility uses alpha_max if not defined. // TO BE deprecated this->alpha_max= THEKERNEL->config->value(alpha_max_checksum)->by_default(500)->as_number(); this->beta_max= THEKERNEL->config->value(beta_max_checksum)->by_default(500)->as_number(); this->gamma_max= THEKERNEL->config->value(gamma_max_checksum)->by_default(500)->as_number(); this->alpha_max= THEKERNEL->config->value(alpha_max_travel_checksum)->by_default(alpha_max*2)->as_number(); this->beta_max= THEKERNEL->config->value(beta_max_travel_checksum)->by_default(beta_max*2)->as_number(); this->gamma_max= THEKERNEL->config->value(gamma_max_travel_checksum)->by_default(gamma_max*2)->as_number(); this->is_corexy = THEKERNEL->config->value(corexy_homing_checksum)->by_default(false)->as_bool(); this->is_delta = THEKERNEL->config->value(delta_homing_checksum)->by_default(false)->as_bool(); this->is_rdelta = THEKERNEL->config->value(rdelta_homing_checksum)->by_default(false)->as_bool(); this->is_scara = THEKERNEL->config->value(scara_homing_checksum)->by_default(false)->as_bool(); this->home_z_first = THEKERNEL->config->value(home_z_first_checksum)->by_default(false)->as_bool(); // see if an order has been specified, must be three characters, XYZ or YXZ etc string order = THEKERNEL->config->value(homing_order_checksum)->by_default("")->as_string(); this->homing_order = 0; if(order.size() == 3 && !(this->is_delta || this->is_rdelta)) { int shift = 0; for(auto c : order) { uint8_t i = toupper(c) - 'X'; if(i > 2) { // bad value this->homing_order = 0; break; } homing_order |= (i << shift); shift += 2; } } // endstop trim used by deltas to do soft adjusting // on a delta homing to max, a negative trim value will move the carriage down, and a positive will move it up this->trim_mm[0] = THEKERNEL->config->value(alpha_trim_checksum )->by_default(0 )->as_number(); this->trim_mm[1] = THEKERNEL->config->value(beta_trim_checksum )->by_default(0 )->as_number(); this->trim_mm[2] = THEKERNEL->config->value(gamma_trim_checksum )->by_default(0 )->as_number(); // limits enabled this->limit_enable[X_AXIS] = THEKERNEL->config->value(alpha_limit_enable_checksum)->by_default(false)->as_bool(); this->limit_enable[Y_AXIS] = THEKERNEL->config->value(beta_limit_enable_checksum)->by_default(false)->as_bool(); this->limit_enable[Z_AXIS] = THEKERNEL->config->value(gamma_limit_enable_checksum)->by_default(false)->as_bool(); // set to true by default for deltas due to trim, false on cartesians this->move_to_origin_after_home = THEKERNEL->config->value(move_to_origin_checksum)->by_default(is_delta)->as_bool(); if(this->limit_enable[X_AXIS] || this->limit_enable[Y_AXIS] || this->limit_enable[Z_AXIS]) { register_for_event(ON_IDLE); if(this->is_delta || this->is_rdelta) { // we must enable all the limits not just one this->limit_enable[X_AXIS] = true; this->limit_enable[Y_AXIS] = true; this->limit_enable[Z_AXIS] = true; } } // if(this->is_delta || this->is_rdelta) { // some things must be the same or they will die, so force it here to avoid config errors this->fast_rates[1] = this->fast_rates[2] = this->fast_rates[0]; this->slow_rates[1] = this->slow_rates[2] = this->slow_rates[0]; this->retract_mm[1] = this->retract_mm[2] = this->retract_mm[0]; this->home_direction[1] = this->home_direction[2] = this->home_direction[0]; // NOTE homing_position for rdelta is the angle of the actuator not the cartesian position if(!this->is_rdelta) this->homing_position[0] = this->homing_position[1] = 0; } }
void USB::on_module_loaded() { register_for_event(ON_IDLE); connect(); }
void Spindle::on_module_loaded() { last_time = 0; last_edge = 0; current_rpm = 0; current_I_value = 0; current_pwm_value = 0; time_since_update = 0; spindle_on = true; if (!THEKERNEL->config->value(spindle_enable_checksum)->by_default(false)->as_bool()) { delete this; // Spindle control module is disabled return; } pulses_per_rev = THEKERNEL->config->value(spindle_pulses_per_rev_checksum)->by_default(1.0f)->as_number(); target_rpm = THEKERNEL->config->value(spindle_default_rpm_checksum)->by_default(5000.0f)->as_number(); control_P_term = THEKERNEL->config->value(spindle_control_P_checksum)->by_default(0.0001f)->as_number(); control_I_term = THEKERNEL->config->value(spindle_control_I_checksum)->by_default(0.0001f)->as_number(); control_D_term = THEKERNEL->config->value(spindle_control_D_checksum)->by_default(0.0001f)->as_number(); // Smoothing value is low pass filter time constant in seconds. float smoothing_time = THEKERNEL->config->value(spindle_control_smoothing_checksum)->by_default(0.1f)->as_number(); if (smoothing_time * UPDATE_FREQ < 1.0f) smoothing_decay = 1.0f; else smoothing_decay = 1.0f / (UPDATE_FREQ * smoothing_time); // Get the pin for hardware pwm { Pin *smoothie_pin = new Pin(); smoothie_pin->from_string(THEKERNEL->config->value(spindle_pwm_pin_checksum)->by_default("nc")->as_string()); spindle_pin = smoothie_pin->as_output()->hardware_pwm(); output_inverted = smoothie_pin->is_inverting(); delete smoothie_pin; } if (spindle_pin == NULL) { THEKERNEL->streams->printf("Error: Spindle PWM pin must be P2.0-2.5 or other PWM pin\n"); delete this; return; } int period = THEKERNEL->config->value(spindle_pwm_period_checksum)->by_default(1000)->as_int(); spindle_pin->period_us(period); spindle_pin->write(output_inverted ? 1 : 0); // Get the pin for interrupt { Pin *smoothie_pin = new Pin(); smoothie_pin->from_string(THEKERNEL->config->value(spindle_feedback_pin_checksum)->by_default("nc")->as_string()); smoothie_pin->as_input(); if (smoothie_pin->port_number == 0 || smoothie_pin->port_number == 2) { PinName pinname = port_pin((PortName)smoothie_pin->port_number, smoothie_pin->pin); feedback_pin = new mbed::InterruptIn(pinname); feedback_pin->rise(this, &Spindle::on_pin_rise); NVIC_SetPriority(EINT3_IRQn, 16); } else { THEKERNEL->streams->printf("Error: Spindle feedback pin has to be on P0 or P2.\n"); delete this; return; } delete smoothie_pin; } THEKERNEL->slow_ticker->attach(UPDATE_FREQ, this, &Spindle::on_update_speed); register_for_event(ON_GCODE_RECEIVED); }