GCodeResult Display::Configure(GCodeBuffer& gb, const StringRef& reply) { bool seen = false; if (gb.Seen('P')) { seen = true; switch (gb.GetUIValue()) { case 1: // 12864 display if (lcd == nullptr) { lcd = new Lcd7920(LcdCSPin, fonts, ARRAY_SIZE(fonts)); } lcd->Init(); IoPort::SetPinMode(LcdBeepPin, OUTPUT_PWM_LOW); lcd->SetFont(SmallFontNumber); if (encoder == nullptr) { encoder = new RotaryEncoder(EncoderPinA, EncoderPinB, EncoderPinSw); encoder->Init(DefaultPulsesPerClick); } if (menu == nullptr) { menu = new Menu(*lcd); } menu->Load("main"); break; default: reply.copy("Unknown display type"); return GCodeResult::error; } } if (gb.Seen('E') && encoder != nullptr) { seen = true; encoder->Init(gb.GetIValue()); // configure encoder pulses per click and direction } if (!seen) { if (lcd != nullptr) { reply.printf("12864 display is configured, pulses-per-click is %d", encoder->GetPulsesPerClick()); } else { reply.copy("12864 display is not present or not configured"); } } return GCodeResult::ok; }
// Unmount the specified SD card, returning true if done, false if needs to be called again. // If an error occurs, return true with the error message in 'reply'. GCodeResult MassStorage::Unmount(size_t card, const StringRef& reply) { if (card >= NumSdCards) { reply.copy("SD card number out of range"); return GCodeResult::error; } reply.printf("SD card %u may now be removed", card); const unsigned int numFilesClosed = InternalUnmount(card, true); if (numFilesClosed != 0) { reply.catf(" (%u file(s) were closed)", numFilesClosed); } return GCodeResult::ok; }
void Tool::Print(StringRef& reply) { reply.printf("Tool %d - drives:", myNumber); char sep = ' '; for (size_t drive = 0; drive < driveCount; drive++) { reply.catf("%c%d", sep, drives[drive]); sep = ','; } reply.cat("; heaters (active/standby temps):"); sep = ' '; for (size_t heater = 0; heater < heaterCount; heater++) { reply.catf("%c%d (%.1f/%.1f)", sep, heaters[heater], activeTemperatures[heater], standbyTemperatures[heater]); sep = ','; } reply.cat("; xmap:"); sep = ' '; for (size_t xi = 0; xi < MAX_AXES; ++xi) { if ((xMapping & (1u << xi)) != 0) { reply.catf("%c%c", sep, GCodes::axisLetters[xi]); sep = ','; } } reply.cat("; fans:"); sep = ' '; for (size_t fi = 0; fi < NUM_FANS; ++fi) { if ((fanMapping & (1u << fi)) != 0) { reply.catf("%c%u", sep, fi); sep = ','; } } reply.catf("; status: %s", active ? "selected" : "standby"); }
// Write the parameter label line to a string void GridDefinition::WriteHeadingAndParameters(StringRef& s) const { s.printf("%s\n%.2f,%.2f,%.2f,%.2f,%.2f,%.2f,%u,%u\n", HeightMapLabelLine, xMin, xMax, yMin, yMax, radius, spacing, numX, numY); }
// Mount the specified SD card, returning true if done, false if needs to be called again. // If an error occurs, return true with the error message in 'reply'. // This may only be called to mount one card at a time. GCodeResult MassStorage::Mount(size_t card, const StringRef& reply, bool reportSuccess) { if (card >= NumSdCards) { reply.copy("SD card number out of range"); return GCodeResult::error; } SdCardInfo& inf = info[card]; MutexLocker lock1(fsMutex); MutexLocker lock2(inf.volMutex); if (!inf.mounting) { if (inf.isMounted) { if (AnyFileOpen(&inf.fileSystem)) { // Don't re-mount the card if any files are open on it reply.copy("SD card has open file(s)"); return GCodeResult::error; } (void)InternalUnmount(card, false); } inf.mountStartTime = millis(); inf.mounting = true; delay(2); } if (inf.cardState == CardDetectState::notPresent) { reply.copy("No SD card present"); inf.mounting = false; return GCodeResult::error; } if (inf.cardState != CardDetectState::present) { return GCodeResult::notFinished; // wait for debounce to finish } const sd_mmc_err_t err = sd_mmc_check(card); if (err != SD_MMC_OK && millis() - inf.mountStartTime < 5000) { delay(2); return GCodeResult::notFinished; } inf.mounting = false; if (err != SD_MMC_OK) { reply.printf("Cannot initialise SD card %u: %s", card, TranslateCardError(err)); return GCodeResult::error; } // Mount the file systems const char path[3] = { (char)('0' + card), ':', 0 }; const FRESULT mounted = f_mount(&inf.fileSystem, path, 1); if (mounted != FR_OK) { reply.printf("Cannot mount SD card %u: code %d", card, mounted); return GCodeResult::error; } inf.isMounted = true; if (reportSuccess) { float capacity = ((float)sd_mmc_get_capacity(card) * 1024) / 1000000; // get capacity and convert from Kib to Mbytes const char* capUnits; if (capacity >= 1000.0) { capacity /= 1000; capUnits = "Gb"; } else { capUnits = "Mb"; } reply.printf("%s card mounted in slot %u, capacity %.2f%s", TranslateCardType(sd_mmc_get_type(card)), card, (double)capacity, capUnits); } return GCodeResult::ok; }