コード例 #1
0
ファイル: SDCard.cpp プロジェクト: Axelfernandes/uDelta
void SDCard::automount()
{
#if defined(SDCARDDETECT) && SDCARDDETECT>-1
    if(READ(SDCARDDETECT) != SDCARDDETECTINVERTED)
    {
        if(sdactive)   // Card removed
        {
            Com::printFLN(PSTR("SD card removed"));
#if UI_DISPLAY_TYPE!=0
            uid.executeAction(UI_ACTION_TOP_MENU);
#endif
            unmount();
            UI_STATUS(UI_TEXT_SD_REMOVED);
        }
    }
    else
    {
        if(!sdactive)
        {
            UI_STATUS(UI_TEXT_SD_INSERTED);
            Com::printFLN(PSTR("SD card inserted"));
            Printer::setMenuMode(MENU_MODE_SD_MOUNTED,true);
            initsd();
#if UI_DISPLAY_TYPE!=0
            if(sdactive) {
                Printer::setAutomount(true);
                uid.executeAction(UI_ACTION_SD_PRINT+UI_ACTION_TOPMENU);
            }
#endif
        }
    }
#endif
}
コード例 #2
0
ファイル: cardreader.cpp プロジェクト: Claude59/Mondrian3
void CardReader::checkautostart(bool force) {
  if (!force && (!autostart_stilltocheck || next_autostart_ms < millis()))
    return;

  autostart_stilltocheck = false;

  if (!cardOK) {
    initsd();
    if (!cardOK) return; // fail
  }

  char autoname[30];
  sprintf_P(autoname, PSTR("auto%i.g"), autostart_index);
  for (int8_t i = 0; i < (int8_t)strlen(autoname); i++) autoname[i] = tolower(autoname[i]);

  dir_t p;

  root.rewind();

  bool found = false;
  while (root.readDir(p, NULL) > 0) {
    for (int8_t i = 0; i < (int8_t)strlen((char*)p.name); i++) p.name[i] = tolower(p.name[i]);
    if (p.name[9] != '~' && strncmp((char*)p.name, autoname, 5) == 0) {
      char cmd[30];
      sprintf_P(cmd, PSTR("M23 %s"), autoname);
      enqueuecommand(cmd);
      enqueuecommands_P(PSTR("M24"));
      found = true;
    }
  }
  if (!found)
    autostart_index = -1;
  else
    autostart_index++;
}
コード例 #3
0
ファイル: cardreader.cpp プロジェクト: M-Prime/M_Prime_One
void CardReader::checkautostart(bool force) {
  if (!force && (!autostart_stilltocheck || ELAPSED(millis(), next_autostart_ms)))
    return;

  autostart_stilltocheck = false;

  if (!cardOK) {
    initsd();
    if (!cardOK) return; // fail
  }

  char autoname[10];
  sprintf_P(autoname, PSTR("auto%i.g"), autostart_index);
  for (int8_t i = 0; i < (int8_t)strlen(autoname); i++) autoname[i] = tolower(autoname[i]);

  dir_t p;

  root.rewind();

  bool found = false;
  while (root.readDir(p, NULL) > 0) {
    for (int8_t i = 0; i < (int8_t)strlen((char*)p.name); i++) p.name[i] = tolower(p.name[i]);
    if (p.name[9] != '~' && strncmp((char*)p.name, autoname, 5) == 0) {
      openAndPrintFile(autoname);
      found = true;
    }
  }
  if (!found)
    autostart_index = -1;
  else
    autostart_index++;
}
コード例 #4
0
ファイル: SDCard.cpp プロジェクト: perivar/PulpitRockCNC3D
void SDCard::automount()
{
#if SDCARDDETECT > -1
    if(READ(SDCARDDETECT) != SDCARDDETECTINVERTED)
    {
        if(sdactive)   // Card removed
        {
            Com::printFLN(PSTR("SD card removed"));
#if UI_DISPLAY_TYPE != NO_DISPLAY
            uid.executeAction(UI_ACTION_TOP_MENU, true);
#endif
            unmount();
            UI_STATUS_F(Com::translatedF(UI_TEXT_SD_REMOVED_ID));
        }
    }
    else
    {
        if(!sdactive)
        {
            UI_STATUS_F(Com::translatedF(UI_TEXT_SD_INSERTED_ID));
            Com::printFLN(PSTR("SD card inserted")); // Not translateable or host will not understand signal
            initsd();
#if UI_DISPLAY_TYPE != NO_DISPLAY
            if(sdactive) {
                Printer::setAutomount(true);
                uid.executeAction(UI_ACTION_SD_PRINT + UI_ACTION_TOPMENU, true);
            }
#endif
        }
    }
#endif
}
コード例 #5
0
ファイル: cardreader.cpp プロジェクト: RicardoGA/MarlinKimbra
void CardReader::checkautostart(bool force) {
  if (!force && (!autostart_stilltocheck || next_autostart_ms >= millis()))
    return;

  autostart_stilltocheck = false;

  if (!cardOK) {
    initsd();
    if (!cardOK) return; // fail
  }

  fat.chdir(true);
  if(selectFile("init.g", true)) startPrint();
}
コード例 #6
0
ファイル: cardreader.cpp プロジェクト: RyuHa/Ultimaker2Marlin
void CardReader::checkautostart(bool force)
{
  if(!force)
  {
    if(!autostart_stilltocheck)
      return;
    if(autostart_atmillis<millis())
      return;
  }
  autostart_stilltocheck=false;
  if(!cardOK)
  {
    initsd();
    if(!cardOK) //fail
      return;
  }
  
  char autoname[30];
  sprintf_P(autoname, PSTR("auto%i.g"), lastnr);
  for(int8_t i=0;i<(int8_t)strlen(autoname);i++)
    autoname[i]=tolower(autoname[i]);
  dir_t p;

  root.rewind();
  
  bool found=false;
  while (root.readDir(p, NULL) > 0) 
  {
    for(int8_t i=0;i<(int8_t)strlen((char*)p.name);i++)
    p.name[i]=tolower(p.name[i]);
    //Serial.print((char*)p.name);
    //Serial.print(" ");
    //Serial.println(autoname);
    if(p.name[9]!='~') //skip safety copies
    if(strncmp((char*)p.name,autoname,5)==0)
    {
      char cmd[30];

      sprintf_P(cmd, PSTR("M23 %s"), autoname);
      enquecommand(cmd);
      enquecommand_P(PSTR("M24"));
      found=true;
    }
  }
  if(!found)
    lastnr=-1;
  else
    lastnr++;
  clearError();
}
コード例 #7
0
ファイル: SDCard.cpp プロジェクト: Axelfernandes/uDelta
void SDCard::mount()
{
    sdmode = false;
    initsd();
}
コード例 #8
0
ファイル: SDCard.cpp プロジェクト: perivar/PulpitRockCNC3D
void SDCard::mount()
{
    sdmode = 0;
    initsd();
}
コード例 #9
0
ファイル: cardreader.cpp プロジェクト: RicardoGA/MarlinKimbra
void CardReader::mount() {
  initsd();
}
コード例 #10
0
ファイル: Commands.cpp プロジェクト: hradec/Repetier-Firmware
/**
  \brief Execute the command stored in com.
*/
void process_command(GCode *com)
{
    unsigned long codenum; //throw away variable
#ifdef INCLUDE_DEBUG_COMMUNICATION
    if(DEBUG_COMMUNICATION) {
        if(GCODE_HAS_G(com) || (GCODE_HAS_M(com) && com->M!=111)) {
            gcode_command_finished(); // free command cache
            previous_millis_cmd = millis();
            return;
        }
    }
#endif
    if(GCODE_HAS_G(com))
    {
        switch(com->G)
        {
        case 0: // G0 -> G1
        case 1: // G1
            if(get_coordinates(com)) // For X Y Z E F
                queue_move(ALWAYS_CHECK_ENDSTOPS);
            break;
        case 4: // G4 dwell
            codenum = 0;
            if(GCODE_HAS_P(com)) codenum = com->P; // milliseconds to wait
            if(GCODE_HAS_S(com)) codenum = (long)com->S * 1000; // seconds to wait
            codenum += millis();  // keep track of when we started waiting
            while(millis()  < codenum ) {
                gcode_read_serial();
                manage_temperatures(false);
            }
            break;
        case 20: // Units to inches
            unit_inches = 1;
            break;
        case 21: // Units to mm
            unit_inches = 0;
            break;
        case 28: {//G28 Home all Axis one at a time
            wait_until_end_of_move();
            float saved_feedrate = printer_state.feedrate;
            for(byte i=0; i < 4; i++) {
                printer_state.destinationSteps[i] = printer_state.currentPositionSteps[i];
            }

            byte home_all_axis = !(GCODE_HAS_X(com) || GCODE_HAS_Y(com) || GCODE_HAS_Z(com));

            if(home_all_axis || GCODE_HAS_X(com)) {
                if ((X_MIN_PIN > -1 && X_HOME_DIR==-1) || (X_MAX_PIN > -1 && X_HOME_DIR==1)) {
                    printer_state.destinationSteps[0] = 1.5 * printer_state.xMaxSteps * X_HOME_DIR;
                    printer_state.currentPositionSteps[0] = -printer_state.destinationSteps[0];
                    printer_state.feedrate = homing_feedrate[0];
                    queue_move(true);
                    wait_until_end_of_move();
                    printer_state.currentPositionSteps[0] = 0;
                    printer_state.destinationSteps[0] = axis_steps_per_unit[0]*-5 * X_HOME_DIR;
                    queue_move(true);
                    wait_until_end_of_move();
                    printer_state.destinationSteps[0] = axis_steps_per_unit[0]*10 * X_HOME_DIR;
                    queue_move(true);
                    wait_until_end_of_move();
                    printer_state.currentPositionSteps[0] = (X_HOME_DIR == -1) ? 0 : printer_state.xMaxSteps;
                    printer_state.destinationSteps[0] = printer_state.currentPositionSteps[0];
                }
            }

            if(home_all_axis || GCODE_HAS_Y(com)) {
                if ((Y_MIN_PIN > -1 && Y_HOME_DIR==-1) || (Y_MAX_PIN > -1 && Y_HOME_DIR==1)) {
                    printer_state.currentPositionSteps[1] = 0;
                    printer_state.destinationSteps[1] = 1.5 * printer_state.yMaxSteps * Y_HOME_DIR;
                    printer_state.currentPositionSteps[1] = -printer_state.destinationSteps[1];
                    printer_state.feedrate = homing_feedrate[1];
                    queue_move(true);
                    wait_until_end_of_move();
                    printer_state.currentPositionSteps[1] = 0;
                    printer_state.destinationSteps[1] = axis_steps_per_unit[1]*-5 * Y_HOME_DIR;
                    queue_move(true);
                    wait_until_end_of_move();
                    printer_state.destinationSteps[1] = axis_steps_per_unit[1]*10 * Y_HOME_DIR;
                    queue_move(true);
                    wait_until_end_of_move();
                    printer_state.currentPositionSteps[1] = (Y_HOME_DIR == -1) ? 0 : printer_state.yMaxSteps;
                    printer_state.destinationSteps[1] = printer_state.currentPositionSteps[1];
                }
            }

            if(home_all_axis || GCODE_HAS_Z(com)) {
                if ((Z_MIN_PIN > -1 && Z_HOME_DIR==-1) || (Z_MAX_PIN > -1 && Z_HOME_DIR==1)) {
                    printer_state.currentPositionSteps[2] = 0;
                    printer_state.destinationSteps[2] = 1.5 * printer_state.zMaxSteps * Z_HOME_DIR;
                    printer_state.currentPositionSteps[2] = -printer_state.destinationSteps[2];
                    printer_state.feedrate = homing_feedrate[2];
                    queue_move(true);
                    wait_until_end_of_move();
                    printer_state.currentPositionSteps[2] = 0;
                    printer_state.destinationSteps[2] = axis_steps_per_unit[2]*-2 * Z_HOME_DIR;
                    queue_move(true);
                    wait_until_end_of_move();
                    printer_state.destinationSteps[2] = axis_steps_per_unit[2]*10 * Z_HOME_DIR;
                    queue_move(true);
                    wait_until_end_of_move();
                    printer_state.currentPositionSteps[2] = (Z_HOME_DIR == -1) ? 0 : printer_state.zMaxSteps;
                    printer_state.destinationSteps[2] = printer_state.currentPositionSteps[2];
                }
            }
            printer_state.feedrate = saved_feedrate;
        }
        break;
        case 90: // G90
            relative_mode = false;
            break;
        case 91: // G91
            relative_mode = true;
            break;
        case 92: // G92
            if(GCODE_HAS_X(com)) printer_state.currentPositionSteps[0] = com->X*axis_steps_per_unit[0]*(unit_inches?25.4:1.0)-printer_state.offsetX;
            if(GCODE_HAS_Y(com)) printer_state.currentPositionSteps[1] = com->Y*axis_steps_per_unit[1]*(unit_inches?25.4:1.0)-printer_state.offsetY;
            if(GCODE_HAS_Z(com)) printer_state.currentPositionSteps[2] = com->Z*axis_steps_per_unit[2]*(unit_inches?25.4:1.0);
            if(GCODE_HAS_E(com)) {
                printer_state.currentPositionSteps[3] = com->E*axis_steps_per_unit[3]*(unit_inches?25.4:1.0);
            }
            break;

        }
        previous_millis_cmd = millis();
    }

    else if(GCODE_HAS_M(com))  { // Process M Code

        switch( com->M ) {
#ifdef SDSUPPORT

        case 20: // M20 - list SD card
            out.println_P(PSTR("Begin file list"));
            root.ls();
            out.println_P(PSTR("End file list"));
            break;
        case 21: // M21 - init SD card
            sdmode = false;
            initsd();
            break;
        case 22: //M22 - release SD card
            sdmode = false;
            sdactive = false;
            break;
        case 23: //M23 - Select file
            if(sdactive) {
                sdmode = false;
                file.close();
                if (file.open(&root, com->text, O_READ)) {
                    out.print_P(PSTR("File opened:"));
                    out.print(com->text);
                    out.print_P(PSTR(" Size:"));
                    out.println(file.fileSize());
                    sdpos = 0;
                    filesize = file.fileSize();
                    out.println_P(PSTR("File selected"));
                }
                else {
                    out.println_P(PSTR("file.open failed"));
                }
            }
            break;
        case 24: //M24 - Start SD print
            if(sdactive) {
                sdmode = true;
            }
            break;
        case 25: //M25 - Pause SD print
            if(sdmode) {
                sdmode = false;
            }
            break;
        case 26: //M26 - Set SD index
            if(sdactive && GCODE_HAS_S(com)) {
                sdpos = com->S;
                file.seekSet(sdpos);
            }
            break;
        case 27: //M27 - Get SD status
            if(sdactive) {
                out.print_P(PSTR("SD printing byte "));
                out.print(sdpos);
                out.print("/");
                out.println(filesize);
            } else {
                out.println_P(PSTR("Not SD printing"));
            }
            break;
        case 28: //M28 - Start SD write
            if(sdactive) {
                char* npos = 0;
                file.close();
                sdmode = false;
                if (!file.open(&root,com->text, O_CREAT | O_APPEND | O_WRITE | O_TRUNC))  {
                    out.print_P(PSTR("open failed, File: "));
                    out.print(com->text);
                    out.print_P(PSTR("."));
                } else {
                    savetosd = true;
                    out.print_P(PSTR("Writing to file: "));
                    out.println(com->text);
                }
            }
            break;
        case 29: //M29 - Stop SD write
            //processed in write to file routine above
            //savetosd = false;
            break;
        case 30: // M30 filename - Delete file
            if(sdactive) {
                sdmode = false;
                file.close();
                if(SdFile::remove(&root, com->text)) {
                    out.println_P(PSTR("File deleted"));
                } else {
                    out.println_P(PSTR("Deletion failed"));
                }
            }
            break;
#endif
        case 104: // M104
            if(DEBUG_DRYRUN) break;
            wait_until_end_of_move();
            if (GCODE_HAS_S(com)) extruder_set_temperature(com->S);
            break;
        case 140: // M140 set bed temp
            if(DEBUG_DRYRUN) break;
            if (GCODE_HAS_S(com)) heated_bed_set_temperature(com->S);
            break;
        case 105: // M105  get temperature. Always returns the current temperature, doesn't wait until move stopped
            print_temperatures();
            break;
        case 109: // M109 - Wait for extruder heater to reach target.
        {
            if(DEBUG_DRYRUN) break;
            wait_until_end_of_move();
            if (GCODE_HAS_S(com)) extruder_set_temperature(com->S);
            if(current_extruder->currentTemperatureC >= current_extruder->targetTemperature) break;
            codenum = millis();
            long waituntil = 0;
            while(waituntil==0 || (waituntil!=0 && waituntil>millis())) {
                if( (millis() - codenum) > 1000 ) { //Print Temp Reading every 1 second while heating up.
                    print_temperatures();
                    codenum = millis();
                }
                manage_temperatures(false);
                gcode_read_serial();
                if(waituntil==0 && current_extruder->currentTemperatureC >= current_extruder->targetTemperatureC)
                    waituntil = millis()+1000*(long)current_extruder->watchPeriod; // now wait for temp. to stabalize
            }
        }
        break;
        case 190: // M190 - Wait bed for heater to reach target.
            if(DEBUG_DRYRUN) break;
            wait_until_end_of_move();
#if HEATED_BED_SENSOR_TYPE!=0
            if (GCODE_HAS_S(com)) heated_bed_set_temperature(com->S);
            codenum = millis();
            while(current_bed_raw < target_bed_raw) {
                if( (millis()-codenum) > 1000 ) { //Print Temp Reading every 1 second while heating up.
                    print_temperatures();
                    codenum = millis();
                }
                manage_temperatures(false);
            }
#endif
            break;
        case 106: //M106 Fan On
            wait_until_end_of_move();
            if (GCODE_HAS_S(com)) {
                digitalWrite(FAN_PIN, HIGH);
                analogWrite(FAN_PIN, constrain(com->S,0,255) );
            }
            else
                digitalWrite(FAN_PIN, HIGH);
            break;
        case 107: //M107 Fan Off
            wait_until_end_of_move();
            analogWrite(FAN_PIN, 0);

            digitalWrite(FAN_PIN, LOW);
            break;
        case 80: // M81 - ATX Power On
            wait_until_end_of_move();
            if(PS_ON_PIN > -1) pinMode(PS_ON_PIN,OUTPUT); //GND
            break;
        case 81: // M81 - ATX Power Off
            wait_until_end_of_move();
            if(PS_ON_PIN > -1) pinMode(PS_ON_PIN,INPUT); //Floating
            break;
        case 82:
            relative_mode_e = false;
            break;
        case 83:
            relative_mode_e = true;
            break;
        case 84:
            if(GCODE_HAS_S(com)) {
                stepper_inactive_time = com->S * 1000;
            }
            else {
                wait_until_end_of_move();
                kill(true);
            }
            break;
        case 85: // M85
            if(GCODE_HAS_S(com))
                max_inactive_time = (long)com->S * 1000;
            else
                max_inactive_time = 0;
            break;
        case 92: // M92
            if(GCODE_HAS_X(com)) axis_steps_per_unit[0] = com->X;
            if(GCODE_HAS_Y(com)) axis_steps_per_unit[1] = com->Y;
            if(GCODE_HAS_Z(com)) axis_steps_per_unit[2] = com->Z;
            if(GCODE_HAS_E(com)) current_extruder->stepsPerMM = com->E;
            update_ramps_parameter();
            break;
        case 111:
            if(GCODE_HAS_S(com)) debug_level = com->S;
            if(DEBUG_DRYRUN) { // simulate movements without printing
                extruder_set_temperature(0);
#if HEATED_BED_TYPE!=0
                target_bed_raw = 0;
#endif
            }
            break;
        case 115: // M115
            out.println_P(PSTR("FIRMWARE_NAME:Repetier FIRMWARE_URL:https://github.com/repetier/Repetier-Firmware/ PROTOCOL_VERSION:1.0 MACHINE_TYPE:Mendel EXTRUDER_COUNT:1 REPETIER_PROTOCOL:1"));
            break;
        case 114: // M114
            out.print_float_P(PSTR("X:"),printer_state.currentPositionSteps[0]*inv_axis_steps_per_unit[0]*(unit_inches?0.03937:1));
            out.print_float_P(PSTR(" Y:"),printer_state.currentPositionSteps[1]*inv_axis_steps_per_unit[1]*(unit_inches?0.03937:1));
            out.print_float_P(PSTR(" Z:"),printer_state.currentPositionSteps[2]*inv_axis_steps_per_unit[2]*(unit_inches?0.03937:1));
            out.println_float_P(PSTR(" E:"),printer_state.currentPositionSteps[3]*inv_axis_steps_per_unit[3]*(unit_inches?0.03937:1));
            break;
        case 119: // M119
            wait_until_end_of_move();
#if (X_MIN_PIN > -1)
            out.print_P(PSTR("x_min:"));
            out.print_P((digitalRead(X_MIN_PIN)^ENDSTOPS_INVERTING)?PSTR("H "):PSTR("L "));
#endif
#if (X_MAX_PIN > -1)
            out.print_P(PSTR("x_max:"));
            out.print_P((digitalRead(X_MAX_PIN)^ENDSTOPS_INVERTING)?PSTR("H "):PSTR("L "));
#endif
#if (Y_MIN_PIN > -1)
            out.print_P(PSTR("y_min:"));
            out.print_P((digitalRead(Y_MIN_PIN)^ENDSTOPS_INVERTING)?PSTR("H "):PSTR("L "));
#endif
#if (Y_MAX_PIN > -1)
            out.print_P(PSTR("y_max:"));
            out.print_P((digitalRead(Y_MAX_PIN)^ENDSTOPS_INVERTING)?PSTR("H "):PSTR("L "));
#endif
#if (Z_MIN_PIN > -1)
            out.print_P(PSTR("z_min:"));
            out.print_P((digitalRead(Z_MIN_PIN)^ENDSTOPS_INVERTING)?PSTR("H "):PSTR("L "));
#endif
#if (Z_MAX_PIN > -1)
            out.print_P(PSTR("z_max:"));
            out.print_P((digitalRead(Z_MAX_PIN)^ENDSTOPS_INVERTING)?PSTR("H "):PSTR("L "));
#endif
            out.println();
            break;
#ifdef RAMP_ACCELERATION
        case 201: // M201
            if(GCODE_HAS_X(com)) axis_steps_per_sqr_second[0] = com->X * axis_steps_per_unit[0];
            if(GCODE_HAS_Y(com)) axis_steps_per_sqr_second[1] = com->Y * axis_steps_per_unit[1];
            if(GCODE_HAS_Z(com)) axis_steps_per_sqr_second[2] = com->Z * axis_steps_per_unit[2];
            if(GCODE_HAS_E(com)) axis_steps_per_sqr_second[3] = com->E * axis_steps_per_unit[3];
            break;
        case 202: // M202
            if(GCODE_HAS_X(com)) axis_travel_steps_per_sqr_second[0] = com->X * axis_steps_per_unit[0];
            if(GCODE_HAS_Y(com)) axis_travel_steps_per_sqr_second[1] = com->Y * axis_steps_per_unit[1];
            if(GCODE_HAS_Z(com)) axis_travel_steps_per_sqr_second[2] = com->Z * axis_steps_per_unit[2];
            if(GCODE_HAS_E(com)) axis_travel_steps_per_sqr_second[3] = com->E * axis_steps_per_unit[3];
            break;
#endif
        case 203: // M203 Temperature monitor
            if(GCODE_HAS_S(com)) manage_monitor = com->S;
            if(manage_monitor==100) manage_monitor=NUM_EXTRUDER; // Set 100 to heated bed
            break;
        case 205: // M205 Show EEPROM settings
            epr_output_settings();
            break;
        case 206: // M206 T[type] P[pos] [Sint(long] [Xfloat]  Set eeprom value
#if EEPROM_MODE!=0
            epr_update(com);
#else
            out.println_P(PSTR("Error: No EEPROM support compiled."));
#endif
            break;
        case 222: //M222 F_CPU / S
            if(GCODE_HAS_S(com))
                out.println_long_P(PSTR("F_CPU/x="),CPUDivU2(com->S));
            break;
        case 223:
            if(GCODE_HAS_S(com)) {
                extruder_enable();
                printer_state.extruderStepsNeeded+=(int)com->S;
                out.println_int_P(PSTR("Added to:"),printer_state.extruderStepsNeeded);
            }
            break;
#ifdef USE_ADVANCE
        case 232:
            out.print_int_P(PSTR("Max advance="),maxadv);
            if(maxadv>0)
                out.println_float_P(PSTR(", speed="),maxadvspeed);
            else
                out.println();
            maxadv=0;
            maxadvspeed=0;
            break;
#endif
#if USE_OPS==1
        case 231: // M231 S<OPS_MODE> X<Min_Distance> Y<Retract> Z<Backslash> F<ReatrctMove>
            if(GCODE_HAS_S(com) && com->S>=0 && com->S<3)
                printer_state.opsMode = com->S;
            if(GCODE_HAS_X(com) && com->X>=0)
                printer_state.opsMinDistance = com->X;
            if(GCODE_HAS_Y(com) && com->Y>=0)
                printer_state.opsRetractDistance = com->Y;
            if(GCODE_HAS_Z(com) && com->Z>=-printer_state.opsRetractDistance)
                printer_state.opsRetractBackslash = com->Z;
            if(GCODE_HAS_F(com) && com->F>=0 && com->F<=100)
                printer_state.opsMoveAfter = com->F;
            extruder_select(current_extruder->id);
            if(printer_state.opsMode==0) {
                out.println_P(PSTR("OPS disabled"));
            } else {
                if(printer_state.opsMode==1)
                    out.print_P(PSTR("OPS classic mode:"));
                else
                    out.print_P(PSTR("OPS fast mode:"));

                out.print_float_P(PSTR("min distance = "),printer_state.opsMinDistance);
                out.print_float_P(PSTR(", retract = "),printer_state.opsRetractDistance);
                out.print_float_P(PSTR(", backslash = "),printer_state.opsRetractDistance);
                if(printer_state.opsMode==2)
                    out.print_float_P(PSTR(", move after = "),printer_state.opsMoveAfter);
                out.println();
            }
#ifdef DEBUG_OPS
            out.println_int_P(PSTR("Timer diff"),printer_state.timer0Interval);
            out.println_int_P(PSTR("Ret. steps:"),printer_state.opsRetractSteps);
            out.println_int_P(PSTR("PushBack Steps:"),printer_state.opsPushbackSteps);
            out.println_int_P(PSTR("Move after steps:"),printer_state.opsMoveAfterSteps);
#endif
            break;
#endif
        }
    } else if(GCODE_HAS_T(com))  { // Process T code
        wait_until_end_of_move();
        extruder_select(com->T);
    } else {
        if(DEBUG_ERRORS) {
            out.print_P(PSTR("Unknown command:"));
            gcode_print_command(com);
            out.println();
        }
    }
#ifdef ECHO_ON_EXECUTE
    if(DEBUG_ECHO) {
        out.print_P(PSTR("Echo:"));
        gcode_print_command(com);
        out.println();
    }
#endif
    gcode_command_finished(); // free command cache
}
コード例 #11
0
ファイル: main.c プロジェクト: slivingston/BatStack
int main()
{

    unsigned int k, j;

	unsigned long start_sectorptr; /* Facilitates abortion of last recording trigger. */


	////////////////////
	// Default values
	////////////////////
	posttrigger_len = 0;
	trigger_hit = 0;
	first_int_since_trigger = 1;
	for (k = 0; k < 4; k++) {
		*(SRAMchipW+k) = 0x8000 + (0x2<<k);
		*(SRAMchipR+k) = 0x8200 + (0x2<<k);
	}
	DMAptr_at_trigger=0;
	sram_unit=0;
	batstack_id = 0x05;
	build_date = 0x50E5; // 2010 July 5
	swidth_mactive = 0xAF;
	sample_period = 375;
	sectorptr = 2;
	dmablock_flag = 0;

	TRISG &= 0xfc3f;

    
    INTCON1bits.NSTDIS = 1; /* Disable nested interrupts */


	/*
	 * Switch to our desired clock, achieving Tcy = 25 ns.
	 *
	 */
	__asm__ volatile ( "disi #0x3fff" ); // Disable (priority level < 7) interrupts during clock switch

    PLLFBD = 0x1E;
	CLKDIV = 0x0; /* In particular, PLLPRE := 0, PLLPOST := 0, DOZEN := 0. */

	__asm__ volatile ( "mov #0x78, w0\n\t"
					   "mov #0x9A, w1\n\t"
					   "mov #0x46, w2\n\t"
					   "mov #0x57, w3\n\t"
					   "mov #0x3, w4\n\t"
					   "mov #0x1, w5\n\t"
					   "mov #0x743, w7\n\t"
					   "mov #0x742, w6\n\t"
					   "mov.b w0, [w7]\n\t"
					   "mov.b w1, [w7]\n\t"
					   "mov.b w4, [w7]\n\t"
					   "mov.b w2, [w6]\n\t"
					   "mov.b w3, [w6]\n\t"
					   "mov.b w5, [w6]\n\t" );
	while (OSCCONbits.OSWEN) ;

	__asm__ volatile ( "disi #0x0" ); // Re-enable interrupts


    // Trigger button setting (and LEDs)
    TRISC = 0x0002;
    PORTC = 0;

	/* Disable all A/D pins except AN0:3
	   This is done in init_adc1 but seems cleaner here. */
	AD1PCFGH = 0xFFFF;
    AD1PCFGL = 0xFFF0;

    init_SRAM_write();
    num_dmablocks = NUM_DMABLOCKS_PER_SRAM;
    init_adc1();
    init_dma5(); /* Initialize DMA channel to buffer ADC data in conversion order. */
    AD1CON1bits.ADON = 1; /* Start the ADC1 module! */
    /* Initialize the A/D converter module; note that we must not initialize
       the ADC module before the DMA channel 5 is ready; otherwise we may
       fall out of sync (and thus invalidate the assumption that DMA transfer
       block addresses are such that
       0 mod 4 is CH0,
       1 mod 4 is CH1,
       2 mod 4 is CH2, and
       3 mod 4 is CH3, i.e. interleaved).
    */
    initspi();
    if (initsd() < 0) {
		// Failed to initialize SD card; give up
		printLEDnum( 0x4 );
		while (1) ;
	}
	sdcard_read_hdr();
    DMAptr_at_trigger = 0;

    while (1) {
    
		/* Verify space availability on SD card. This is a poor method
           to track or restrict space usage and only used temporarily
           for quick testing. */
        if (total_trials > 64) {
            toggle_LEDs_forever();
        }

        /* Wait for trigger. */
		printLEDnum( 0x00 );
		k = 0;
		j = 0;
		while (!TRIGGER) { /* Wait for trigger (Port C1 pin driven up to Vdd). */
			k++;
			if (k > 1000) {
				j++;
				k = 0;
				if (j > 1000) {
					LED2 ^= 1; /* Waiting for trigger indicator */
					j = 0;
				}
			}
        }
		__asm__ volatile ( "DISI #0x3FFF" );
		/* Temporarily block interrupts with priority level < 7;
           in particular, DMA5 channel block transfer handler. */
        DMAptr_at_trigger = DSADR; /* Trigger point. */
        DMAptr_at_trigger &= 0x07F8; /* Clear lower 3 bits to ensure
                                        alignment with 4-sample group
                                        (because there are 4 mic
                                        channels). */
        
        trigger_hit = 1; /* Flag that we just received trigger signal */
        LED1 = 1; /* Echo this on pin RC3. */
		__asm__ volatile ( "DISI #0" ); /* Unblock all interrupts. */
        while (trigger_hit) ;
            
        LED1 = 0; /* Indicate recording complete. */
        first_int_since_trigger = 1; /* In preparation for the next trial capture. */

        /* Add this trial to the SD card.
		   */
		start_sectorptr = sectorptr;
        sdcard_transfer_data();
		sdcard_hdr_addtrial( start_sectorptr, 0xDEAD,
							 0xBEEF,
							 posttrigger_len );
		/* Note that we do not update the SD card header with this new
		   trial until after copying has completed. This is to improve
		   confidence in results and more easily allow trial recording
		   abortions. */

        __asm__ volatile ( "DISI #0x3FFF" );
        init_SRAM_write(); /* Reset DMA/SRAM unit writing related stuff. */
        num_dmablocks = NUM_DMABLOCKS_PER_SRAM;
        DMAptr_at_trigger = 0; /* Unlock SRAM units, begin capturing A/D data stream again. */
        __asm__ volatile ( "DISI #0" );

    }
    
    AD1CON1bits.ADON = 0;
    DMA5CONbits.CHEN = 0;
    printLEDword( DMAptr_at_trigger );

	return 0;
}