int main (void) { //TCCR0B = _BV(CS00); // no prescaler, timer running power_on(); while(1); while(true) { power_on(); _delay_ms(1000); power_off(); _delay_ms(1000); } }
// Once you're done, just type make and it should produce an executable // called <name of source file>.out int main() { // Initialize by connecting to the FPGA init_fpga(); // Power on the system power_on(); /* YOUR CODE GOES HERE */ sleep(2); // Pause for 2 seconds int x, y, z, d; // Get acceleration vector and depth get_accel(&x, &y, &z); d = get_depth(); printf("Acceleration is: (%d, %d, %d)\n", x, y, z); printf("Current depth is: %d\n", d); int p = get_power(); // Check if power is still on printf("Power system %s\n", p ? "is good": "has failed"); puts("Exiting..."); /* END */ // Power off and release resources exit_safe(); return 0; }
DSTATUS disk_initialize ( BYTE pdrv /* Physical drive nmuber (0) */ ) { if (pdrv) return STA_NOINIT; /* Supports only single drive */ power_off(); /* Power off */ Stat |= STA_NOINIT; if (Stat & STA_NODISK) return Stat; /* Exit if socket is empty */ power_on(); /* Initialize CFC control port and socket power on */ write_ata(REG_DEVCTRL, SRST); /* Set software reset */ delay_ms(20); write_ata(REG_DEVCTRL, 0); /* Release software reset */ delay_ms(20); if (!wait_stat(3000, 0)) return Stat; /* Select device 0 */ write_ata(REG_DEV, 0); if (!wait_stat(3000, DRDY)) return Stat; write_ata(REG_FEATURES, 0x03); /* Set default PIO mode wo IORDY */ write_ata(REG_COUNT, 0x01); write_ata(REG_COMMAND, CMD_SETFEATURES); if (!wait_stat(3000, DRDY)) return Stat; write_ata(REG_FEATURES, 0x01); /* Select 8-bit PIO transfer mode */ write_ata(REG_COMMAND, CMD_SETFEATURES); if (!wait_stat(1000, DRDY)) return Stat; Stat &= ~STA_NOINIT; /* Initialization succeeded */ return Stat; }
/* * Same as power_on(), but an external function. */ void term_pwron(void) { power_on(); fix_cpos; disptop = scrtop; deselect(); term_update(); }
void setup(){ pinMode(onModulePin, OUTPUT); Serial.begin(115200); printf("Starting...\n"); power_on(); delay(3000); // sets the PIN code sendATcommand("AT+CPIN=****", "OK", 2000); delay(3000); // sets APN, user name and password sendATcommand("AT+CGPSPWR=1", "OK", 2000); sendATcommand("AT+CGPSRST=0", "OK", 2000); // waits for fix GPS while( (sendATcommand("AT+CGPSSTATUS?", "2D Fix", 5000) || sendATcommand("AT+CGPSSTATUS?", "3D Fix", 5000)) == 0 ); }
void plus(void) { if(state < MAX_STATE) { state++; set_power(); }; if(state == 1) power_on(); full_power_leds(); };
int main(void) { //Setup IO ports PORTD=(1<<ENCA)|(1<<ENCB)|(1<<ENCSW); DDRC=(1<<LEDR)|(1<<LEDG)|(1<<LEDB); DDRB=(1<<PB2)|(1<<PB3)|(1<<PB5)|(1<<PWR_OUT); //Setup Timer 0 TCCR0=(1<<CS00);//Timer 0 on, clk/1 TIMSK=(1<<TOIE0); //Timer 0 interrupt enabled //Setup SPI SPCR=(1<<SPE)|(1<<MSTR); //Setup external interrupts MCUCR=(1<<ISC00)|(1<<ISC01); //Enable interrupt on INT0 rising edge GICR=(1<<INT0); //Enable INT0 external interrupt sei(); //Enable interrupts //Setup UART UBRRH=0; UBRRL=51; //For 9600bps UCSRB=(1<<RXEN)|(1<<TXEN)|(1<<RXCIE); //Enable rx,tx and rx interrupt UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //8-bit character size PORTB=(1<<CS)|(power<<PWR_OUT); send_pot_value(volume); while(1) { _delay_ms(1); if (!(PIND&(1<<ENCSW))) { //Encoder button pressed if (pressed==0) { pressed=1; } } else if (pressed==1) { //Button released pressed=0; if (precision_adj_on==0) { if (power==0) { power_on(); } else { power_off(); } } precision_adj_on=0; } if (command_ready) exec_command(); } }
DSTATUS disk_initialize ( BYTE drv /* Physical drive nmuber (0) */ ) { UINT cmd, n; DWORD resp[4]; BYTE ty; if (drv) return STA_NOINIT; /* Supports only single drive */ if (Stat & STA_NODISK) return Stat; /* No card in the socket */ power_on(); /* Force socket power on */ MCI_CLOCK = 0x100 | (PCLK/MCLK_ID/2-1); /* Set MCICLK = MCLK_ID */ for (Timer[0] = 2; Timer[0]; ); LEDR_ON(); send_cmd(CMD0, 0, 0, NULL); /* Enter idle state */ CardRCA = 0; /*---- Card is 'idle' state ----*/ Timer[0] = 1000; /* Initialization timeout of 1000 msec */ if (send_cmd(CMD8, 0x1AA, 1, resp) /* SDC Ver2 */ && (resp[0] & 0xFFF) == 0x1AA) { /* The card can work at vdd range of 2.7-3.6V */ do { /* Wait while card is busy state (use ACMD41 with HCS bit) */ if (!Timer[0]) goto di_fail; } while (!send_cmd(ACMD41, 0x40FF8000, 1, resp) || !(resp[0] & 0x80000000)); ty = (resp[0] & 0x40000000) ? CT_SD2 | CT_BLOCK : CT_SD2; /* Check CCS bit in the OCR */ } else { /* SDC Ver1 or MMC */ if (send_cmd(ACMD41, 0x00FF8000, 1, resp)) { ty = CT_SD1; cmd = ACMD41; /* ACMD41 is accepted -> SDC Ver1 */ } else { ty = CT_MMC; cmd = CMD1; /* ACMD41 is rejected -> MMC */ } do { /* Wait while card is busy state (use ACMD41 or CMD1) */ if (!Timer[0]) goto di_fail; } while (!send_cmd(cmd, 0x00FF8000, 1, resp) || !(resp[0] & 0x80000000)); } CardType = ty; /* Save card type */ bswap_cp(&CardInfo[32], resp); /* Save OCR */ /*---- Card is 'ready' state ----*/ if (!send_cmd(CMD2, 0, 2, resp)) goto di_fail; /* Enter ident state */ for (n = 0; n < 4; n++) bswap_cp(&CardInfo[n * 4 + 16], &resp[n]); /* Save CID */ /*---- Card is 'ident' state ----*/ if (ty & CT_SDC) { /* SDC: Get generated RCA and save it */ if (!send_cmd(CMD3, 0, 1, resp)) goto di_fail; CardRCA = (WORD)(resp[0] >> 16); } else { /* MMC: Assign RCA to the card */ if (!send_cmd(CMD3, 1 << 16, 1, resp)) goto di_fail;
void temp_set(uint16_t t, uint8_t sensor_number) { if (t) { steptimeout = 0; power_on(); } target_temp[sensor_number] = t; }
/* * Initialise the terminal. */ void term_init(void) { text = sbtop = scrtop = disptop = cpos = NULL; disptext = wanttext = NULL; tabs = NULL; selspace = NULL; deselect(); rows = cols = -1; nl_count = 0; power_on(); }
DSTATUS disk_initialize ( BYTE pdrv /* Physical drive nmuber (0) */ ) { BYTE n, cmd, ty, ocr[4]; if (pdrv) return STA_NOINIT; /* Supports only single drive */ power_off(); /* Turn off the socket power to reset the card */ power_on(); /* Turn on the socket power */ FCLK_SLOW(); for (n = 10; n; n--) xchg_spi(0xFF); /* 80 dummy clocks */ ty = 0; if (send_cmd(CMD0, 0) == 1) { /* Enter Idle state */ WORD wt = 1000; /* Initialization timeout of 1000 msec */ if (send_cmd(CMD8, 0x1AA) == 1) { /* SDv2? */ for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF); /* Get trailing return value of R7 resp */ if (ocr[2] == 0x01 && ocr[3] == 0xAA) { /* The card can work at vdd range of 2.7-3.6V */ do { if (!send_cmd(ACMD41, 1UL << 30)) break; /* Wait for leaving idle state (ACMD41 with HCS bit) */ delay_ms(1); } while (--wt); if (wt && send_cmd(CMD58, 0) == 0) { /* Check CCS bit in the OCR */ for (n = 0; n < 4; n++) ocr[n] = xchg_spi(0xFF); ty = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2; /* SDv2 */ } } } else { /* SDv1 or MMCv3 */ if (send_cmd(ACMD41, 0) <= 1) { ty = CT_SD1; cmd = ACMD41; /* SDv1 */ } else { ty = CT_MMC; cmd = CMD1; /* MMCv3 */ } do { if (!send_cmd(cmd,0)) break; delay_ms(1); } while (--wt); /* Wait for leaving idle state */ if (!wt || send_cmd(CMD16, 512) != 0) /* Set R/W block length to 512 */ ty = 0; } } CardType = ty; deselect(); if (ty) { /* Initialization succeded */ Stat &= ~STA_NOINIT; /* Clear STA_NOINIT */ FCLK_FAST(); } else { /* Initialization failed */ power_off(); } return Stat; }
static void init(void) { //Power Hold Driver_GPIO.Configure(3, GPIO_DIRECTION_OUTPUT_2MA, GPIO_EVENT_DISABLE, NULL); //UVDetect Driver_GPIO.Configure(4, GPIO_DIRECTION_INPUT_HI_Z, GPIO_EVENT_DISABLE, NULL); Driver_PMU.StandbyInputBuffer(PMU_IO_FUNC_GPIO_4, 0); /* UVdetect */ //LED Driver_GPIO.Configure(10, GPIO_DIRECTION_OUTPUT_2MA, GPIO_EVENT_DISABLE, NULL); Driver_GPIO.Configure(11, GPIO_DIRECTION_OUTPUT_2MA, GPIO_EVENT_DISABLE, NULL); power_on(); }
static void hdmi_bridge_pre_enable(struct drm_bridge *bridge) { struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge); struct hdmi *hdmi = hdmi_bridge->hdmi; struct hdmi_phy *phy = hdmi->phy; DBG("power up"); if (!hdmi_bridge->power_on) { power_on(bridge); hdmi_bridge->power_on = true; } phy->funcs->powerup(phy, hdmi_bridge->pixclock); hdmi_set_mode(hdmi, true); }
/** * Initialize the module. Initialize the following subsystems: * * - kernel debugging * - timer * - serial UART0 * - Bluetooth module * - AFSK driver * - KISS driver * * The AFSK module should be initialized after the startup banner is * printed to reduce the chance of a buffer overrun. */ static void init(void) { IRQ_ENABLE; kdbg_init(); timer_init(); power_on(); int hc_status = init_hc05(&ser.fd); wdt_location = 0; mobilinkd_set_error(MOBILINKD_ERROR_WATCHDOG_TIMEOUT); afsk_init(&afsk, ADC_CH, 0); wdt_location = 1; kiss_init(&kiss, &afsk.fd, &ser.fd); wdt_location = 2; if (kiss.params.options & KISS_OPTION_VIN_POWER_ON) { set_power_config(get_power_config() | POWER_ON_VIN_ON); } if (kiss.params.options & KISS_OPTION_VIN_POWER_OFF) { set_power_config(get_power_config() | POWER_OFF_VIN_OFF); } if (kiss.params.options & KISS_OPTION_PTT_SIMPLEX) { afsk_ptt_set(&afsk, AFSK_PTT_MODE_SIMPLEX); } else { afsk_ptt_set(&afsk, AFSK_PTT_MODE_MULTIPLEX); } power_on_message(hc_status); enable_power_off(); wdt_enable(WDTO_4S); }
void ActuatorOutputSubmarine::special_cmd(SPECIAL_COMMAND cmd) { switch(cmd) { case (SUB_POWER_ON): power_on(); break; case (SUB_STARTUP_SEQUENCE): SubmarineSingleton::get_instance().set_target_yaw(get_yaw()); SubmarineSingleton::get_instance().set_target_depth(get_depth()); startup_sequence(); break; case (SUB_MISSION_STARTUP_SEQUENCE): mission_startup_sequence(); break; case (SUB_POWER_OFF): power_off(); break; default: break; } }
void exec_command() { command_ready=0; uint8_t vol=0; if (uart_rx_buffer[0]=='v') { //change volume vol=(uart_rx_buffer[1]&0xF)*100; vol+=(uart_rx_buffer[2]&0xF)*10; vol+=(uart_rx_buffer[3]&0xF); volume=vol&255; set_volume(); write_uart_str("OK\r\n",4); } else if (uart_rx_buffer[0]=='o') { if (uart_rx_buffer[1]=='n') { power_on(); write_uart_str("OK\r\n",4); } else if (uart_rx_buffer[1]=='f'&&uart_rx_buffer[2]=='f') { power_off(); write_uart_str("OK\r\n",4); } } else if (uart_rx_buffer[0]=='g'&&uart_rx_buffer[1]=='e'&&uart_rx_buffer[2]=='t') { write_uart('O'); write_uart('K'); write_uart((volume/100)+'0'); write_uart(((volume/10)%10)+'0'); write_uart((volume%10)+'0'); write_uart('\r'); write_uart('\n'); } else { write_uart_str("NO\r\n",4); } uart_rx_buffer_idx=0; uart_rx_buffer[0]=0; }
static void hdmi_bridge_pre_enable(struct drm_bridge *bridge) { struct hdmi_bridge *hdmi_bridge = to_hdmi_bridge(bridge); struct hdmi *hdmi = hdmi_bridge->hdmi; struct hdmi_phy *phy = hdmi->phy; DBG("power up"); if (!hdmi->power_on) { power_on(bridge); hdmi->power_on = true; hdmi_audio_update(hdmi); } if (phy) phy->funcs->powerup(phy, hdmi->pixclock); hdmi_set_mode(hdmi, true); #ifdef CONFIG_DRM_MSM_HDCP if (hdmi->hdcp_ctrl) hdmi_hdcp_ctrl_on(hdmi->hdcp_ctrl); #endif }
/** \brief manually set PWM output \param index the heater we're setting the output for \param value the PWM value to write anything done by this function is overwritten by heater_tick above if the heater has an associated temp sensor */ void heater_set(heater_t index, uint8_t value) { if (index >= NUM_HEATERS) return; heaters_runtime[index].heater_output = value; if (heaters[index].heater_pwm) { *(heaters[index].heater_pwm) = heaters[index].invert ? (255 - value) : value; if (DEBUG_PID && (debug_flags & DEBUG_PID)) sersendf_P(PSTR("PWM{%u = %u}\n"), index, *heaters[index].heater_pwm); } else { if ((value >= HEATER_THRESHOLD && ! heaters[index].invert) || (value < HEATER_THRESHOLD && heaters[index].invert)) *(heaters[index].heater_port) |= MASK(heaters[index].heater_pin); else *(heaters[index].heater_port) &= ~MASK(heaters[index].heater_pin); } if (value) power_on(); }
void process_gcode_command() { uint32_t backup_f; // convert relative to absolute if (next_target.option_all_relative) { next_target.target.axis[X] += startpoint.axis[X]; next_target.target.axis[Y] += startpoint.axis[Y]; next_target.target.axis[Z] += startpoint.axis[Z]; } // E relative movement. // Matches Sprinter's behaviour as of March 2012. if (next_target.option_e_relative) next_target.target.e_relative = 1; else next_target.target.e_relative = 0; if (next_target.option_all_relative && !next_target.option_e_relative) next_target.target.axis[E] += startpoint.axis[E]; // implement axis limits #ifdef X_MIN if (next_target.target.axis[X] < (int32_t)(X_MIN * 1000.)) next_target.target.axis[X] = (int32_t)(X_MIN * 1000.); #endif #ifdef X_MAX if (next_target.target.axis[X] > (int32_t)(X_MAX * 1000.)) next_target.target.axis[X] = (int32_t)(X_MAX * 1000.); #endif #ifdef Y_MIN if (next_target.target.axis[Y] < (int32_t)(Y_MIN * 1000.)) next_target.target.axis[Y] = (int32_t)(Y_MIN * 1000.); #endif #ifdef Y_MAX if (next_target.target.axis[Y] > (int32_t)(Y_MAX * 1000.)) next_target.target.axis[Y] = (int32_t)(Y_MAX * 1000.); #endif #ifdef Z_MIN if (next_target.target.axis[Z] < (int32_t)(Z_MIN * 1000.)) next_target.target.axis[Z] = (int32_t)(Z_MIN * 1000.); #endif #ifdef Z_MAX if (next_target.target.axis[Z] > (int32_t)(Z_MAX * 1000.)) next_target.target.axis[Z] = (int32_t)(Z_MAX * 1000.); #endif // The GCode documentation was taken from http://reprap.org/wiki/Gcode . if (next_target.seen_T) { //? --- T: Select Tool --- //? //? Example: T1 //? //? Select extruder number 1 to build with. Extruder numbering starts at 0. next_tool = next_target.T; } if (next_target.seen_G) { uint8_t axisSelected = 0; switch (next_target.G) { case 0: //? G0: Rapid Linear Motion //? //? Example: G0 X12 //? //? In this case move rapidly to X = 12 mm. In fact, the RepRap firmware uses exactly the same code for rapid as it uses for controlled moves (see G1 below), as - for the RepRap machine - this is just as efficient as not doing so. (The distinction comes from some old machine tools that used to move faster if the axes were not driven in a straight line. For them G0 allowed any movement in space to get to the destination as fast as possible.) //? temp_wait(); backup_f = next_target.target.F; next_target.target.F = MAXIMUM_FEEDRATE_X * 2L; enqueue(&next_target.target); next_target.target.F = backup_f; break; case 1: //? --- G1: Linear Motion at Feed Rate --- //? //? Example: G1 X90.6 Y13.8 E22.4 //? //? Go in a straight line from the current (X, Y) point to the point (90.6, 13.8), extruding material as the move happens from the current extruded length to a length of 22.4 mm. //? temp_wait(); enqueue(&next_target.target); break; // G2 - Arc Clockwise // unimplemented // G3 - Arc Counter-clockwise // unimplemented case 4: //? --- G4: Dwell --- //? //? Example: G4 P200 //? //? In this case sit still doing nothing for 200 milliseconds. During delays the state of the machine (for example the temperatures of its extruders) will still be preserved and controlled. //? queue_wait(); // delay if (next_target.seen_P) { for (;next_target.P > 0;next_target.P--) { clock(); delay_ms(1); } } break; case 20: //? --- G20: Set Units to Inches --- //? //? Example: G20 //? //? Units from now on are in inches. //? next_target.option_inches = 1; break; case 21: //? --- G21: Set Units to Millimeters --- //? //? Example: G21 //? //? Units from now on are in millimeters. (This is the RepRap default.) //? next_target.option_inches = 0; break; case 28: //? --- G28: Home --- //? //? Example: G28 //? //? This causes the RepRap machine to search for its X, Y and Z //? endstops. It does so at high speed, so as to get there fast. When //? it arrives it backs off slowly until the endstop is released again. //? Backing off slowly ensures more accurate positioning. //? //? If you add axis characters, then just the axes specified will be //? seached. Thus //? //? G28 X Y72.3 //? //? will zero the X and Y axes, but not Z. Coordinate values are //? ignored. //? queue_wait(); if (next_target.seen_X) { #if defined X_MIN_PIN home_x_negative(); #elif defined X_MAX_PIN home_x_positive(); #endif axisSelected = 1; } if (next_target.seen_Y) { #if defined Y_MIN_PIN home_y_negative(); #elif defined Y_MAX_PIN home_y_positive(); #endif axisSelected = 1; } if (next_target.seen_Z) { #if defined Z_MIN_PIN home_z_negative(); #elif defined Z_MAX_PIN home_z_positive(); #endif axisSelected = 1; } // there's no point in moving E, as E has no endstops if (!axisSelected) { home(); } break; case 90: //? --- G90: Set to Absolute Positioning --- //? //? Example: G90 //? //? All coordinates from now on are absolute relative to the origin //? of the machine. This is the RepRap default. //? //? If you ever want to switch back and forth between relative and //? absolute movement keep in mind, X, Y and Z follow the machine's //? coordinate system while E doesn't change it's position in the //? coordinate system on relative movements. //? // No wait_queue() needed. next_target.option_all_relative = 0; break; case 91: //? --- G91: Set to Relative Positioning --- //? //? Example: G91 //? //? All coordinates from now on are relative to the last position. //? // No wait_queue() needed. next_target.option_all_relative = 1; break; case 92: //? --- G92: Set Position --- //? //? Example: G92 X10 E90 //? //? Allows programming of absolute zero point, by reseting the current position to the values specified. This would set the machine's X coordinate to 10, and the extrude coordinate to 90. No physical motion will occur. //? queue_wait(); if (next_target.seen_X) { startpoint.axis[X] = next_target.target.axis[X]; axisSelected = 1; } if (next_target.seen_Y) { startpoint.axis[Y] = next_target.target.axis[Y]; axisSelected = 1; } if (next_target.seen_Z) { startpoint.axis[Z] = next_target.target.axis[Z]; axisSelected = 1; } if (next_target.seen_E) { startpoint.axis[E] = next_target.target.axis[E]; axisSelected = 1; } if (axisSelected == 0) { startpoint.axis[X] = next_target.target.axis[X] = startpoint.axis[Y] = next_target.target.axis[Y] = startpoint.axis[Z] = next_target.target.axis[Z] = startpoint.axis[E] = next_target.target.axis[E] = 0; } dda_new_startpoint(); break; case 161: //? --- G161: Home negative --- //? //? Find the minimum limit of the specified axes by searching for the limit switch. //? #if defined X_MIN_PIN if (next_target.seen_X) home_x_negative(); #endif #if defined Y_MIN_PIN if (next_target.seen_Y) home_y_negative(); #endif #if defined Z_MIN_PIN if (next_target.seen_Z) home_z_negative(); #endif break; case 162: //? --- G162: Home positive --- //? //? Find the maximum limit of the specified axes by searching for the limit switch. //? #if defined X_MAX_PIN if (next_target.seen_X) home_x_positive(); #endif #if defined Y_MAX_PIN if (next_target.seen_Y) home_y_positive(); #endif #if defined Z_MAX_PIN if (next_target.seen_Z) home_z_positive(); #endif break; // unknown gcode: spit an error default: sersendf_P(PSTR("E: Bad G-code %d\n"), next_target.G); return; } } else if (next_target.seen_M) { uint8_t i; switch (next_target.M) { case 0: //? --- M0: machine stop --- //? //? Example: M0 //? //? http://linuxcnc.org/handbook/RS274NGC_3/RS274NGC_33a.html#1002379 //? Unimplemented, especially the restart after the stop. Fall trough to M2. //? case 2: case 84: // For compatibility with slic3rs default end G-code. //? --- M2: program end --- //? //? Example: M2 //? //? http://linuxcnc.org/handbook/RS274NGC_3/RS274NGC_33a.html#1002379 //? queue_wait(); for (i = 0; i < NUM_HEATERS; i++) temp_set(i, 0); power_off(); serial_writestr_P(PSTR("\nstop\n")); break; case 6: //? --- M6: tool change --- //? //? Undocumented. tool = next_tool; break; #ifdef SD case 20: //? --- M20: list SD card. --- sd_list("/"); break; case 21: //? --- M21: initialise SD card. --- //? //? Has to be done before doing any other operation, including M20. sd_mount(); break; case 22: //? --- M22: release SD card. --- //? //? Not mandatory. Just removing the card is fine, but results in //? odd behaviour when trying to read from the card anyways. M22 //? makes also sure SD card printing is disabled, even with the card //? inserted. sd_unmount(); break; case 23: //? --- M23: select file. --- //? //? This opens a file for reading. This file is valid up to M22 or up //? to the next M23. sd_open(gcode_str_buf); break; case 24: //? --- M24: start/resume SD print. --- //? //? This makes the SD card available as a G-code source. File is the //? one selected with M23. gcode_sources |= GCODE_SOURCE_SD; break; case 25: //? --- M25: pause SD print. --- //? //? This removes the SD card from the bitfield of available G-code //? sources. The file is kept open. The position inside the file //? is kept as well, to allow resuming. gcode_sources &= ! GCODE_SOURCE_SD; break; #endif /* SD */ case 82: //? --- M82 - Set E codes absolute --- //? //? This is the default and overrides G90/G91. //? M82/M83 is not documented in the RepRap wiki, behaviour //? was taken from Sprinter as of March 2012. //? //? While E does relative movements, it doesn't change its //? position in the coordinate system. See also comment on G90. //? // No wait_queue() needed. next_target.option_e_relative = 0; break; case 83: //? --- M83 - Set E codes relative --- //? //? Counterpart to M82. //? // No wait_queue() needed. next_target.option_e_relative = 1; break; // M3/M101- extruder on case 3: case 101: //? --- M101: extruder on --- //? //? Undocumented. temp_wait(); #ifdef DC_EXTRUDER heater_set(DC_EXTRUDER, DC_EXTRUDER_PWM); #endif break; // M5/M103- extruder off case 5: case 103: //? --- M103: extruder off --- //? //? Undocumented. #ifdef DC_EXTRUDER heater_set(DC_EXTRUDER, 0); #endif break; case 104: //? --- M104: Set Extruder Temperature (Fast) --- //? //? Example: M104 S190 //? //? Set the temperature of the current extruder to 190<sup>o</sup>C //? and return control to the host immediately (''i.e.'' before that //? temperature has been reached by the extruder). For waiting, see M116. //? //? Teacup supports an optional P parameter as a zero-based temperature //? sensor index to address (e.g. M104 P1 S100 will set the temperature //? of the heater connected to the second temperature sensor rather //? than the extruder temperature). //? if ( ! next_target.seen_S) break; if ( ! next_target.seen_P) #ifdef HEATER_EXTRUDER next_target.P = HEATER_EXTRUDER; #else next_target.P = 0; #endif temp_set(next_target.P, next_target.S); break; case 105: //? --- M105: Get Temperature(s) --- //? //? Example: M105 //? //? Request the temperature of the current extruder and the build base //? in degrees Celsius. For example, the line sent to the host in //? response to this command looks like //? //? <tt>ok T:201 B:117</tt> //? //? Teacup supports an optional P parameter as a zero-based temperature //? sensor index to address. //? #ifdef ENFORCE_ORDER queue_wait(); #endif if ( ! next_target.seen_P) next_target.P = TEMP_SENSOR_none; temp_print(next_target.P); break; case 7: case 106: //? --- M106: Set Fan Speed / Set Device Power --- //? //? Example: M106 S120 //? //? Control the cooling fan (if any). //? //? Teacup supports an optional P parameter as a zero-based heater //? index to address. The heater index can differ from the temperature //? sensor index, see config.h. #ifdef ENFORCE_ORDER // wait for all moves to complete queue_wait(); #endif if ( ! next_target.seen_P) #ifdef HEATER_FAN next_target.P = HEATER_FAN; #else next_target.P = 0; #endif if ( ! next_target.seen_S) break; heater_set(next_target.P, next_target.S); break; case 110: //? --- M110: Set Current Line Number --- //? //? Example: N123 M110 //? //? Set the current line number to 123. Thus the expected next line after this command will be 124. //? This is a no-op in Teacup. //? break; #ifdef DEBUG case 111: //? --- M111: Set Debug Level --- //? //? Example: M111 S6 //? //? Set the level of debugging information transmitted back to the host to level 6. The level is the OR of three bits: //? //? <Pre> //? #define DEBUG_PID 1 //? #define DEBUG_DDA 2 //? #define DEBUG_POSITION 4 //? </pre> //? //? This command is only available in DEBUG builds of Teacup. if ( ! next_target.seen_S) break; debug_flags = next_target.S; break; #endif /* DEBUG */ case 112: //? --- M112: Emergency Stop --- //? //? Example: M112 //? //? Any moves in progress are immediately terminated, then the printer //? shuts down. All motors and heaters are turned off. Only way to //? restart is to press the reset button on the master microcontroller. //? See also M0. //? timer_stop(); queue_flush(); power_off(); cli(); for (;;) wd_reset(); break; case 114: //? --- M114: Get Current Position --- //? //? Example: M114 //? //? This causes the RepRap machine to report its current X, Y, Z and E coordinates to the host. //? //? For example, the machine returns a string such as: //? //? <tt>ok C: X:0.00 Y:0.00 Z:0.00 E:0.00</tt> //? #ifdef ENFORCE_ORDER // wait for all moves to complete queue_wait(); #endif update_current_position(); sersendf_P(PSTR("X:%lq,Y:%lq,Z:%lq,E:%lq,F:%lu\n"), current_position.axis[X], current_position.axis[Y], current_position.axis[Z], current_position.axis[E], current_position.F); if (mb_tail_dda != NULL) { if (DEBUG_POSITION && (debug_flags & DEBUG_POSITION)) { sersendf_P(PSTR("Endpoint: X:%ld,Y:%ld,Z:%ld,E:%ld,F:%lu,c:%lu}\n"), mb_tail_dda->endpoint.axis[X], mb_tail_dda->endpoint.axis[Y], mb_tail_dda->endpoint.axis[Z], mb_tail_dda->endpoint.axis[E], mb_tail_dda->endpoint.F, #ifdef ACCELERATION_REPRAP mb_tail_dda->end_c #else mb_tail_dda->c #endif ); } print_queue(); } break; case 115: //? --- M115: Get Firmware Version and Capabilities --- //? //? Example: M115 //? //? Request the Firmware Version and Capabilities of the current microcontroller //? The details are returned to the host computer as key:value pairs separated by spaces and terminated with a linefeed. //? //? sample data from firmware: //? FIRMWARE_NAME:Teacup FIRMWARE_URL:http://github.com/traumflug/Teacup_Firmware/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:Mendel EXTRUDER_COUNT:1 TEMP_SENSOR_COUNT:1 HEATER_COUNT:1 //? sersendf_P(PSTR("FIRMWARE_NAME:Teacup FIRMWARE_URL:http://github.com/traumflug/Teacup_Firmware/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:Mendel EXTRUDER_COUNT:%d TEMP_SENSOR_COUNT:%d HEATER_COUNT:%d\n"), 1, NUM_TEMP_SENSORS, NUM_HEATERS); break; case 116: //? --- M116: Wait --- //? //? Example: M116 //? //? Wait for temperatures and other slowly-changing variables to arrive at their set values. temp_set_wait(); break; case 119: //? --- M119: report endstop status --- //? Report the current status of the endstops configured in the //? firmware to the host. power_on(); endstops_on(); delay_ms(10); // allow the signal to stabilize { #if ! (defined(X_MIN_PIN) || defined(X_MAX_PIN) || \ defined(Y_MIN_PIN) || defined(Y_MAX_PIN) || \ defined(Z_MIN_PIN) || defined(Z_MAX_PIN)) serial_writestr_P(PSTR("No endstops defined.")); #else const char* const open = PSTR("open "); const char* const triggered = PSTR("triggered "); #endif #if defined(X_MIN_PIN) serial_writestr_P(PSTR("x_min:")); x_min() ? serial_writestr_P(triggered) : serial_writestr_P(open); #endif #if defined(X_MAX_PIN) serial_writestr_P(PSTR("x_max:")); x_max() ? serial_writestr_P(triggered) : serial_writestr_P(open); #endif #if defined(Y_MIN_PIN) serial_writestr_P(PSTR("y_min:")); y_min() ? serial_writestr_P(triggered) : serial_writestr_P(open); #endif #if defined(Y_MAX_PIN) serial_writestr_P(PSTR("y_max:")); y_max() ? serial_writestr_P(triggered) : serial_writestr_P(open); #endif #if defined(Z_MIN_PIN) serial_writestr_P(PSTR("z_min:")); z_min() ? serial_writestr_P(triggered) : serial_writestr_P(open); #endif #if defined(Z_MAX_PIN) serial_writestr_P(PSTR("z_max:")); z_max() ? serial_writestr_P(triggered) : serial_writestr_P(open); #endif } endstops_off(); serial_writechar('\n'); break; #ifdef EECONFIG case 130: //? --- M130: heater P factor --- //? Undocumented. // P factor in counts per degreeC of error if ( ! next_target.seen_P) #ifdef HEATER_EXTRUDER next_target.P = HEATER_EXTRUDER; #else next_target.P = 0; #endif if (next_target.seen_S) pid_set_p(next_target.P, next_target.S); break; case 131: //? --- M131: heater I factor --- //? Undocumented. // I factor in counts per C*s of integrated error if ( ! next_target.seen_P) #ifdef HEATER_EXTRUDER next_target.P = HEATER_EXTRUDER; #else next_target.P = 0; #endif if (next_target.seen_S) pid_set_i(next_target.P, next_target.S); break; case 132: //? --- M132: heater D factor --- //? Undocumented. // D factor in counts per degreesC/second if ( ! next_target.seen_P) #ifdef HEATER_EXTRUDER next_target.P = HEATER_EXTRUDER; #else next_target.P = 0; #endif if (next_target.seen_S) pid_set_d(next_target.P, next_target.S); break; case 133: //? --- M133: heater I limit --- //? Undocumented. if ( ! next_target.seen_P) #ifdef HEATER_EXTRUDER next_target.P = HEATER_EXTRUDER; #else next_target.P = 0; #endif if (next_target.seen_S) pid_set_i_limit(next_target.P, next_target.S); break; case 134: //? --- M134: save PID settings to eeprom --- //? Undocumented. heater_save_settings(); break; #endif /* EECONFIG */ #ifdef DEBUG case 136: //? --- M136: PRINT PID settings to host --- //? Undocumented. //? This comand is only available in DEBUG builds. if ( ! next_target.seen_P) #ifdef HEATER_EXTRUDER next_target.P = HEATER_EXTRUDER; #else next_target.P = 0; #endif heater_print(next_target.P); break; #endif /* DEBUG */ case 140: //? --- M140: Set heated bed temperature --- //? Undocumented. #ifdef HEATER_BED if ( ! next_target.seen_S) break; temp_set(HEATER_BED, next_target.S); #endif break; case 220: //? --- M220: Set speed factor override percentage --- if ( ! next_target.seen_S) break; // Scale 100% = 256 next_target.target.f_multiplier = (next_target.S * 64 + 12) / 25; break; case 221: //? --- M221: Control the extruders flow --- if ( ! next_target.seen_S) break; // Scale 100% = 256 next_target.target.e_multiplier = (next_target.S * 64 + 12) / 25; break; #ifdef DEBUG case 240: //? --- M240: echo off --- //? Disable echo. //? This command is only available in DEBUG builds. debug_flags &= ~DEBUG_ECHO; serial_writestr_P(PSTR("Echo off\n")); break; case 241: //? --- M241: echo on --- //? Enable echo. //? This command is only available in DEBUG builds. debug_flags |= DEBUG_ECHO; serial_writestr_P(PSTR("Echo on\n")); break; #endif /* DEBUG */ // unknown mcode: spit an error default: sersendf_P(PSTR("E: Bad M-code %d\n"), next_target.M); } // switch (next_target.M) } // else if (next_target.seen_M) } // process_gcode_command()
void set_power(void) { saved = 0; if(state == 0) power_off(); else if(state >= 1) power_on(); OCR1A=state*43; };
static int tft_panel_resume(struct platform_device *p_dev) { power_on(g_plt_data); return 0; }
int get_command(pState state){ //magic len command subcommand data checkval //message is len + 8 (2 magic, 2 len, 4 checkval) //magic = 0xa55a, short len, short command, var subcommand, var data, int checkval // unsigned char *buf = malloc(MAX_MESSAGE_LEN+8); unsigned char buf[MAX_MESSAGE_LEN+8]; unsigned int checkval = 0; unsigned int calc_checkval = 0; unsigned short magic = 0; unsigned short len = 0; unsigned short command = 0xaa; unsigned short subcommand = 0xffff; unsigned short sensorID = 0xffff; unsigned int sensor_address = 0xffff; unsigned int coefficient = 0xffff; unsigned short temp = 0xffff; unsigned short numSteps = 0xffff; unsigned short *tempP = NULL; unsigned short seconds = 0; pStep steps = NULL; int ret = -1; unsigned int fw = 0; bzero(buf,MAX_MESSAGE_LEN+8); //get magic get_bytes(buf ,2); magic = get_short(buf); if (magic != MAGIC){ prime_buf(buf); send(buf,12); //free(buf); return 1; } //get len get_bytes(buf+2,2); len = get_short(buf+2); //check len if (len > MAX_MESSAGE_LEN){ prime_buf(buf); send(buf,12); //free(buf); return 1; } //get the rest of message except checkval get_bytes(buf+4, len); //get checkval checkval = get_int(buf+len); //compare to calculated from message calc_checkval = check_val( buf, len); if ( checkval != calc_checkval ){ //bad check_val prime_buf(buf); send(buf,12); //free(buf); return 1; } //get command command = get_short(buf+4); switch (command) { case 1:{ //set power state subcommand = get_short(buf+6); prime_buf(buf); if (subcommand == 0x0000){ power_off(state); } if (subcommand == 0x0001){ power_on(state); } if (subcommand > 0x0001){ //bad subcommand } send(buf, 12); break; } case 2:{//set temp temp = get_short(buf+6); prime_buf(buf); if (set_temp(state,temp) == 2){ buf[6] = 1; } send(buf, 12); break; } case 3:{ //add sensor sensorID = get_short(buf+6); sensor_address = get_int(buf+8); coefficient = get_int(buf+12); unsigned int sensorTemp = get_int(buf+16); //check count < 10 buf[6] = 0x08, sensor_ID is unique/not in use buf[6] = 0x07, ret = add_sensor(state, sensorID, sensor_address, coefficient, sensorTemp); prime_buf(buf); if (ret == 2){buf[6]=0x07;} if (ret == 3){buf[6]=0x08;} send(buf, 12); break; } case 4:{ //remove sensor sensorID = get_short(buf+6); ret = remove_sensor(state,sensorID); prime_buf(buf); if (ret == 1){buf[6]=0x06;} send(buf, 12); break; } case 5:{ //set smoke sensor subcommand = get_short(buf+6); prime_buf(buf); if (subcommand == 0x0000){ smoke_off(state); } if (subcommand == 0x0001){ smoke_on(state); } if (subcommand > 0x0001){ //bad subcommand //no response } send(buf, 12); break; } case 6:{ //set program numSteps = get_short(buf+6); steps = (pStep)(buf+8) ; ret = add_steps(state,numSteps,steps); prime_buf(buf); if (ret == 3){buf[6]=3;} if (ret == 2){buf[6]=2;} if (ret == 1){buf[6]=1;} send(buf, 12); break; } case 7:{//get program prime_buf(buf); unsigned int lenz = 0; unsigned int program[30]; bzero(program,120); buf[4]=1; buf[6]=7; get_program(state, &lenz, program); lenz = lenz*3*sizeof(int); cgc_memcpy(buf+8,&lenz,sizeof(int)); cgc_memcpy(buf+12,program,lenz); send(buf,lenz + 12); break; } case 8:{//get status prime_buf(buf); buf[4]=1; buf[6]=8; unsigned int status[6]; int len = 24; ret = get_status(state,status); cgc_memcpy(buf+8,&len,sizeof(int)); cgc_memcpy(buf+12,status,24); send(buf,36); break; } case 9:{//simulate seconds seconds = get_short(buf+6); prime_buf(buf); unsigned int bufsize = 12; unsigned int histSize = 0; ret = simulate_seconds(state, seconds); unsigned int currentTime = state->currentTime; unsigned int setTemp = state->setTemp; if (ret == 0 ){ buf[6] = 9; cgc_memcpy(buf+8, ¤tTime ,sizeof(int)); send(buf,12); } if(ret == 2){ buf[4] = 1; buf[6] = 0xc; histSize = state->historyPosition*sizeof(int); unsigned int *pHistoryList = state->history; unsigned int historyListSize = state->historyPosition; unsigned int ambientTemp = state->ambientTemp; new_state(state); if (historyListSize > 0){ cgc_memcpy(buf+8, &historyListSize, sizeof(historyListSize)); cgc_memcpy(buf+12, pHistoryList, histSize); bufsize = histSize + 12; } cgc_memcpy(buf+bufsize, &ambientTemp, sizeof(unsigned int)); bufsize+=4; cgc_memcpy(buf+bufsize, &setTemp, sizeof(unsigned int)); bufsize+=4; send(buf, bufsize); //new_state(state); } break; } case 0xa:{ //validate firmware unsigned int fw = validate_fw(state); prime_buf(buf); buf[4]=1; buf[6]=0xa; buf[8]=4; cgc_memcpy(buf+12, &fw,sizeof(int) ); send(buf, 16); break; } case 0xb:{//cgc_read sensor list prime_buf(buf); int len = 0; buf[4]=1; buf[6]=0xb; len = state->sensorCount * (sizeof(int)*4); //buff is filled with sensor bytes unsigned int sensorList[40*sizeof(int)]; get_sensors(state,sensorList); cgc_memcpy(buf+8,&len,sizeof(int)); cgc_memcpy(buf+12,sensorList,len); send(buf, len+12); break; } case 0xc:{//set ambient temp int ambientTemp = get_signed_int(buf+6); prime_buf(buf); if (set_ambient_temp(state,ambientTemp) == 2){ buf[6] = 1; } send(buf, 12); break; } case 0xff:{ //free(buf); exit_normal(); break; } default:{ //bad command prime_buf(buf); buf[6]=5; send(buf,12); break; } } // free(buf); return 0; }
static void tft_panel_late_resume(struct early_suspend *h) { power_on(g_plt_data); }
void dda_create(DDA *dda, TARGET *target) { uint32_t distance, c_limit, c_limit_calc; // initialise DDA to a known state dda->allflags = 0; if (debug_flags & DEBUG_DDA) serial_writestr_P(PSTR("\n{DDA_CREATE: [")); // we end at the passed target memcpy(&(dda->endpoint), target, sizeof(TARGET)); dda->x_delta = ABS(target->X - startpoint.X); dda->y_delta = ABS(target->Y - startpoint.Y); dda->z_delta = ABS(target->Z - startpoint.Z); dda->e_delta = ABS(target->E - startpoint.E); dda->x_direction = (target->X >= startpoint.X)?1:0; dda->y_direction = (target->Y >= startpoint.Y)?1:0; dda->z_direction = (target->Z >= startpoint.Z)?1:0; dda->e_direction = (target->E >= startpoint.E)?1:0; if (debug_flags & DEBUG_DDA) { if (dda->x_direction == 0) serial_writechar('-'); serwrite_uint32(dda->x_delta); serial_writechar(','); if (dda->y_direction == 0) serial_writechar('-'); serwrite_uint32(dda->y_delta); serial_writechar(','); if (dda->z_direction == 0) serial_writechar('-'); serwrite_uint32(dda->z_delta); serial_writechar(','); if (dda->e_direction == 0) serial_writechar('-'); serwrite_uint32(dda->e_delta); serial_writestr_P(PSTR("] [")); } dda->total_steps = dda->x_delta; if (dda->y_delta > dda->total_steps) dda->total_steps = dda->y_delta; if (dda->z_delta > dda->total_steps) dda->total_steps = dda->z_delta; if (dda->e_delta > dda->total_steps) dda->total_steps = dda->e_delta; if (debug_flags & DEBUG_DDA) { serial_writestr_P(PSTR("ts:")); serwrite_uint32(dda->total_steps); } if (dda->total_steps == 0) { dda->nullmove = 1; } else { // get steppers ready to go steptimeout = 0; power_on(); dda->x_counter = dda->y_counter = dda->z_counter = dda->e_counter = -(dda->total_steps >> 1); // since it's unusual to combine X, Y and Z changes in a single move on reprap, check if we can use simpler approximations before trying the full 3d approximation. if (dda->z_delta == 0) distance = approx_distance(dda->x_delta * UM_PER_STEP_X, dda->y_delta * UM_PER_STEP_Y); else if (dda->x_delta == 0 && dda->y_delta == 0) distance = dda->z_delta * UM_PER_STEP_Z; else distance = approx_distance_3(dda->x_delta * UM_PER_STEP_X, dda->y_delta * UM_PER_STEP_Y, dda->z_delta * UM_PER_STEP_Z); if (distance < 2) distance = dda->e_delta * UM_PER_STEP_E; if (debug_flags & DEBUG_DDA) { serial_writestr_P(PSTR(",ds:")); serwrite_uint32(distance); } // pre-calculate move speed in millimeter microseconds per step minute for less math in interrupt context // mm (distance) * 60000000 us/min / step (total_steps) = mm.us per step.min // note: um (distance) * 60000 == mm * 60000000 // so in the interrupt we must simply calculate // mm.us per step.min / mm per min (F) = us per step // break this calculation up a bit and lose some precision because 300,000um * 60000 is too big for a uint32 // calculate this with a uint64 if you need the precision, but it'll take longer so routines with lots of short moves may suffer // 2^32/6000 is about 715mm which should be plenty // changed * 10 to * (F_CPU / 100000) so we can work in cpu_ticks rather than microseconds. // timer.c setTimer() routine altered for same reason // changed distance * 6000 .. * F_CPU / 100000 to // distance * 2400 .. * F_CPU / 40000 so we can move a distance of up to 1800mm without overflowing uint32_t move_duration = ((distance * 2400) / dda->total_steps) * (F_CPU / 40000); // similarly, find out how fast we can run our axes. // do this for each axis individually, as the combined speed of two or more axes can be higher than the capabilities of a single one. c_limit = 0; c_limit_calc = ( (dda->x_delta * (UM_PER_STEP_X * 2400L)) / dda->total_steps * (F_CPU / 40000) / MAXIMUM_FEEDRATE_X) << 8; if (c_limit_calc > c_limit) c_limit = c_limit_calc; c_limit_calc = ( (dda->y_delta * (UM_PER_STEP_Y * 2400L)) / dda->total_steps * (F_CPU / 40000) / MAXIMUM_FEEDRATE_Y) << 8; if (c_limit_calc > c_limit) c_limit = c_limit_calc; c_limit_calc = ( (dda->z_delta * (UM_PER_STEP_Z * 2400L)) / dda->total_steps * (F_CPU / 40000) / MAXIMUM_FEEDRATE_Z) << 8; if (c_limit_calc > c_limit) c_limit = c_limit_calc; c_limit_calc = ( (dda->e_delta * (UM_PER_STEP_E * 2400L)) / dda->total_steps * (F_CPU / 40000) / MAXIMUM_FEEDRATE_E) << 8; if (c_limit_calc > c_limit) c_limit = c_limit_calc; #ifdef ACCELERATION_REPRAP // c is initial step time in IOclk ticks dda->c = (move_duration / startpoint.F) << 8; if (dda->c < c_limit) dda->c = c_limit; dda->end_c = (move_duration / target->F) << 8; if (dda->end_c < c_limit) dda->end_c = c_limit; if (debug_flags & DEBUG_DDA) { serial_writestr_P(PSTR(",md:")); serwrite_uint32(move_duration); serial_writestr_P(PSTR(",c:")); serwrite_uint32(dda->c >> 8); } if (dda->c != dda->end_c) { uint32_t stF = startpoint.F / 4; uint32_t enF = target->F / 4; // now some constant acceleration stuff, courtesy of http://www.embedded.com/columns/technicalinsights/56800129?printable=true uint32_t ssq = (stF * stF); uint32_t esq = (enF * enF); int32_t dsq = (int32_t) (esq - ssq) / 4; uint8_t msb_ssq = msbloc(ssq); uint8_t msb_tot = msbloc(dda->total_steps); // the raw equation WILL overflow at high step rates, but 64 bit math routines take waay too much space // at 65536 mm/min (1092mm/s), ssq/esq overflows, and dsq is also close to overflowing if esq/ssq is small // but if ssq-esq is small, ssq/dsq is only a few bits // we'll have to do it a few different ways depending on the msb locations of each if ((msb_tot + msb_ssq) <= 30) { // we have room to do all the multiplies first if (debug_flags & DEBUG_DDA) serial_writechar('A'); dda->n = ((int32_t) (dda->total_steps * ssq) / dsq) + 1; } else if (msb_tot >= msb_ssq) { // total steps has more precision if (debug_flags & DEBUG_DDA) serial_writechar('B'); dda->n = (((int32_t) dda->total_steps / dsq) * (int32_t) ssq) + 1; } else { // otherwise if (debug_flags & DEBUG_DDA) serial_writechar('C'); dda->n = (((int32_t) ssq / dsq) * (int32_t) dda->total_steps) + 1; } if (debug_flags & DEBUG_DDA) { sersendf_P(PSTR("\n{DDA:CA end_c:%lu, n:%ld, md:%lu, ssq:%lu, esq:%lu, dsq:%lu, msbssq:%u, msbtot:%u}\n"), (long unsigned int)dda->end_c >> 8, (long int)dda->n, (long unsigned int)move_duration, (long unsigned int)ssq, (long unsigned int)esq, (long unsigned int)dsq, msb_ssq, msb_tot); }
enum power_state power_handle_state(enum power_state state) { int value; static int boot_from_g3; switch (state) { case POWER_G3: boot_from_g3 = check_for_power_on_event(); if (boot_from_g3) return POWER_G3S5; break; case POWER_G3S5: return POWER_S5; case POWER_S5: if (boot_from_g3) { value = boot_from_g3; boot_from_g3 = 0; } else { value = check_for_power_on_event(); } if (value) { CPRINTS("power on %d", value); return POWER_S5S3; } return state; case POWER_S5S3: hook_notify(HOOK_CHIPSET_PRE_INIT); power_on(); disable_sleep(SLEEP_MASK_AP_RUN); powerled_set_state(POWERLED_STATE_ON); if (power_wait_signals(IN_POWER_GOOD) == EC_SUCCESS) { CPRINTS("POWER_GOOD seen"); if (power_button_wait_for_release( DELAY_SHUTDOWN_ON_POWER_HOLD) == EC_SUCCESS) { power_button_was_pressed = 0; set_pmic_pwron(0); /* setup misc gpio for S3/S0 functionality */ gpio_set_flags(GPIO_SUSPEND_L, GPIO_INPUT | GPIO_INT_BOTH | GPIO_PULL_DOWN); gpio_set_flags(GPIO_EC_INT_L, GPIO_OUTPUT | GPIO_OUT_HIGH); /* Call hooks now that AP is running */ hook_notify(HOOK_CHIPSET_STARTUP); return POWER_S3; } else { CPRINTS("long-press button, shutdown"); power_off(); /* * Since the AP may be up already, return S0S3 * state to go through the suspend hook. */ return POWER_S0S3; } } else { CPRINTS("POWER_GOOD not seen in time"); } chipset_turn_off_power_rails(); return POWER_S5; case POWER_S3: if (!(power_get_signals() & IN_POWER_GOOD)) return POWER_S3S5; else if (!(power_get_signals() & IN_SUSPEND)) return POWER_S3S0; return state; case POWER_S3S0: powerled_set_state(POWERLED_STATE_ON); hook_notify(HOOK_CHIPSET_RESUME); return POWER_S0; case POWER_S0: value = check_for_power_off_event(); if (value) { CPRINTS("power off %d", value); power_off(); return POWER_S0S3; } else if (power_get_signals() & IN_SUSPEND) return POWER_S0S3; return state; case POWER_S0S3: if (lid_is_open()) powerled_set_state(POWERLED_STATE_SUSPEND); else powerled_set_state(POWERLED_STATE_OFF); /* Call hooks here since we don't know it prior to AP suspend */ hook_notify(HOOK_CHIPSET_SUSPEND); return POWER_S3; case POWER_S3S5: power_button_wait_for_release(-1); power_button_was_pressed = 0; return POWER_S5; case POWER_S5G3: return POWER_G3; } return state; }
/* * Remove everything currently in `inbuf' and stick it up on the * in-memory display. There's a big state machine in here to * process escape sequences... */ void term_out(void) { int c; int must_update = FALSE; while ( (c = inbuf_getc()) != -1) { #ifdef LOG { static FILE *fp = NULL; if (!fp) fp = fopen("putty.log", "wb"); if (fp) fputc (c, fp); } #endif switch (termstate) { case TOPLEVEL: do_toplevel: switch (c) { case '\005': /* terminal type query */ ldisc->send ("\033[?1;2c", 7); break; case '\007': beep(); disptop = scrtop; must_update = TRUE; break; case '\b': if (curs_x == 0 && curs_y > 0) curs_x = cols-1, curs_y--; else if (wrapnext) wrapnext = FALSE; else curs_x--; fix_cpos; disptop = scrtop; must_update = TRUE; break; case '\016': cset = 1; break; case '\017': cset = 0; break; case '\033': termstate = SEEN_ESC; break; case 0233: termstate = SEEN_CSI; esc_nargs = 1; esc_args[0] = ARG_DEFAULT; esc_query = FALSE; break; case 0235: termstate = SEEN_OSC; esc_args[0] = 0; break; case '\r': curs_x = 0; wrapnext = FALSE; fix_cpos; disptop = scrtop; must_update = TRUE; break; case '\013': case '\014': case '\n': if (curs_y == marg_b) scroll (marg_t, marg_b, 1, TRUE); else if (curs_y < rows-1) curs_y++; if (cfg.lfhascr) curs_x = 0; fix_cpos; wrapnext = FALSE; disptop = scrtop; nl_count++; break; case '\t': do { curs_x++; } while (curs_x < cols-1 && !tabs[curs_x]); if (curs_x >= cols) curs_x = cols-1; { unsigned long *old_cpos = cpos; fix_cpos; check_selection (old_cpos, cpos); } disptop = scrtop; must_update = TRUE; break; default: if (c >= ' ' && c != 0234) { if (wrapnext) { cpos[1] = ATTR_WRAPPED; if (curs_y == marg_b) scroll (marg_t, marg_b, 1, TRUE); else if (curs_y < rows-1) curs_y++; curs_x = 0; fix_cpos; wrapnext = FALSE; nl_count++; } if (insert) insch (1); check_selection (cpos, cpos+1); *cpos++ = xlat_tty2scr((unsigned char)c) | curr_attr | (c <= 0x7F ? cset_attr[cset] : ATTR_ASCII); curs_x++; if (curs_x == cols) { cpos--; curs_x--; wrapnext = wrap; } disptop = scrtop; } } break; case IGNORE_NEXT: termstate = TOPLEVEL; break; case OSC_MAYBE_ST: /* * This state is virtually identical to SEEN_ESC, with the * exception that we have an OSC sequence in the pipeline, * and _if_ we see a backslash, we process it. */ if (c == '\\') { do_osc(); termstate = TOPLEVEL; break; } /* else fall through */ case SEEN_ESC: termstate = TOPLEVEL; switch (c) { case '\005': case '\007': case '\b': case '\016': case '\017': case '\033': case 0233: case 0234: case 0235: case '\r': case '\013': case '\014': case '\n': case '\t': termstate = TOPLEVEL; goto do_toplevel; /* hack... */ case ' ': /* some weird sequence? */ termstate = IGNORE_NEXT; break; case '[': /* enter CSI mode */ termstate = SEEN_CSI; esc_nargs = 1; esc_args[0] = ARG_DEFAULT; esc_query = FALSE; break; case ']': /* xterm escape sequences */ termstate = SEEN_OSC; esc_args[0] = 0; break; case '(': /* should set GL */ termstate = SET_GL; break; case ')': /* should set GR */ termstate = SET_GR; break; case '7': /* save cursor */ save_cursor (TRUE); break; case '8': /* restore cursor */ save_cursor (FALSE); disptop = scrtop; must_update = TRUE; break; case '=': app_keypad_keys = TRUE; break; case '>': app_keypad_keys = FALSE; break; case 'D': /* exactly equivalent to LF */ if (curs_y == marg_b) scroll (marg_t, marg_b, 1, TRUE); else if (curs_y < rows-1) curs_y++; fix_cpos; wrapnext = FALSE; disptop = scrtop; nl_count++; break; case 'E': /* exactly equivalent to CR-LF */ curs_x = 0; wrapnext = FALSE; if (curs_y == marg_b) scroll (marg_t, marg_b, 1, TRUE); else if (curs_y < rows-1) curs_y++; fix_cpos; wrapnext = FALSE; nl_count++; disptop = scrtop; break; case 'M': /* reverse index - backwards LF */ if (curs_y == marg_t) scroll (marg_t, marg_b, -1, TRUE); else if (curs_y > 0) curs_y--; fix_cpos; wrapnext = FALSE; disptop = scrtop; must_update = TRUE; break; case 'Z': /* terminal type query */ ldisc->send ("\033[?6c", 5); break; case 'c': /* restore power-on settings */ power_on(); fix_cpos; disptop = scrtop; must_update = TRUE; break; case '#': /* ESC # 8 fills screen with Es :-) */ termstate = SEEN_ESCHASH; break; case 'H': /* set a tab */ tabs[curs_x] = TRUE; break; } break; case SEEN_CSI: termstate = TOPLEVEL; /* default */ switch (c) { case '\005': case '\007': case '\b': case '\016': case '\017': case '\033': case 0233: case 0234: case 0235: case '\r': case '\013': case '\014': case '\n': case '\t': termstate = TOPLEVEL; goto do_toplevel; /* hack... */ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': if (esc_nargs <= ARGS_MAX) { if (esc_args[esc_nargs-1] == ARG_DEFAULT) esc_args[esc_nargs-1] = 0; esc_args[esc_nargs-1] = 10 * esc_args[esc_nargs-1] + c - '0'; } termstate = SEEN_CSI; break; case ';': if (++esc_nargs <= ARGS_MAX) esc_args[esc_nargs-1] = ARG_DEFAULT; termstate = SEEN_CSI; break; case '?': esc_query = TRUE; termstate = SEEN_CSI; break; case 'A': /* move up N lines */ move (curs_x, curs_y - def(esc_args[0], 1), 1); disptop = scrtop; must_update = TRUE; break; case 'B': case 'e': /* move down N lines */ move (curs_x, curs_y + def(esc_args[0], 1), 1); disptop = scrtop; must_update = TRUE; break; case 'C': case 'a': /* move right N cols */ move (curs_x + def(esc_args[0], 1), curs_y, 1); disptop = scrtop; must_update = TRUE; break; case 'D': /* move left N cols */ move (curs_x - def(esc_args[0], 1), curs_y, 1); disptop = scrtop; must_update = TRUE; break; case 'E': /* move down N lines and CR */ move (0, curs_y + def(esc_args[0], 1), 1); disptop = scrtop; must_update = TRUE; break; case 'F': /* move up N lines and CR */ move (0, curs_y - def(esc_args[0], 1), 1); disptop = scrtop; must_update = TRUE; break; case 'G': case '`': /* set horizontal posn */ move (def(esc_args[0], 1) - 1, curs_y, 0); disptop = scrtop; must_update = TRUE; break; case 'd': /* set vertical posn */ move (curs_x, (dec_om ? marg_t : 0) + def(esc_args[0], 1) - 1, (dec_om ? 2 : 0)); disptop = scrtop; must_update = TRUE; break; case 'H': case 'f': /* set horz and vert posns at once */ if (esc_nargs < 2) esc_args[1] = ARG_DEFAULT; move (def(esc_args[1], 1) - 1, (dec_om ? marg_t : 0) + def(esc_args[0], 1) - 1, (dec_om ? 2 : 0)); disptop = scrtop; must_update = TRUE; break; case 'J': /* erase screen or parts of it */ { unsigned int i = def(esc_args[0], 0) + 1; if (i > 3) i = 0; erase_lots(FALSE, !!(i & 2), !!(i & 1)); } disptop = scrtop; must_update = TRUE; break; case 'K': /* erase line or parts of it */ { unsigned int i = def(esc_args[0], 0) + 1; if (i > 3) i = 0; erase_lots(TRUE, !!(i & 2), !!(i & 1)); } disptop = scrtop; must_update = TRUE; break; case 'L': /* insert lines */ if (curs_y <= marg_b) scroll (curs_y, marg_b, -def(esc_args[0], 1), FALSE); disptop = scrtop; must_update = TRUE; break; case 'M': /* delete lines */ if (curs_y <= marg_b) scroll (curs_y, marg_b, def(esc_args[0], 1), FALSE); disptop = scrtop; must_update = TRUE; break; case '@': /* insert chars */ insch (def(esc_args[0], 1)); disptop = scrtop; must_update = TRUE; break; case 'P': /* delete chars */ insch (-def(esc_args[0], 1)); disptop = scrtop; must_update = TRUE; break; case 'c': /* terminal type query */ ldisc->send ("\033[?6c", 5); break; case 'n': /* cursor position query */ if (esc_args[0] == 6) { char buf[32]; sprintf (buf, "\033[%d;%dR", curs_y + 1, curs_x + 1); ldisc->send (buf, strlen(buf)); } break; case 'h': /* toggle a mode to high */ toggle_mode (esc_args[0], esc_query, TRUE); break; case 'l': /* toggle a mode to low */ toggle_mode (esc_args[0], esc_query, FALSE); break; case 'g': /* clear tabs */ if (esc_nargs == 1) { if (esc_args[0] == 0) { tabs[curs_x] = FALSE; } else if (esc_args[0] == 3) { int i; for (i = 0; i < cols; i++) tabs[i] = FALSE; } } break; case 'r': /* set scroll margins */ if (!esc_query && esc_nargs <= 2) { int top, bot; top = def(esc_args[0], 1) - 1; if (top < 0) top = 0; bot = (esc_nargs <= 1 || esc_args[1] == 0 ? rows : def(esc_args[1], rows)) - 1; if (bot >= rows) bot = rows-1; if (top <= bot) { marg_t = top; marg_b = bot; curs_x = 0; /* * I used to think the cursor should be * placed at the top of the newly marginned * area. Apparently not: VMS TPU falls over * if so. */ curs_y = 0; fix_cpos; disptop = scrtop; must_update = TRUE; } } break; case 'm': /* set graphics rendition */ { int i; for (i=0; i<esc_nargs; i++) { switch (def(esc_args[i], 0)) { case 0: /* restore defaults */ curr_attr = ATTR_DEFAULT; break; case 1: /* enable bold */ curr_attr |= ATTR_BOLD; break; case 4: /* enable underline */ case 21: /* (enable double underline) */ curr_attr |= ATTR_UNDER; break; case 7: /* enable reverse video */ curr_attr |= ATTR_REVERSE; break; case 22: /* disable bold */ curr_attr &= ~ATTR_BOLD; break; case 24: /* disable underline */ curr_attr &= ~ATTR_UNDER; break; case 27: /* disable reverse video */ curr_attr &= ~ATTR_REVERSE; break; case 30: case 31: case 32: case 33: case 34: case 35: case 36: case 37: /* foreground */ curr_attr &= ~ATTR_FGMASK; curr_attr |= (esc_args[i] - 30) << ATTR_FGSHIFT; break; case 39: /* default-foreground */ curr_attr &= ~ATTR_FGMASK; curr_attr |= ATTR_DEFFG; break; case 40: case 41: case 42: case 43: case 44: case 45: case 46: case 47: /* background */ curr_attr &= ~ATTR_BGMASK; curr_attr |= (esc_args[i] - 40) << ATTR_BGSHIFT; break; case 49: /* default-background */ curr_attr &= ~ATTR_BGMASK; curr_attr |= ATTR_DEFBG; break; } } } break; case 's': /* save cursor */ save_cursor (TRUE); break; case 'u': /* restore cursor */ save_cursor (FALSE); disptop = scrtop; must_update = TRUE; break; case 't': /* set page size - ie window height */ request_resize (cols, def(esc_args[0], 24)); deselect(); break; case 'X': /* write N spaces w/o moving cursor */ { int n = def(esc_args[0], 1); unsigned long *p = cpos; if (n > cols - curs_x) n = cols - curs_x; check_selection (cpos, cpos+n); while (n--) *p++ = ERASE_CHAR; disptop = scrtop; must_update = TRUE; } break; case 'x': /* report terminal characteristics */ { char buf[32]; int i = def(esc_args[0], 0); if (i == 0 || i == 1) { strcpy (buf, "\033[2;1;1;112;112;1;0x"); buf[2] += i; ldisc->send (buf, 20); } } break; } break; case SET_GL: case SET_GR: switch (c) { case 'A': cset_attr[termstate == SET_GL ? 0 : 1] = ATTR_GBCHR; break; case '0': cset_attr[termstate == SET_GL ? 0 : 1] = ATTR_LINEDRW; break; default: /* specifically, 'B' */ cset_attr[termstate == SET_GL ? 0 : 1] = ATTR_ASCII; break; } termstate = TOPLEVEL; break; case SEEN_OSC: osc_w = FALSE; switch (c) { case '\005': case '\007': case '\b': case '\016': case '\017': case '\033': case 0233: case 0234: case 0235: case '\r': case '\013': case '\014': case '\n': case '\t': termstate = TOPLEVEL; goto do_toplevel; /* hack... */ case 'P': /* Linux palette sequence */ termstate = SEEN_OSC_P; osc_strlen = 0; break; case 'R': /* Linux palette reset */ palette_reset(); term_invalidate(); termstate = TOPLEVEL; break; case 'W': /* word-set */ termstate = SEEN_OSC_W; osc_w = TRUE; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': esc_args[0] = 10 * esc_args[0] + c - '0'; break; case 'L': /* * Grotty hack to support xterm and DECterm title * sequences concurrently. */ if (esc_args[0] == 2) { esc_args[0] = 1; break; } /* else fall through */ default: termstate = OSC_STRING; osc_strlen = 0; } break; case OSC_STRING: if (c == 0234 || c == '\007') { /* * These characters terminate the string; ST and BEL * terminate the sequence and trigger instant * processing of it, whereas ESC goes back to SEEN_ESC * mode unless it is followed by \, in which case it is * synonymous with ST in the first place. */ do_osc(); termstate = TOPLEVEL; } else if (c == '\033') termstate = OSC_MAYBE_ST; else if (osc_strlen < OSC_STR_MAX) osc_string[osc_strlen++] = c; break; case SEEN_OSC_P: { int max = (osc_strlen == 0 ? 21 : 16); int val; if (c >= '0' && c <= '9') val = c - '0'; else if (c >= 'A' && c <= 'A'+max-10) val = c - 'A' + 10; else if (c >= 'a' && c <= 'a'+max-10) val = c - 'a' + 10; else termstate = TOPLEVEL; osc_string[osc_strlen++] = val; if (osc_strlen >= 7) { palette_set (osc_string[0], osc_string[1] * 16 + osc_string[2], osc_string[3] * 16 + osc_string[4], osc_string[5] * 16 + osc_string[6]); term_invalidate(); termstate = TOPLEVEL; } } break; case SEEN_OSC_W: switch (c) { case '\005': case '\007': case '\b': case '\016': case '\017': case '\033': case 0233: case 0234: case 0235: case '\r': case '\013': case '\014': case '\n': case '\t': termstate = TOPLEVEL; goto do_toplevel; /* hack... */ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': esc_args[0] = 10 * esc_args[0] + c - '0'; break; default: termstate = OSC_STRING; osc_strlen = 0; } break; case SEEN_ESCHASH: if (c == '8') { unsigned long *p = scrtop; int n = rows * (cols+1); while (n--) *p++ = ATTR_DEFAULT | 'E'; disptop = scrtop; must_update = TRUE; check_selection (scrtop, scrtop + rows * (cols+1)); } termstate = TOPLEVEL; break; } check_selection (cpos, cpos+1); } if (must_update || nl_count > MAXNL) term_update(); }
void process_gcode_command() { uint32_t backup_f; // convert relative to absolute if (next_target.option_all_relative) { next_target.target.X += startpoint.X; next_target.target.Y += startpoint.Y; next_target.target.Z += startpoint.Z; } // E relative movement. // Matches Sprinter's behaviour as of March 2012. if (next_target.option_all_relative || next_target.option_e_relative) next_target.target.e_relative = 1; else next_target.target.e_relative = 0; // implement axis limits #ifdef X_MIN if (next_target.target.X < X_MIN * 1000.) next_target.target.X = X_MIN * 1000.; #endif #ifdef X_MAX if (next_target.target.X > X_MAX * 1000.) next_target.target.X = X_MAX * 1000.; #endif #ifdef Y_MIN if (next_target.target.Y < Y_MIN * 1000.) next_target.target.Y = Y_MIN * 1000.; #endif #ifdef Y_MAX if (next_target.target.Y > Y_MAX * 1000.) next_target.target.Y = Y_MAX * 1000.; #endif #ifdef Z_MIN if (next_target.target.Z < Z_MIN * 1000.) next_target.target.Z = Z_MIN * 1000.; #endif #ifdef Z_MAX if (next_target.target.Z > Z_MAX * 1000.) next_target.target.Z = Z_MAX * 1000.; #endif // The GCode documentation was taken from http://reprap.org/wiki/Gcode . if (next_target.seen_T) { //? --- T: Select Tool --- //? //? Example: T1 //? //? Select extruder number 1 to build with. Extruder numbering starts at 0. next_tool = next_target.T; } if (next_target.seen_G) { uint8_t axisSelected = 0; switch (next_target.G) { case 0: //? G0: Rapid Linear Motion //? //? Example: G0 X12 //? //? In this case move rapidly to X = 12 mm. In fact, the RepRap firmware uses exactly the same code for rapid as it uses for controlled moves (see G1 below), as - for the RepRap machine - this is just as efficient as not doing so. (The distinction comes from some old machine tools that used to move faster if the axes were not driven in a straight line. For them G0 allowed any movement in space to get to the destination as fast as possible.) //? backup_f = next_target.target.F; next_target.target.F = MAXIMUM_FEEDRATE_X * 2L; enqueue(&next_target.target); next_target.target.F = backup_f; break; case 1: //? --- G1: Linear Motion at Feed Rate --- //? //? Example: G1 X90.6 Y13.8 E22.4 //? //? Go in a straight line from the current (X, Y) point to the point (90.6, 13.8), extruding material as the move happens from the current extruded length to a length of 22.4 mm. //? enqueue(&next_target.target); break; // G2 - Arc Clockwise // unimplemented // G3 - Arc Counter-clockwise // unimplemented case 4: //? --- G4: Dwell --- //? //? Example: G4 P200 //? //? In this case sit still doing nothing for 200 milliseconds. During delays the state of the machine (for example the temperatures of its extruders) will still be preserved and controlled. //? queue_wait(); // delay if (next_target.seen_P) { for (;next_target.P > 0;next_target.P--) { clock(); delay_ms(1); } } break; case 20: //? --- G20: Set Units to Inches --- //? //? Example: G20 //? //? Units from now on are in inches. //? next_target.option_inches = 1; break; case 21: //? --- G21: Set Units to Millimeters --- //? //? Example: G21 //? //? Units from now on are in millimeters. (This is the RepRap default.) //? next_target.option_inches = 0; break; case 30: //? --- G30: Go home via point --- //? //? Undocumented. enqueue(&next_target.target); // no break here, G30 is move and then go home case 28: //? --- G28: Home --- //? //? Example: G28 //? //? This causes the RepRap machine to move back to its X, Y and Z zero endstops. It does so accelerating, so as to get there fast. But when it arrives it backs off by 1 mm in each direction slowly, then moves back slowly to the stop. This ensures more accurate positioning. //? //? If you add coordinates, then just the axes with coordinates specified will be zeroed. Thus //? //? G28 X0 Y72.3 //? //? will zero the X and Y axes, but not Z. The actual coordinate values are ignored. //? queue_wait(); if (next_target.seen_X) { #if defined X_MIN_PIN home_x_negative(); #elif defined X_MAX_PIN home_x_positive(); #endif axisSelected = 1; } if (next_target.seen_Y) { #if defined Y_MIN_PIN home_y_negative(); #elif defined Y_MAX_PIN home_y_positive(); #endif axisSelected = 1; } if (next_target.seen_Z) { #if defined Z_MAX_PIN home_z_positive(); #elif defined Z_MIN_PIN home_z_negative(); #endif axisSelected = 1; } // there's no point in moving E, as E has no endstops if (!axisSelected) { home(); } break; case 90: //? --- G90: Set to Absolute Positioning --- //? //? Example: G90 //? //? All coordinates from now on are absolute relative to the origin //? of the machine. This is the RepRap default. //? //? If you ever want to switch back and forth between relative and //? absolute movement keep in mind, X, Y and Z follow the machine's //? coordinate system while E doesn't change it's position in the //? coordinate system on relative movements. //? // No wait_queue() needed. next_target.option_all_relative = 0; break; case 91: //? --- G91: Set to Relative Positioning --- //? //? Example: G91 //? //? All coordinates from now on are relative to the last position. //? // No wait_queue() needed. next_target.option_all_relative = 1; break; case 92: //? --- G92: Set Position --- //? //? Example: G92 X10 E90 //? //? Allows programming of absolute zero point, by reseting the current position to the values specified. This would set the machine's X coordinate to 10, and the extrude coordinate to 90. No physical motion will occur. //? queue_wait(); if (next_target.seen_X) { startpoint.X = next_target.target.X; axisSelected = 1; } if (next_target.seen_Y) { startpoint.Y = next_target.target.Y; axisSelected = 1; } if (next_target.seen_Z) { startpoint.Z = next_target.target.Z; axisSelected = 1; } if (next_target.seen_E) { startpoint.E = next_target.target.E; axisSelected = 1; } if (axisSelected == 0) { startpoint.X = next_target.target.X = startpoint.Y = next_target.target.Y = startpoint.Z = next_target.target.Z = startpoint.E = next_target.target.E = 0; } dda_new_startpoint(); break; case 161: //? --- G161: Home negative --- //? //? Find the minimum limit of the specified axes by searching for the limit switch. //? if (next_target.seen_X) home_x_negative(); if (next_target.seen_Y) home_y_negative(); if (next_target.seen_Z) home_z_negative(); break; case 162: //? --- G162: Home positive --- //? //? Find the maximum limit of the specified axes by searching for the limit switch. //? if (next_target.seen_X) home_x_positive(); if (next_target.seen_Y) home_y_positive(); if (next_target.seen_Z) home_z_positive(); break; // unknown gcode: spit an error default: sersendf_P(PSTR("E: Bad G-code %d"), next_target.G); // newline is sent from gcode_parse after we return return; } } else if (next_target.seen_M) { uint8_t i; switch (next_target.M) { case 0: //? --- M0: machine stop --- //? //? Example: M0 //? //? http://linuxcnc.org/handbook/RS274NGC_3/RS274NGC_33a.html#1002379 //? Unimplemented, especially the restart after the stop. Fall trough to M2. //? case 2: case 84: // For compatibility with slic3rs default end G-code. //? --- M2: program end --- //? //? Example: M2 //? //? http://linuxcnc.org/handbook/RS274NGC_3/RS274NGC_33a.html#1002379 //? queue_wait(); for (i = 0; i < NUM_HEATERS; i++) temp_set(i, 0); power_off(); break; case 112: //? --- M112: Emergency Stop --- //? //? Example: M112 //? //? Any moves in progress are immediately terminated, then RepRap shuts down. All motors and heaters are turned off. //? It can be started again by pressing the reset button on the master microcontroller. See also M0. //? timer_stop(); queue_flush(); power_off(); cli(); for (;;) wd_reset(); break; case 6: //? --- M6: tool change --- //? //? Undocumented. tool = next_tool; break; case 82: //? --- M82 - Set E codes absolute --- //? //? This is the default and overrides G90/G91. //? M82/M83 is not documented in the RepRap wiki, behaviour //? was taken from Sprinter as of March 2012. //? //? While E does relative movements, it doesn't change its //? position in the coordinate system. See also comment on G90. //? // No wait_queue() needed. next_target.option_e_relative = 0; break; case 83: //? --- M83 - Set E codes relative --- //? //? Counterpart to M82. //? // No wait_queue() needed. next_target.option_e_relative = 1; break; // M3/M101- extruder on case 3: case 101: //? --- M101: extruder on --- //? //? Undocumented. if (temp_achieved() == 0) { enqueue(NULL); } #ifdef DC_EXTRUDER heater_set(DC_EXTRUDER, DC_EXTRUDER_PWM); #elif E_STARTSTOP_STEPS > 0 do { // backup feedrate, move E very quickly then restore feedrate backup_f = startpoint.F; startpoint.F = MAXIMUM_FEEDRATE_E; SpecialMoveE(E_STARTSTOP_STEPS, MAXIMUM_FEEDRATE_E); startpoint.F = backup_f; } while (0); #endif break; // M102- extruder reverse // M5/M103- extruder off case 5: case 103: //? --- M103: extruder off --- //? //? Undocumented. #ifdef DC_EXTRUDER heater_set(DC_EXTRUDER, 0); #elif E_STARTSTOP_STEPS > 0 do { // backup feedrate, move E very quickly then restore feedrate backup_f = startpoint.F; startpoint.F = MAXIMUM_FEEDRATE_E; SpecialMoveE(-E_STARTSTOP_STEPS, MAXIMUM_FEEDRATE_E); startpoint.F = backup_f; } while (0); #endif break; case 104: //? --- M104: Set Extruder Temperature (Fast) --- //? //? Example: M104 S190 //? //? Set the temperature of the current extruder to 190<sup>o</sup>C //? and return control to the host immediately (''i.e.'' before that //? temperature has been reached by the extruder). For waiting, see M116. //? //? Teacup supports an optional P parameter as a zero-based temperature //? sensor index to address (e.g. M104 P1 S100 will set the temperature //? of the heater connected to the second temperature sensor rather //? than the extruder temperature). //? if ( ! next_target.seen_S) break; #ifdef HEATER_EXTRUDER if ( ! next_target.seen_P) next_target.P = HEATER_EXTRUDER; // else use the first available device #endif temp_set(next_target.P, next_target.S); break; case 105: //? --- M105: Get Temperature(s) --- //? //? Example: M105 //? //? Request the temperature of the current extruder and the build base //? in degrees Celsius. For example, the line sent to the host in //? response to this command looks like //? //? <tt>ok T:201 B:117</tt> //? //? Teacup supports an optional P parameter as a zero-based temperature //? sensor index to address. //? #ifdef ENFORCE_ORDER queue_wait(); #endif if ( ! next_target.seen_P) next_target.P = TEMP_SENSOR_none; temp_print(next_target.P); break; case 7: case 106: //? --- M106: Set Fan Speed / Set Device Power --- //? //? Example: M106 S120 //? //? Control the cooling fan (if any). //? //? Teacup supports an optional P parameter as a zero-based heater //? index to address. The heater index can differ from the temperature //? sensor index, see config.h. #ifdef ENFORCE_ORDER // wait for all moves to complete queue_wait(); #endif #ifdef HEATER_FAN if ( ! next_target.seen_P) next_target.P = HEATER_FAN; // else use the first available device #endif if ( ! next_target.seen_S) break; heater_set(next_target.P, next_target.S); break; case 110: //? --- M110: Set Current Line Number --- //? //? Example: N123 M110 //? //? Set the current line number to 123. Thus the expected next line after this command will be 124. //? This is a no-op in Teacup. //? break; #ifdef DEBUG case 111: //? --- M111: Set Debug Level --- //? //? Example: M111 S6 //? //? Set the level of debugging information transmitted back to the host to level 6. The level is the OR of three bits: //? //? <Pre> //? #define DEBUG_PID 1 //? #define DEBUG_DDA 2 //? #define DEBUG_POSITION 4 //? </pre> //? //? This command is only available in DEBUG builds of Teacup. if ( ! next_target.seen_S) break; debug_flags = next_target.S; break; #endif case 114: //? --- M114: Get Current Position --- //? //? Example: M114 //? //? This causes the RepRap machine to report its current X, Y, Z and E coordinates to the host. //? //? For example, the machine returns a string such as: //? //? <tt>ok C: X:0.00 Y:0.00 Z:0.00 E:0.00</tt> //? #ifdef ENFORCE_ORDER // wait for all moves to complete queue_wait(); #endif update_current_position(); sersendf_P(PSTR("X:%lq,Y:%lq,Z:%lq,E:%lq,F:%lu"), current_position.X, current_position.Y, current_position.Z, current_position.E, current_position.F); #ifdef DEBUG if (DEBUG_POSITION && (debug_flags & DEBUG_POSITION)) { sersendf_P(PSTR(",c:%lu}\nEndpoint: X:%ld,Y:%ld,Z:%ld,E:%ld,F:%lu,c:%lu}"), movebuffer[mb_tail].c, movebuffer[mb_tail].endpoint.X, movebuffer[mb_tail].endpoint.Y, movebuffer[mb_tail].endpoint.Z, movebuffer[mb_tail].endpoint.E, movebuffer[mb_tail].endpoint.F, #ifdef ACCELERATION_REPRAP movebuffer[mb_tail].end_c #else movebuffer[mb_tail].c #endif ); print_queue(); } #endif /* DEBUG */ // newline is sent from gcode_parse after we return break; case 115: //? --- M115: Get Firmware Version and Capabilities --- //? //? Example: M115 //? //? Request the Firmware Version and Capabilities of the current microcontroller //? The details are returned to the host computer as key:value pairs separated by spaces and terminated with a linefeed. //? //? sample data from firmware: //? FIRMWARE_NAME:Teacup FIRMWARE_URL:http://github.com/triffid/Teacup_Firmware/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:Mendel EXTRUDER_COUNT:1 TEMP_SENSOR_COUNT:1 HEATER_COUNT:1 //? sersendf_P(PSTR("FIRMWARE_NAME:Teacup FIRMWARE_URL:http://github.com/triffid/Teacup_Firmware/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:Mendel EXTRUDER_COUNT:%d TEMP_SENSOR_COUNT:%d HEATER_COUNT:%d"), 1, NUM_TEMP_SENSORS, NUM_HEATERS); // newline is sent from gcode_parse after we return break; case 116: //? --- M116: Wait --- //? //? Example: M116 //? //? Wait for temperatures and other slowly-changing variables to arrive at their set values. enqueue(NULL); break; case 119: //? --- M119: report endstop status --- //? Report the current status of the endstops configured in the //? firmware to the host. power_on(); endstops_on(); delay_ms(10); // allow the signal to stabilize #if defined(X_MIN_PIN) sersendf_P(PSTR("x_min:%d "), x_min()); #endif #if defined(X_MAX_PIN) sersendf_P(PSTR("x_max:%d "), x_max()); #endif #if defined(Y_MIN_PIN) sersendf_P(PSTR("y_min:%d "), y_min()); #endif #if defined(Y_MAX_PIN) sersendf_P(PSTR("y_max:%d "), y_max()); #endif #if defined(Z_MIN_PIN) sersendf_P(PSTR("z_min:%d "), z_min()); #endif #if defined(Z_MAX_PIN) sersendf_P(PSTR("z_max:%d "), z_max()); #endif #if ! (defined(X_MIN_PIN) || defined(X_MAX_PIN) || \ defined(Y_MIN_PIN) || defined(Y_MAX_PIN) || \ defined(Z_MIN_PIN) || defined(Z_MAX_PIN)) sersendf_P(PSTR("no endstops defined")); #endif endstops_off(); break; #ifdef EECONFIG case 130: //? --- M130: heater P factor --- //? Undocumented. #ifdef HEATER_EXTRUDER if ( ! next_target.seen_P) next_target.P = HEATER_EXTRUDER; // else use the first available device #endif if (next_target.seen_S) pid_set_p(next_target.P, next_target.S); break; case 131: //? --- M131: heater I factor --- //? Undocumented. #ifdef HEATER_EXTRUDER if ( ! next_target.seen_P) next_target.P = HEATER_EXTRUDER; #endif if (next_target.seen_S) pid_set_i(next_target.P, next_target.S); break; case 132: //? --- M132: heater D factor --- //? Undocumented. #ifdef HEATER_EXTRUDER if ( ! next_target.seen_P) next_target.P = HEATER_EXTRUDER; #endif if (next_target.seen_S) pid_set_d(next_target.P, next_target.S); break; case 133: //? --- M133: heater I limit --- //? Undocumented. #ifdef HEATER_EXTRUDER if ( ! next_target.seen_P) next_target.P = HEATER_EXTRUDER; #endif if (next_target.seen_S) pid_set_i_limit(next_target.P, next_target.S); break; case 134: //? --- M134: save PID settings to eeprom --- //? Undocumented. heater_save_settings(); break; #endif /* EECONFIG */ #ifdef DEBUG case 136: //? --- M136: PRINT PID settings to host --- //? Undocumented. //? This comand is only available in DEBUG builds. if ( ! next_target.seen_P) next_target.P = HEATER_EXTRUDER; heater_print(next_target.P); break; #endif case 140: //? --- M140: Set heated bed temperature --- //? Undocumented. #ifdef HEATER_BED if ( ! next_target.seen_S) break; temp_set(HEATER_BED, next_target.S); #endif break; #ifdef DEBUG case 240: //? --- M240: echo off --- //? Disable echo. //? This command is only available in DEBUG builds. debug_flags &= ~DEBUG_ECHO; serial_writestr_P(PSTR("Echo off")); // newline is sent from gcode_parse after we return break; case 241: //? --- M241: echo on --- //? Enable echo. //? This command is only available in DEBUG builds. debug_flags |= DEBUG_ECHO; serial_writestr_P(PSTR("Echo on")); // newline is sent from gcode_parse after we return break; #endif /* DEBUG */ // unknown mcode: spit an error default: sersendf_P(PSTR("E: Bad M-code %d"), next_target.M); // newline is sent from gcode_parse after we return } // switch (next_target.M) } // else if (next_target.seen_M) } // process_gcode_command()
void keyboard_irq(int irq, struct pt_regs *regs) { int modifiers; int key; modifiers = psiongetchar(); key = (modifiers & 0x00FF); /* no key pressed */ if (key == 0) { key_repeat = 0; last_key = 0; return; } if (key == last_key) { if (key_repeat < 5) { key_repeat++; return; } } last_key = key; key_repeat = 0; if (modifiers & PSION) { if (key == 0x31 && power_state == 1) /* Psion + 1 */ power_off(); if (key == 0x20 && power_state == 0) /* Psion + Space */ power_on(); return; } if (power_state == 0) return; /* prevent key presses when off */ if (modifiers & MENU) { if (key < 0x40 && key > 0x30) { /* MENU + 1..9 */ #ifdef CONFIG_SIBO_VIRTUAL_CONSOLE Console_set_vc(key - 0x31); #else AddQueue(ESC); AddQueue(key - 0x31 + 'a'); #endif return; } } switch (key) { case 0x18: /* Arrow up */ AddQueue(ESC); AddQueue('A'); return; case 0x19: /* Arrow down */ AddQueue(ESC); AddQueue('B'); return; case 0x1A: /* Arrow right */ AddQueue(ESC); AddQueue('C'); return; case 0x1B: /* Arrow left */ AddQueue(ESC); AddQueue('D'); return; default: AddQueue(key); return; } }
int cyttsp4_init(struct cyttsp4_core_platform_data *pdata, int on, struct device *dev) { int rst_gpio = pdata->rst_gpio; int irq_gpio = pdata->irq_gpio; int rc = 0; if (on) { rc = power_init(pdata, 1, dev); if (rc) dev_err(dev, "%s: power init failed\n", __func__); rc = power_on(pdata, 1, dev); if (rc) dev_err(dev, "%s: power on failed\n", __func__); rc = cyttsp4_pinctrl_init(pdata, 1, dev); if (rc) dev_err(dev, "%s: pinctrl init failed\n", __func__); rc = cyttsp4_pinctrl_select(pdata, dev, 1); if (rc) dev_err(dev, "%s: pinctrl select failed\n", __func__); rc = gpio_request(rst_gpio, NULL); if (rc < 0) { gpio_free(rst_gpio); rc = gpio_request(rst_gpio, NULL); } if (rc < 0) { dev_err(dev, "%s: Fail request gpio=%d\n", __func__, rst_gpio); } else { rc = gpio_direction_output(rst_gpio, 1); if (rc < 0) { pr_err("%s: Fail set output gpio=%d\n", __func__, rst_gpio); gpio_free(rst_gpio); } else { rc = gpio_request(irq_gpio, NULL); if (rc < 0) { gpio_free(irq_gpio); rc = gpio_request(irq_gpio, NULL); } if (rc < 0) { dev_err(dev, "%s: Fail request gpio=%d\n", __func__, irq_gpio); gpio_free(rst_gpio); } else { gpio_direction_input(irq_gpio); } } } } else { rc = cyttsp4_pinctrl_select(pdata, dev, 0); if(rc) dev_err(dev, "%s: pinctrl select failed\n", __func__); rc = cyttsp4_pinctrl_init(pdata, 0, dev); if (rc) dev_err(dev, "%s: pinctrl init failed\n", __func__); rc = power_on(pdata, 0, dev); if (rc) dev_err(dev, "%s: power on failed\n", __func__); rc = power_init(pdata, 0, dev); if (rc) dev_err(dev, "%s: power init failed\n", __func__); gpio_free(rst_gpio); gpio_free(irq_gpio); } dev_info(dev, "%s: INIT CYTTSP RST gpio=%d and IRQ gpio=%d r=%d\n", __func__, rst_gpio, irq_gpio, rc); return rc; }
DSTATUS disk_initialize(void) { u8 n, cmd, ty, ocr[4], rep, timeout; u16 tmr; power_on(); /* Force socket power on */ for (n = 10; n; n--) xmit_spi(0xFF); /* Dummy clocks */ ty = 0; timeout=100; // Trying to enter Idle state do { DESELECT(); xmit_spi(0xFF); SELECT(); rep = send_cmd(CMD0,0); } while ((rep != 1) && (--timeout)); if(timeout == 0) { DESELECT(); xmit_spi(0xFF); SELECT(); rep = send_cmd(CMD12,0); rep = send_cmd(CMD0,0); if (rep != 1) { return STA_NOINIT; } } rep = send_cmd(CMD8, 0x1AA); // SDHC if ( rep == 1) { for (n = 0; n < 4; n++) ocr[n] = rcvr_spi(); /* Get trailing return value of R7 resp */ if (ocr[2] == 0x01 && ocr[3] == 0xAA) { /* The card can work at vdd range of 2.7-3.6V */ for (tmr = 25000; tmr && send_cmd(ACMD41, 1UL << 30); tmr--) ; /* Wait for leaving idle state (ACMD41 with HCS bit) */ if (tmr && send_cmd(CMD58, 0) == 0) { /* Check CCS bit in the OCR */ for (n = 0; n < 4; n++) ocr[n] = rcvr_spi(); ty = (ocr[0] & 0x40) ? CT_SD2 | CT_BLOCK : CT_SD2; /* SDv2 */ } } } // SDSC or MMC else { if (send_cmd(ACMD41, 0) <= 1) { ty = CT_SD1; cmd = ACMD41; /* SDv1 */ } else { ty = CT_MMC; cmd = CMD1; /* MMCv3 */ } for (tmr = 25000; tmr && send_cmd(cmd, 0); tmr--) ; /* Wait for leaving idle state */ if (!tmr || send_cmd(CMD16, 512) != 0) /* Set R/W block length to 512 */ ty = 0; } CardType = ty; release_spi(); // Initialization succeded if (ty) { FCLK_FAST(); return RES_OK; } // Initialization failed else { power_off(); return STA_NOINIT; } }