diff --git a/src/boards/HeliTest/ScreenManager.cpp b/src/boards/HeliTest/ScreenManager.cpp index 2a83ee57d0bcf05d13cd4c8f47a202d86984bb93..d135babc96e9a7550e7dc23491cb1e6fdaa7f255 100644 --- a/src/boards/HeliTest/ScreenManager.cpp +++ b/src/boards/HeliTest/ScreenManager.cpp @@ -27,25 +27,28 @@ #include <miosix.h> #include <stdio.h> #include <sstream> - -using std::stringstream; +#include <string> using namespace miosix; +using namespace mxgui; +using std::string; using miosix::Thread; -using namespace mxgui; + const int MARGIN = 5; const int INTERSPACE = 13; -// 23 Available text lines +static char buffer[256]; +// 23 Available text lines // Screen is 240x320 pixels namespace RogallinaBoard { ScreenManager::ScreenManager(SensorManager* sm) - : display(DisplayManager::instance().getDisplay()), dc(display), dw(dc),sm(sm) + : display(DisplayManager::instance().getDisplay()), dc(display), dw(dc), + sm(sm) { D(printf("Screenmanager constructor\n")); clearScreen(); @@ -61,15 +64,18 @@ void ScreenManager::update() } void ScreenManager::fetchData() { - FastInterruptDisableLock iLock; - status_logger = logger.getLogStats(); - logger_started = logger.isStarted(); - logger_file = logger.getFileName(); + { + FastInterruptDisableLock iLock; - sensorData = sm->getSensorData(); - logging_sensors = sm->loggingSensors(); + status_logger = logger.getLogStats(); + logger_started = logger.isStarted(); + logger_file = logger.getFileName(); - status_fmm = sHeliFMM->getStatus(); + sensorData = sm->getSensorData(); + logging_sensors = sm->loggingSensors(); + + status_fmm = sHeliFMM->getStatus(); + } cpu_usage = sSystemDiagnostics->getCpuUsage(); min_stack = sSystemDiagnostics->getWorstStack(); @@ -86,8 +92,7 @@ void ScreenManager::drawScreen() // Disegna titolo writeLine(0, 0, "ROGALLINA CONTROLLER", green, black); - char buffer[50]; - sprintf(buffer, "T: %.3f s", miosix::getTick() / 1000.0f); + sprintf(buffer, "T: %-10.3f", miosix::getTick() / 1000.0f); writeLine(0, 140, buffer); drawRogallinaFMM(); @@ -98,16 +103,16 @@ void ScreenManager::drawScreen() void ScreenManager::drawRogallinaFMM() { - char buffer[50]; + string state; Color bgcolor = white, fgcolor = black; switch (status_fmm.state) { case HELISTATE_BOOTED: - sprintf(buffer, "State: BOOTED"); + state = "BOOTED"; break; case HELISTATE_CALIBRATION: - sprintf(buffer, "State: CALIBRATION"); + state = "CALIBRATION"; break; case HELISTATE_FAILED: { @@ -116,52 +121,52 @@ void ScreenManager::drawRogallinaFMM() switch (status_fmm.failReason) { case FMMFAIL_LOGGER: - sprintf(buffer, "State: LOGGER ERROR!!!!"); + state = "LOGGER ERROR"; break; case FMMFAIL_SENSOR: - sprintf(buffer, "State: SENSOR INIT ERROR!!!!"); + state = "SENSOR INIT ERROR"; break; default: - sprintf(buffer, "State: UNKNOWN ERROR!!!!"); + state = "UNKNOWN ERROR"; break; } break; } case HELISTATE_READY: - sprintf(buffer, "State: READY "); + state = "READY"; break; case HELISTATE_FREEFALL: - sprintf(buffer, "State: FREE FALL "); + state = "State: FREE FALL"; break; case HELISTATE_CUTTING: - sprintf(buffer, "State: CUTTING "); + state = "State: CUTTING"; break; case HELISTATE_DESCENDING: - sprintf(buffer, "State: DESCENDING "); + state = "State: DESCENDING"; break; case HELISTATE_STOPPING: - sprintf(buffer, "State: STOPPING "); + state = "State: STOPPING"; break; case HELISTATE_STOPPED: bgcolor = blue; fgcolor = white; - sprintf(buffer, "State: STOPPED "); + state = "State: STOPPED"; break; } + sprintf(buffer, "State: %-20s", state.c_str()); writeLine(1, 0, "STATE MACHINE"); writeLine(2, 0, buffer, fgcolor, bgcolor); } + void ScreenManager::drawLoggerStatus() { const int sl = 3; const int x1 = 0; const int x2 = 120; - char buffer[50]; - writeLine(sl, x1, "LOGGER"); - sprintf(buffer, "File: %s", logger_file.c_str()); + sprintf(buffer, "File: %-10s", logger_file.c_str()); writeLine(sl, x2, buffer); int logger_state = 0; // 0: ready, -1: disabled, 1: started @@ -174,35 +179,45 @@ void ScreenManager::drawLoggerStatus() else logger_state = logger_started ? 1 : 0; #endif - + string state; + Color fgColor = black; + Color bgColor = white; switch (logger_state) { case 0: - writeLine(sl + 1, x1, "Status: READY "); + state = "READY"; break; case 1: + bgColor = green; if (logging_sensors) - writeLine(sl + 1, x1, "Status: LOGGING (sens on) ", black, - green); + { + state = "LOGGING (sens on)"; + } else - writeLine(sl + 1, x1, "Status: LOGGING (sens off) ", black, - green); + { + state = "LOGGING (sens off)"; + } break; case 2: - writeLine(sl + 1, x1, "Status: STOPPED ", white, blue); + bgColor = blue; + state = "STOPPED"; break; case -1: - writeLine(sl + 1, x1, "Status: DISABLED ", white, red); + bgColor = red; + state = "DISABLED"; break; default: - writeLine(sl + 1, x1, "Status: UNKNOWN ", white, red); + bgColor = red; + state = "UNKNOWN"; break; } + sprintf(buffer, "Status: %-20s", state.c_str()); + writeLine(sl + 1, x1, buffer, fgColor, bgColor); - sprintf(buffer, "Dropped: %d", status_logger.statDroppedSamples); + sprintf(buffer, "Dropped: %8d", status_logger.statDroppedSamples); writeLine(sl + 2, x1, buffer); - sprintf(buffer, "Last error: %d", status_logger.statWriteError); + sprintf(buffer, "Last error: %8d", status_logger.statWriteError); writeLine(sl + 2, x2, buffer); } @@ -214,10 +229,8 @@ void ScreenManager::drawSensorSamples() const int x2 = 80; const int x3 = 160; - char buffer[30]; - writeLine(sl + 1, 0, "IMU"); - sprintf(buffer, "Compass: %.2f ", sensorData.mpu9255_data.compass); + sprintf(buffer, "Compass: %-8.2f", sensorData.mpu9255_data.compass); writeLine(sl + 1, (x2 + x3) / 2, buffer); writeLine(sl + 2, x1, "ACC"); @@ -225,90 +238,89 @@ void ScreenManager::drawSensorSamples() writeLine(sl + 2, x3, "MAG"); // X - sprintf(buffer, "X: %.2f ", sensorData.mpu9255_data.accel.getX()); + sprintf(buffer, "X: %-8.2f", sensorData.mpu9255_data.accel.getX()); writeLine(sl + 3, x1, buffer); - sprintf(buffer, "X: %.2f ", sensorData.mpu9255_data.gyro.getX()); + sprintf(buffer, "X: %-8.2f", sensorData.mpu9255_data.gyro.getX()); writeLine(sl + 3, x2, buffer); - sprintf(buffer, "X: %.2f ", sensorData.mpu9255_data.magnet.getX()); + sprintf(buffer, "X: %-8.2f", sensorData.mpu9255_data.magnet.getX()); writeLine(sl + 3, x3, buffer); // Y - sprintf(buffer, "X: %.2f ", sensorData.mpu9255_data.accel.getY()); + sprintf(buffer, "Y: %-8.2f", sensorData.mpu9255_data.accel.getY()); writeLine(sl + 4, x1, buffer); - sprintf(buffer, "X: %.2f ", sensorData.mpu9255_data.gyro.getY()); + sprintf(buffer, "Y: %-8.2f", sensorData.mpu9255_data.gyro.getY()); writeLine(sl + 4, x2, buffer); - sprintf(buffer, "X: %.2f ", sensorData.mpu9255_data.magnet.getY()); + sprintf(buffer, "Y: %-8.2f", sensorData.mpu9255_data.magnet.getY()); writeLine(sl + 4, x3, buffer); // Z - sprintf(buffer, "X: %.2f ", sensorData.mpu9255_data.accel.getZ()); + sprintf(buffer, "Z: %-8.2f", sensorData.mpu9255_data.accel.getZ()); writeLine(sl + 5, x1, buffer); - sprintf(buffer, "X: %.2f ", sensorData.mpu9255_data.gyro.getZ()); + sprintf(buffer, "Z: %-8.2f", sensorData.mpu9255_data.gyro.getZ()); writeLine(sl + 5, x2, buffer); - sprintf(buffer, "X: %.2f ", sensorData.mpu9255_data.magnet.getZ()); + sprintf(buffer, "Z: %-8.2f", sensorData.mpu9255_data.magnet.getZ()); writeLine(sl + 5, x3, buffer); // YAW, PITCH, ROLL - sprintf(buffer, "YAW: %.2f ", sensorData.mpu9255_data.yaw); + sprintf(buffer, "YAW: %-8.2f", sensorData.mpu9255_data.yaw); writeLine(sl + 6, x1, buffer); - sprintf(buffer, "PTCH: %.2f ", sensorData.mpu9255_data.pitch); + sprintf(buffer, "PTCH: %-8.2f", sensorData.mpu9255_data.pitch); writeLine(sl + 6, x2, buffer); - sprintf(buffer, "ROLL: %.2f ", sensorData.mpu9255_data.roll); + sprintf(buffer, "ROLL: %-8.2f", sensorData.mpu9255_data.roll); writeLine(sl + 6, x3, buffer); // GPS writeLine(sl + 7, 0, "GPS"); - sprintf(buffer, "BUF COUNT: %d ", (int)sensorData.gps_data.buf_count); + sprintf(buffer, "BUF COUNT: %-3d", (int)sensorData.gps_data.buf_count); writeLine(sl + 7, x2, buffer); // INFO switch (sensorData.gps_data.fix) { case 0: - sprintf(buffer, "FIX: NOPE"); + sprintf(buffer, "FIX: NOPE "); break; case 1: - sprintf(buffer, "FIX: GPS FIX"); + sprintf(buffer, "FIX: GPS FIX "); break; case 2: sprintf(buffer, "FIX: AGPS FIX"); break; } writeLine(sl + 8, x1, buffer); - sprintf(buffer, "SATS: %d ", sensorData.gps_data.sats); + sprintf(buffer, "SATS: %-3d", sensorData.gps_data.sats); writeLine(sl + 9, x1, buffer); - sprintf(buffer, "TIME: %2d:%2d:%2d ", sensorData.gps_data.time.hours, + sprintf(buffer, "TIME: %2d:%2d:%2d", sensorData.gps_data.time.hours, sensorData.gps_data.time.minutes, sensorData.gps_data.time.seconds); writeLine(sl + 10, x1, buffer); // COORDS - sprintf(buffer, "LAT: %.2f ", sensorData.gps_data.lat); + sprintf(buffer, "LAT: %-8.2f", sensorData.gps_data.lat); writeLine(sl + 8, x2, buffer); - sprintf(buffer, "LON: %.2f ", sensorData.gps_data.lon); + sprintf(buffer, "LON: %-8.2f", sensorData.gps_data.lon); writeLine(sl + 9, x2, buffer); - sprintf(buffer, "ALT: %.2f ", sensorData.gps_data.alt); + sprintf(buffer, "ALT: %-8.2f", sensorData.gps_data.alt); writeLine(sl + 10, x2, buffer); // DIR, SPEED - sprintf(buffer, "SPD: %.2f ", sensorData.gps_data.speed); + sprintf(buffer, "SPD: %-8.2f", sensorData.gps_data.speed); writeLine(sl + 8, x3, buffer); - sprintf(buffer, "DIR: %.2f ", sensorData.gps_data.bearing); + sprintf(buffer, "DIR: %-8.2f", sensorData.gps_data.bearing); writeLine(sl + 9, x3, buffer); - sprintf(buffer, "L_U: %.1f s", sensorData.gps_data.timestamp / 1000.0f); + sprintf(buffer, "L_U: %-8.1f", sensorData.gps_data.timestamp / 1000.0f); writeLine(sl + 10, x3, buffer); // BAROMETER writeLine(sl + 11, 0, "BAROMETER"); - sprintf(buffer, "PRES: %.2f ", sensorData.bme280_data.pressure); + sprintf(buffer, "PRES: %-8.2f", sensorData.bme280_data.pressure); writeLine(sl + 12, x1, buffer); - sprintf(buffer, "TEMP: %.2f ", sensorData.bme280_data.temperature); - writeLine(sl + 12, x2, buffer); + sprintf(buffer, "TEMP: %-8.2f", sensorData.bme280_data.temperature); + writeLine(sl + 12, (x2 + x3)/2, buffer); } void ScreenManager::drawSystemStats() { - char buffer[70]; - sprintf(buffer, "CpuUsage: %3.1f Worst stack:%d %d bytes ", + sprintf(buffer, "CpuUsage: %4.1f Worst stack:%2d %6d bytes", cpu_usage, min_stack.thread_id, min_stack.abs_free_stack); writeLine(23, 0, buffer); }