MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { cw = new QWidget(this); scope = new QMainCanvas(cw); setCentralWidget(cw); scope->xMinInd = 0; scope->xMaxInd = 1024; saveDir = ""; ConstructGUI(); SetValidators(); SetScales(channelScaleBox->currentData().toFloat()); SetOffsets(); ConnectSignalsSlots(); // display actual channels settings emit selectChannelBox->currentIndexChanged(selectChannelBox->currentIndex()); runIDLine->setText("1"); disableWhenAcquisitionRunning << triggerSourceBox << typeOfTriggerBox << triggerLevelBox << setTriggerLevelButton << channelHScaleBox << eventsRequiredBox << horizontalPositionBox << horizontalPositionButton << saveChannelsMenu << saveWfBox << runIDLine ; }
void UCanvasPanelSlot::SynchronizeProperties() { SetOffsets(LayoutData.Offsets); SetAnchors(LayoutData.Anchors); SetAlignment(LayoutData.Alignment); SetAutoSize(bAutoSize); SetZOrder(ZOrder); }
void COffsetDlg::OnChangeEditOffsetFactor() { UpdateData(); m_FactorSlidCtrl.SetPos(int(m_Units)); SetOffsets(m_Factor,m_Units); }
// Sets the offsets in directory entries void CResourceEditor::SetOffsets(CResourceDirectory* resDir, DWORD newResDirAt) { for (int i = 0; i < resDir->CountEntries(); i++) { if (resDir->GetEntry(i)->IsDataDirectory()) { PIMAGE_RESOURCE_DIRECTORY_ENTRY(resDir->GetEntry(i)->m_dwWrittenAt)->DataIsDirectory = 1; PIMAGE_RESOURCE_DIRECTORY_ENTRY(resDir->GetEntry(i)->m_dwWrittenAt)->OffsetToDirectory = resDir->GetEntry(i)->GetSubDirectory()->m_dwWrittenAt - newResDirAt; SetOffsets(resDir->GetEntry(i)->GetSubDirectory(), newResDirAt); } else { PIMAGE_RESOURCE_DIRECTORY_ENTRY(resDir->GetEntry(i)->m_dwWrittenAt)->OffsetToData = resDir->GetEntry(i)->GetDataEntry()->m_dwWrittenAt - newResDirAt; } } }
void COffsetDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // Setting the m_Factor value at m_FactorSlidCtrl position m_Factor = m_FactorSlidCtrl.GetPos(); // Setting the m_Units value at m_UnitsSlidCtrl position m_Units = m_UnitsSlidCtrl.GetPos(); UpdateData(FALSE); SetOffsets(m_Factor,m_Units); CDialog::OnHScroll(nSBCode, nPos, pScrollBar); }
BOOL COffsetDlg::OnInitDialog() { CDialog::OnInitDialog(); // Initializing the ComboBox SetOffsets(m_Factor,m_Units); // Setting the m_FactorSlidCtrl position at floor(m_Factor) value (because slider position is an integer) m_FactorSlidCtrl.SetRange(FactorMinValue, FactorMaxValue, TRUE); m_FactorSlidCtrl.SetPos( (int) floor(m_Factor)); // Setting the m_UnitsSlidCtrl position at floor(m_Units) value (because slider position is an integer) m_UnitsSlidCtrl.SetRange(UnitsMinValue, UnitsMaxValue, TRUE); m_UnitsSlidCtrl.SetPos( (int) floor(m_Units)); UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE }
void UCanvasPanelSlot::SetDesiredPosition(FVector2D InPosition) { FVector2D Delta = FVector2D(InPosition.X - LayoutData.Offsets.Left, InPosition.Y - LayoutData.Offsets.Top); FMargin NewOffset = LayoutData.Offsets; NewOffset.Left += Delta.X; NewOffset.Top += Delta.Y; // If the slot is stretched horizontally we need to move the right side as it no longer represents width, but // now represents margin from the right stretched side. if ( LayoutData.Anchors.IsStretchedHorizontal() ) { NewOffset.Right -= Delta.X; } // If the slot is stretched vertically we need to move the bottom side as it no longer represents width, but // now represents margin from the bottom stretched side. if ( LayoutData.Anchors.IsStretchedVertical() ) { NewOffset.Bottom -= Delta.Y; } SetOffsets(NewOffset); }
// This function writes into a given place in memory (pbRsrcSec) the edited resource section void CResourceEditor::WriteRsrcSec(BYTE* pbRsrcSec) { BYTE* seeker = pbRsrcSec; queue<CResourceDirectory*> qDirs; // Used to scan the tree by level queue<CResourceDataEntry*> qDataEntries; // Used for writing the data entries queue<CResourceDataEntry*> qDataEntries2; // Used for writing raw resources data queue<CResourceDirectoryEntry*> qStrings; // Used for writing resources' names qDirs.push(m_cResDir); while (!qDirs.empty()) { CResourceDirectory* crd = qDirs.front(); CopyMemory(seeker, &crd->GetInfo(), sizeof(IMAGE_RESOURCE_DIRECTORY)); crd->m_dwWrittenAt = DWORD(seeker); seeker += sizeof(IMAGE_RESOURCE_DIRECTORY); for (int i = 0; i < crd->CountEntries(); i++) { if (crd->GetEntry(i)->HasName()) qStrings.push(crd->GetEntry(i)); if (crd->GetEntry(i)->IsDataDirectory()) qDirs.push(crd->GetEntry(i)->GetSubDirectory()); else { qDataEntries.push(crd->GetEntry(i)->GetDataEntry()); qDataEntries2.push(crd->GetEntry(i)->GetDataEntry()); } IMAGE_RESOURCE_DIRECTORY_ENTRY rDirE = {0,}; rDirE.DataIsDirectory = crd->GetEntry(i)->IsDataDirectory(); rDirE.Id = (crd->GetEntry(i)->HasName()) ? 0 : crd->GetEntry(i)->GetId(); rDirE.NameIsString = (crd->GetEntry(i)->HasName()) ? 1 : 0; CopyMemory(seeker, &rDirE, sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY)); crd->GetEntry(i)->m_dwWrittenAt = DWORD(seeker); seeker += sizeof(IMAGE_RESOURCE_DIRECTORY_ENTRY); } qDirs.pop(); } /* * Write IMAGE_RESOURCE_DATA_ENTRYs. */ while (!qDataEntries.empty()) { CResourceDataEntry* cRDataE = qDataEntries.front(); IMAGE_RESOURCE_DATA_ENTRY rDataE = {0,}; rDataE.CodePage = cRDataE->GetCodePage(); rDataE.Size = cRDataE->GetSize(); CopyMemory(seeker, &rDataE, sizeof(IMAGE_RESOURCE_DATA_ENTRY)); cRDataE->m_dwWrittenAt = DWORD(seeker); seeker += sizeof(IMAGE_RESOURCE_DATA_ENTRY); qDataEntries.pop(); } /* * Write strings */ while (!qStrings.empty()) { CResourceDirectoryEntry* cRDirE = qStrings.front(); PIMAGE_RESOURCE_DIRECTORY_ENTRY(cRDirE->m_dwWrittenAt)->NameOffset = DWORD(seeker) - DWORD(pbRsrcSec); char* szName = cRDirE->GetName(); WORD iLen = lstrlen(szName); WCHAR* szwName = new WCHAR[iLen+1]; // MultiByteToWideChar return value includes the null char, so -1 iLen = MultiByteToWideChar(CP_ACP, 0, szName, iLen, szwName, iLen) - 1; *(WORD*)seeker = iLen; seeker += sizeof(WORD); CopyMemory(seeker, szwName, iLen*sizeof(WCHAR)); seeker += iLen*sizeof(WCHAR); // Even though the number of chars is predefined a null termination is required *(WORD*)seeker = 0; seeker += sizeof(WORD); delete [] szName; delete [] szwName; qStrings.pop(); } /* * Write raw resource data and set offsets in IMAGE_RESOURCE_DATA_ENTRYs. */ while (!qDataEntries2.empty()) { CResourceDataEntry* cRDataE = qDataEntries2.front(); CopyMemory(seeker, cRDataE->GetData(), cRDataE->GetSize()); PIMAGE_RESOURCE_DATA_ENTRY(cRDataE->m_dwWrittenAt)->OffsetToData = seeker - pbRsrcSec + m_dwResourceSectionVA; seeker += RALIGN(cRDataE->GetSize(), 8); qDataEntries2.pop(); } /* * Set all of the directory entries offsets. */ SetOffsets(m_cResDir, DWORD(pbRsrcSec)); }
void UCanvasPanelSlot::SetDesiredSize(FVector2D InSize) { SetOffsets(FMargin(LayoutData.Offsets.Left, LayoutData.Offsets.Top, InSize.X, InSize.Y)); }
// update the lines instance variables, determining if there have // been any changes in the line void scTextline::Set( short lineCount, eBreakType breakType, scLINERefData& lineData ) { BOOL changed; scXRect exrect = lineData.fInkExtents; scAssert( lineData.fInkExtents.Valid() ); TypeSpec ts = lineData.GetMaxLeadSpec(); scCachedStyle& cs = scCachedStyle::GetCachedStyle( ts ); if ( fOrigin == lineData.fOrg && fLength == lineData.fComputedLen && GetCharCount() == lineData.GetCharCount() && fLineCount == lineCount && fLspAdjustment == lineData.fLetterSpace && fInkExtents == lineData.fInkExtents && Marked( scLASTLINE ) && ( breakType == eEndStreamBreak ) && fMaxLead == lineData.fEndLead.GetLead() && fMaxLeadSpec == lineData.GetMaxLeadSpec() ) { changed = false; } else changed = true; if ( !changed ) { if ( fColumn->GetFlowdir().IsVertical() ) { changed = ( fCursorY1 == lineData.fOrg.x + cs.GetCursorX1() ) && ( fCursorY2 == lineData.fOrg.x + cs.GetCursorX2() ); } else { changed = ( fCursorY1 == lineData.fOrg.y + cs.GetCursorY1() ) && ( fCursorY2 == lineData.fOrg.y + cs.GetCursorY2() ); } } SetOffsets( lineData.GetStartCharOffset(), lineData.GetEndCharOffset() ); if ( changed ) { fOrigin = lineData.fOrg; fVJOffset = 0; fLength = lineData.fComputedLen; fLineCount = lineCount; if ( breakType == eEndStreamBreak ) Mark( scLASTLINE ); else Unmark( scLASTLINE ); fLspAdjustment = lineData.fLetterSpace; fInkExtents = lineData.fInkExtents; fMaxLead = lineData.fEndLead.GetLead(); fMaxLeadSpec = lineData.GetMaxLeadSpec(); // fMaxLeadSpec if ( fColumn->GetFlowdir().IsVertical() ) { fCursorY1 = lineData.fOrg.x + cs.GetCursorX1(); fCursorY2 = lineData.fOrg.x + cs.GetCursorX2(); lineData.fInkExtents.x1 = fCursorY1; lineData.fInkExtents.x2 = fCursorY2; if ( !lineData.GetStartCharOffset() && scCachedStyle::GetParaStyle().GetNumbered() ) lineData.fInkExtents.y1 -= scCachedStyle::GetParaStyle().GetBulletIndent(); } else { fCursorY1 = lineData.fOrg.y + cs.GetCursorY1(); fCursorY2 = lineData.fOrg.y + cs.GetCursorY2(); lineData.fInkExtents.y1 = fCursorY1; lineData.fInkExtents.y2 = fCursorY2; if ( !lineData.GetStartCharOffset() && scCachedStyle::GetParaStyle().GetNumbered() ) lineData.fInkExtents.x1 -= scCachedStyle::GetParaStyle().GetBulletIndent(); } fInkExtents.Union( lineData.fInkExtents ); } if ( fColumn->GetFlowdir().IsVertical() && lineData.fColShapeType & eVertFlex ) SetFlexLineAdjustment( lineData.fRagSetting ); else if ( lineData.fColShapeType & eHorzFlex ) SetFlexLineAdjustment( lineData.fRagSetting ); else SetFlexLineAdjustment( eNoRag ); lineData.fLastLineLen = lineData.fComputedLen; if ( changed ) fColumn->Mark( scREPAINT ); scAssertValid( false ); }
bool GCodes::ActOnGcode(GCodeBuffer *gb) { int code; float value; int iValue; char* str; bool result = true; bool error = false; bool resend = false; bool seen; char reply[STRING_LENGTH]; reply[0] = 0; if(gb->Seen('G')) { code = gb->GetIValue(); switch(code) { case 0: // There are no rapid moves... case 1: // Ordinary move result = SetUpMove(gb); break; case 4: // Dwell result = DoDwell(gb); break; case 10: // Set offsets result = SetOffsets(gb); break; case 20: // Inches (which century are we living in, here?) distanceScale = INCH_TO_MM; break; case 21: // mm distanceScale = 1.0; break; case 28: // Home if(NoHome()) { homeAxisMoveCount = 0; homeX = gb->Seen(gCodeLetters[X_AXIS]); homeY = gb->Seen(gCodeLetters[Y_AXIS]); homeZ = gb->Seen(gCodeLetters[Z_AXIS]); if(NoHome()) { homeX = true; homeY = true; homeZ = true; } } result = DoHome(); break; case 30: // Z probe/manually set at a position and set that as point P result = SetSingleZProbeAtAPosition(gb); break; case 31: // Return the probe value, or set probe variables result = SetPrintZProbe(gb, reply); break; case 32: // Probe Z at multiple positions and generate the bed transform result = DoMultipleZProbe(); break; case 90: // Absolute coordinates drivesRelative = false; axesRelative = false; break; case 91: // Relative coordinates drivesRelative = true; // Non-axis movements (i.e. extruders) axesRelative = true; // Axis movements (i.e. X, Y and Z) break; case 92: // Set position result = SetPositions(gb); break; default: error = true; snprintf(reply, STRING_LENGTH, "invalid G Code: %s", gb->Buffer()); } if(result) HandleReply(error, gb == serialGCode, reply, 'G', code, resend); return result; } if(gb->Seen('M')) { code = gb->GetIValue(); switch(code) { case 0: // Stop case 1: // Sleep if(fileBeingPrinted != NULL) { fileToPrint = fileBeingPrinted; fileBeingPrinted = NULL; } if(!DisableDrives()) return false; if(!StandbyHeaters()) return false; // Should never happen break; case 18: // Motors off result = DisableDrives(); break; case 20: // Deprecated... if(platform->Emulating() == me || platform->Emulating() == reprapFirmware) snprintf(reply, STRING_LENGTH, "GCode files:\n%s", platform->GetMassStorage()->FileList(platform->GetGCodeDir(), gb == serialGCode)); else snprintf(reply, STRING_LENGTH, "%s", platform->GetMassStorage()->FileList(platform->GetGCodeDir(), gb == serialGCode)); break; case 21: // Initialise SD - ignore break; case 23: // Set file to print QueueFileToPrint(gb->GetUnprecedentedString()); if(platform->Emulating() == marlin) snprintf(reply, STRING_LENGTH, "%s", "File opened\nFile selected\n"); break; case 24: // Print/resume-printing the selected file if(fileBeingPrinted != NULL) break; fileBeingPrinted = fileToPrint; fileToPrint = NULL; break; case 25: // Pause the print fileToPrint = fileBeingPrinted; fileBeingPrinted = NULL; break; case 27: // Report print status - Depricated if(this->PrintingAFile()) strncpy(reply, "SD printing.", STRING_LENGTH); else strncpy(reply, "Not SD printing.", STRING_LENGTH); break; case 28: // Write to file str = gb->GetUnprecedentedString(); OpenFileToWrite(platform->GetGCodeDir(), str, gb); snprintf(reply, STRING_LENGTH, "Writing to file: %s", str); break; case 29: // End of file being written; should be intercepted before getting here platform->Message(HOST_MESSAGE, "GCode end-of-file being interpreted.\n"); break; case 82: for(int8_t extruder = AXES; extruder < DRIVES; extruder++) lastPos[extruder - AXES] = 0.0; drivesRelative = false; break; case 83: for(int8_t extruder = AXES; extruder < DRIVES; extruder++) lastPos[extruder - AXES] = 0.0; drivesRelative = true; break; case 84: // Motors off - deprecated, use M18 result = DisableDrives(); break; case 85: // Set inactive time break; case 92: // Set/report steps/mm for some axes seen = false; for(int8_t drive = 0; drive < DRIVES; drive++) if(gb->Seen(gCodeLetters[drive])) { platform->SetDriveStepsPerUnit(drive, gb->GetFValue()); seen = true; } reprap.GetMove()->SetStepHypotenuse(); if(!seen) snprintf(reply, STRING_LENGTH, "Steps/mm: X: %d, Y: %d, Z: %d, E: %d", (int)platform->DriveStepsPerUnit(X_AXIS), (int)platform->DriveStepsPerUnit(Y_AXIS), (int)platform->DriveStepsPerUnit(Z_AXIS), (int)platform->DriveStepsPerUnit(AXES)); // FIXME - needs to do multiple extruders break; case 98: if(gb->Seen('P')) result = DoFileCannedCycles(gb->GetString()); break; case 99: result = FileCannedCyclesReturn(); break; case 104: // Depricated if(gb->Seen('S')) { reprap.GetHeat()->SetActiveTemperature(1, gb->GetFValue()); // 0 is the bed reprap.GetHeat()->Activate(1); } break; case 105: // Deprecated... strncpy(reply, "T:", STRING_LENGTH); for(int8_t heater = HEATERS - 1; heater > 0; heater--) { strncat(reply, ftoa(0, reprap.GetHeat()->GetTemperature(heater), 1), STRING_LENGTH); strncat(reply, " ", STRING_LENGTH); } strncat(reply, "B:", STRING_LENGTH); strncat(reply, ftoa(0, reprap.GetHeat()->GetTemperature(0), 1), STRING_LENGTH); break; case 106: // Fan on or off if(gb->Seen('S')) platform->CoolingFan(gb->GetFValue()); break; case 107: // Fan off - depricated platform->CoolingFan(0.0); break; case 110: // Set line numbers - line numbers are dealt with in the GCodeBuffer class, so ignore break; case 111: // Debug level if(gb->Seen('S')) reprap.SetDebug(gb->GetIValue()); break; case 112: // Emergency stop - acted upon in Webserver break; case 114: // Deprecated str = GetCurrentCoordinates(); if(str != 0) { strncpy(reply, str, STRING_LENGTH); } else result = false; break; case 115: // Print firmware version snprintf(reply, STRING_LENGTH, "FIRMWARE_NAME:%s FIRMWARE_VERSION:%s ELECTRONICS:%s DATE:%s", NAME, VERSION, ELECTRONICS, DATE); break; case 109: // Depricated if(gb->Seen('S')) { reprap.GetHeat()->SetActiveTemperature(1, gb->GetFValue()); // 0 is the bed reprap.GetHeat()->Activate(1); } case 116: // Wait for everything, especially set temperatures if(!AllMovesAreFinishedAndMoveBufferIsLoaded()) return false; result = reprap.GetHeat()->AllHeatersAtSetTemperatures(); break; case 120: result = Push(); break; case 121: result = Pop(); break; case 122: reprap.Diagnostics(); break; case 126: // Valve open platform->Message(HOST_MESSAGE, "M126 - valves not yet implemented\n"); break; case 127: // Valve closed platform->Message(HOST_MESSAGE, "M127 - valves not yet implemented\n"); break; case 135: // Set PID sample interval break; case 140: // Set bed temperature if(gb->Seen('S')) { reprap.GetHeat()->SetActiveTemperature(0, gb->GetFValue()); reprap.GetHeat()->Activate(0); } break; case 141: // Chamber temperature platform->Message(HOST_MESSAGE, "M141 - heated chamber not yet implemented\n"); break; case 201: // Set axis accelerations for(int8_t drive = 0; drive < DRIVES; drive++) { if(gb->Seen(gCodeLetters[drive])) { value = gb->GetFValue(); }else{ value = -1; } platform->SetAcceleration(drive, value); } break; case 203: // Set maximum feedrates for(int8_t drive = 0; drive < DRIVES; drive++) { if(gb->Seen(gCodeLetters[drive])) { value = gb->GetFValue()*distanceScale*0.016666667; // G Code feedrates are in mm/minute; we need mm/sec; platform->SetMaxFeedrate(drive, value); } } break; case 205: //M205 advanced settings: minimum travel speed S=while printing T=travel only, B=minimum segment time X= maximum xy jerk, Z=maximum Z jerk break; case 206: // Offset axes result = OffsetAxes(gb); break; case 208: // Set maximum axis lengths for(int8_t axis = 0; axis < AXES; axis++) { if(gb->Seen(gCodeLetters[axis])) { value = gb->GetFValue()*distanceScale; platform->SetAxisLength(axis, value); } } break; case 210: // Set homing feedrates for(int8_t axis = 0; axis < AXES; axis++) { if(gb->Seen(gCodeLetters[axis])) { value = gb->GetFValue()*distanceScale*0.016666667; platform->SetHomeFeedRate(axis, value); } } break; case 301: // Set PID values break; case 302: // Allow cold extrudes break; case 304: // Set thermistor parameters break; case 503: // list variable settings result = SendConfigToLine(); break; case 550: // Set machine name if(gb->Seen('P')) reprap.GetWebserver()->SetName(gb->GetString()); break; case 551: // Set password if(gb->Seen('P')) reprap.GetWebserver()->SetPassword(gb->GetString()); break; case 552: // Set/Get IP address if(gb->Seen('P')) SetEthernetAddress(gb, code); else { byte *ip = platform->IPAddress(); snprintf(reply, STRING_LENGTH, "IP address: %d.%d.%d.%d\n ", ip[0], ip[1], ip[2], ip[3]); } break; case 553: // Set/Get netmask if(gb->Seen('P')) SetEthernetAddress(gb, code); else { byte *nm = platform->NetMask(); snprintf(reply, STRING_LENGTH, "Net mask: %d.%d.%d.%d\n ", nm[0], nm[1], nm[2], nm[3]); } break; case 554: // Set/Get gateway if(gb->Seen('P')) SetEthernetAddress(gb, code); else { byte *gw = platform->GateWay(); snprintf(reply, STRING_LENGTH, "Gateway: %d.%d.%d.%d\n ", gw[0], gw[1], gw[2], gw[3]); } break; case 555: // Set firmware type to emulate if(gb->Seen('P')) platform->SetEmulating((Compatibility)gb->GetIValue()); break; case 556: // Axis compensation if(gb->Seen('S')) { value = gb->GetFValue(); for(int8_t axis = 0; axis < AXES; axis++) if(gb->Seen(gCodeLetters[axis])) reprap.GetMove()->SetAxisCompensation(axis, gb->GetFValue()/value); } break; case 557: // Set Z probe point coordinates if(gb->Seen('P')) { iValue = gb->GetIValue(); if(gb->Seen(gCodeLetters[X_AXIS])) reprap.GetMove()->SetXBedProbePoint(iValue, gb->GetFValue()); if(gb->Seen(gCodeLetters[Y_AXIS])) reprap.GetMove()->SetYBedProbePoint(iValue, gb->GetFValue()); } break; case 558: // Set Z probe type if(gb->Seen('P')) platform->SetZProbeType(gb->GetIValue()); break; case 559: // Upload config.g if(gb->Seen('P')) str = gb->GetString(); else str = platform->GetConfigFile(); OpenFileToWrite(platform->GetSysDir(), str, gb); snprintf(reply, STRING_LENGTH, "Writing to file: %s", str); break; case 560: // Upload reprap.htm str = INDEX_PAGE; OpenFileToWrite(platform->GetWebDir(), str, gb); snprintf(reply, STRING_LENGTH, "Writing to file: %s", str); break; case 561: reprap.GetMove()->SetIdentityTransform(); break; case 562: // Reset temperature fault - use with great caution if(gb->Seen('P')) { iValue = gb->GetIValue(); reprap.GetHeat()->ResetFault(iValue); } break; case 876: // TEMPORARY - this will go away... if(gb->Seen('P')) { iValue = gb->GetIValue(); if(iValue != 1) platform->SetHeatOn(0); else platform->SetHeatOn(1); } break; case 900: result = DoFileCannedCycles("homex.g"); break; case 901: result = DoFileCannedCycles("homey.g"); break; case 906: // Set Motor currents for(uint8_t i = 0; i < DRIVES; i++) { if(gb->Seen(gCodeLetters[i])) { value = gb->GetFValue(); // mA platform->SetMotorCurrent(i, value); } } break; case 998: if(gb->Seen('P')) { snprintf(reply, STRING_LENGTH, "%s", gb->GetIValue()); resend = true; } break; default: error = true; snprintf(reply, STRING_LENGTH, "invalid M Code: %s", gb->Buffer()); } if(result) HandleReply(error, gb == serialGCode, reply, 'M', code, resend); return result; } if(gb->Seen('T')) { code = gb->GetIValue(); if(code == selectedHead) { if(result) HandleReply(error, gb == serialGCode, reply, 'T', code, resend); return result; } error = true; for(int8_t i = AXES; i < DRIVES; i++) { if(selectedHead == i - AXES) reprap.GetHeat()->Standby(selectedHead + 1); // + 1 because 0 is the Bed } for(int8_t i = AXES; i < DRIVES; i++) { if(code == i - AXES) { selectedHead = code; reprap.GetHeat()->Activate(selectedHead + 1); // 0 is the Bed error = false; } } if(error) snprintf(reply, STRING_LENGTH, "Invalid T Code: %s", gb->Buffer()); if(result) HandleReply(error, gb == serialGCode, reply, 'T', code, resend); return result; } // An empty buffer jumps to here and gets discarded if(result) HandleReply(error, gb == serialGCode, reply, 'X', code, resend); return result; }