Reworked exam mode, fixed #106

This commit is contained in:
M4x1m3
2019-12-27 16:48:45 +01:00
parent b7fe5b51c8
commit 9a9ae068ef
21 changed files with 102 additions and 116 deletions

View File

@@ -363,7 +363,7 @@ void AppsContainer::redrawWindow(bool force) {
}
void AppsContainer::activateExamMode(GlobalPreferences::ExamMode examMode) {
assert(examMode == GlobalPreferences::ExamMode::Standard || examMode == GlobalPreferences::ExamMode::Dutch);
assert(examMode == GlobalPreferences::ExamMode::Standard || examMode == GlobalPreferences::ExamMode::Dutch || examMode == GlobalPreferences::ExamMode::NoSym);
reset();
Preferences * preferences = Preferences::sharedPreferences();
switch ((int)preferences->colorOfLED()) {

View File

@@ -92,7 +92,7 @@ ExpiringPointer<Calculation> CalculationStore::push(const char * text, Context *
// Compute and serialize the outputs
{
Expression outputs[] = {Expression(), Expression()};
PoincareHelpers::ParseAndSimplifyAndApproximate(inputSerialization, &(outputs[0]), &(outputs[1]), context, GlobalPreferences::sharedGlobalPreferences()->isInExamMode() ? Preferences::sharedPreferences()->isExamSymbolic() : true); // Symbolic computation
PoincareHelpers::ParseAndSimplifyAndApproximate(inputSerialization, &(outputs[0]), &(outputs[1]), context, GlobalPreferences::sharedGlobalPreferences()->isInExamModeSymbolic()); // Symbolic computation
for (int i = 0; i < 2; i++) {
if (!serializeExpression(outputs[i], nextSerializationLocation, &newCalculationsLocation)) {
/* If the exat/approximate output does not fit in the store (event if the

View File

@@ -96,7 +96,7 @@ void ExamPopUpController::ContentView::setMessagesForExamMode(GlobalPreferences:
m_messageTextView1.setMessage(I18n::Message::ExitExamMode1);
m_messageTextView2.setMessage(I18n::Message::ExitExamMode2);
m_messageTextView3.setMessage(I18n::Message::Default);
} else if (mode == GlobalPreferences::ExamMode::Standard) {
} else if (mode == GlobalPreferences::ExamMode::Standard || mode == GlobalPreferences::ExamMode::NoSym) {
m_messageTextView1.setMessage(I18n::Message::ActiveExamModeMessage1);
m_messageTextView2.setMessage(I18n::Message::ActiveExamModeMessage2);
m_messageTextView3.setMessage(I18n::Message::ActiveExamModeMessage3);

View File

@@ -8,12 +8,17 @@ GlobalPreferences * GlobalPreferences::sharedGlobalPreferences() {
GlobalPreferences::ExamMode GlobalPreferences::examMode() const {
if (m_examMode == ExamMode::Unknown) {
uint8_t mode = Ion::ExamMode::FetchExamMode();
assert(mode >= 0 && mode < 3); // mode can be cast in ExamMode (Off, Standard or Dutch)
assert(mode >= 0 && mode < 4); // mode can be cast in ExamMode (Off, Standard, NoSym or Dutch)
m_examMode = (ExamMode)mode;
}
return m_examMode;
}
GlobalPreferences::ExamMode GlobalPreferences::tempExamMode() const {
return m_tempExamMode;
}
void GlobalPreferences::setExamMode(ExamMode mode) {
ExamMode currentMode = examMode();
if (currentMode == mode) {
@@ -21,12 +26,16 @@ void GlobalPreferences::setExamMode(ExamMode mode) {
}
assert(mode != ExamMode::Unknown);
int8_t deltaMode = (int8_t)mode - (int8_t)currentMode;
deltaMode = deltaMode < 0 ? deltaMode + 3 : deltaMode;
deltaMode = deltaMode < 0 ? deltaMode + 4 : deltaMode;
assert(deltaMode > 0);
Ion::ExamMode::IncrementExamMode(deltaMode);
m_examMode = mode;
}
void GlobalPreferences::setTempExamMode(ExamMode mode) {
m_tempExamMode = mode;
}
void GlobalPreferences::setBrightnessLevel(int brightnessLevel) {
if (m_brightnessLevel != brightnessLevel) {
brightnessLevel = brightnessLevel < 0 ? 0 : brightnessLevel;

View File

@@ -9,14 +9,18 @@ public:
Unknown = -1,
Off = 0,
Standard = 1,
Dutch = 2
NoSym = 2,
Dutch = 3,
};
static GlobalPreferences * sharedGlobalPreferences();
I18n::Language language() const { return m_language; }
void setLanguage(I18n::Language language) { m_language = language; }
bool isInExamMode() const { return (int8_t)examMode() > 0; }
bool isInExamModeSymbolic() const { return !((int8_t)examMode() > 1); }
ExamMode examMode() const;
ExamMode tempExamMode() const;
void setExamMode(ExamMode examMode);
void setTempExamMode(ExamMode examMode);
bool showPopUp() const { return m_showPopUp; }
void setShowPopUp(bool showPopUp) { m_showPopUp = showPopUp; }
int brightnessLevel() const { return m_brightnessLevel; }
@@ -26,12 +30,14 @@ private:
GlobalPreferences() :
m_language(I18n::Language::EN),
m_examMode(ExamMode::Unknown),
m_tempExamMode(ExamMode::Standard),
m_showPopUp(true),
m_brightnessLevel(Ion::Backlight::MaxBrightness) {}
I18n::Language m_language;
static_assert((int8_t)GlobalPreferences::ExamMode::Off == 0, "GlobalPreferences::isInExamMode() is not right");
static_assert((int8_t)GlobalPreferences::ExamMode::Unknown < 0, "GlobalPreferences::isInExamMode() is not right");
mutable ExamMode m_examMode;
mutable ExamMode m_tempExamMode;
bool m_showPopUp;
int m_brightnessLevel;
};

View File

@@ -9,7 +9,6 @@ ComplexFormat = "Komplex"
ExamMode = "Testmodus"
ActivateExamMode = "Starten Testmodus"
ExamModeActive = "Wieder starten Testmodus"
ActivateDutchExamMode = "Activate Dutch exam mode"
About = "Über"
Degrees = "Grad "
Gradians = "Gone "
@@ -30,6 +29,10 @@ SerialNumber = "Seriennummer"
UpdatePopUp = "Erinnerung: Update"
BetaPopUp = "Beta pop-up"
LEDColor = "LEDs farbe"
ExamModeMode = "Modus"
ExamModeModeStandard = "Standard "
ExamModeModeNoSym = "Ohne symbolisch "
ExamModeModeDutch = "Niederländisch "
ColorWhite = "Weiss "
ColorBlue = "Blau "
ColorGreen = "Grün "
@@ -48,4 +51,3 @@ SymbolMultiplicationCross = "Kreuz"
SymbolMultiplicationMiddleDot = "Mittelpunkt"
SymbolMultiplicationStar = "Stern"
SymbolMultiplicationAutoSymbol = "automatisch"
SymbolicEnabled = "Symbolische Berechnung"

View File

@@ -9,7 +9,6 @@ ComplexFormat = "Complex format"
ExamMode = "Exam mode"
ActivateExamMode = "Activate exam mode"
ExamModeActive = "Reactivate exam mode"
ActivateDutchExamMode = "Activate Dutch exam mode"
About = "About"
Degrees = "Degrees "
Gradians = "Gradians "
@@ -30,6 +29,10 @@ SerialNumber = "Serial number"
UpdatePopUp = "Update pop-up"
BetaPopUp = "Beta pop-up"
LEDColor = "LED color"
ExamModeMode = "Mode"
ExamModeModeStandard = "Standard "
ExamModeModeNoSym = "No sym "
ExamModeModeDutch = "Dutch "
ColorWhite = "White "
ColorBlue = "Blue "
ColorGreen = "Green "
@@ -48,4 +51,3 @@ SymbolMultiplicationCross = "Cross "
SymbolMultiplicationMiddleDot = "Dot "
SymbolMultiplicationStar = "Star "
SymbolMultiplicationAutoSymbol = "Auto "
SymbolicEnabled = "Symbolic calculation"

View File

@@ -9,7 +9,6 @@ ComplexFormat = "Forma compleja"
ExamMode = "Modo examen"
ActivateExamMode = "Activar el modo examen"
ExamModeActive = "Reactivar el modo examen"
ActivateDutchExamMode = "Activate Dutch exam mode"
About = "Acerca"
Degrees = "Grados "
Gradians = "Gradianes "
@@ -30,6 +29,10 @@ SerialNumber = "Número serie"
UpdatePopUp = "Pop-up de actualización"
BetaPopUp = "Beta pop-up"
LEDColor = "Color del LED"
ExamModeMode = "Modo"
ExamModeModeStandard = "Estándar "
ExamModeModeNoSym = "Sin simbólico "
ExamModeModeDutch = "Holandés "
ColorWhite = "Blanco "
ColorBlue = "Azul "
ColorGreen = "Verde "
@@ -48,4 +51,3 @@ SymbolMultiplicationCross = "Contrariar "
SymbolMultiplicationMiddleDot = "Punto "
SymbolMultiplicationStar = "Estrella "
SymbolMultiplicationAutoSymbol = "Auto "
SymbolicEnabled = "Cálculo simbólico"

View File

@@ -9,7 +9,6 @@ ComplexFormat = "Forme complexe"
ExamMode = "Mode examen"
ActivateExamMode = "Activer le mode examen"
ExamModeActive = "Réactiver le mode examen"
ActivateDutchExamMode = "Activate Dutch exam mode"
About = "À propos"
Degrees = "Degrés "
Gradians = "Grades "
@@ -30,6 +29,10 @@ SerialNumber = "Numéro série"
UpdatePopUp = "Rappel mise à jour"
BetaPopUp = "Rappel version bêta"
LEDColor = "Couleur LED"
ExamModeMode = "Mode"
ExamModeModeStandard = "Standard "
ExamModeModeNoSym = "Sans symbolique "
ExamModeModeDutch = "Néerlandais "
ColorWhite = "Blanc "
ColorBlue = "Bleu "
ColorGreen = "Vert "
@@ -48,4 +51,3 @@ SymbolMultiplicationCross = "Croix"
SymbolMultiplicationMiddleDot = "Point"
SymbolMultiplicationStar = "Etoile"
SymbolMultiplicationAutoSymbol = "Automatique"
SymbolicEnabled = "Calcul symbolique"

View File

@@ -9,7 +9,6 @@ ComplexFormat = "Complexos"
ExamMode = "Modo de exame"
ActivateExamMode = "Ativar o modo de exame"
ExamModeActive = "Reativar o modo de exame"
ActivateDutchExamMode = "Activate Dutch exam mode"
About = "Acerca"
Degrees = "Graus "
Gradians = "Grados "
@@ -30,6 +29,10 @@ SerialNumber = "Número serie"
UpdatePopUp = "Alertas de atualização"
BetaPopUp = "Beta pop-up"
LEDColor = "Cor LED"
ExamModeMode = "Modo"
ExamModeModeStandard = "Padrão "
ExamModeModeNoSym = "Sem simbólico "
ExamModeModeDutch = "Holandês "
ColorWhite = "Branco "
ColorBlue = "Azul "
ColorGreen = "Verde "
@@ -48,4 +51,3 @@ SymbolMultiplicationCross = "crómio"
SymbolMultiplicationMiddleDot = "ponto médio"
SymbolMultiplicationStar = "estrela"
SymbolMultiplicationAutoSymbol = "automático"
SymbolicEnabled = "Cálculo simbólico"

View File

@@ -5,16 +5,17 @@ namespace Settings {
//sub-sub-menus
constexpr SettingsMessageTree s_ledColorChildren[4] = {SettingsMessageTree(I18n::Message::ColorWhite), SettingsMessageTree(I18n::Message::ColorGreen), SettingsMessageTree(I18n::Message::ColorBlue), SettingsMessageTree(I18n::Message::ColorYellow)};
constexpr SettingsMessageTree s_examModeMode[3] = {SettingsMessageTree(I18n::Message::ExamModeModeStandard), SettingsMessageTree(I18n::Message::ExamModeModeNoSym), SettingsMessageTree(I18n::Message::ExamModeModeDutch)};
constexpr SettingsMessageTree s_contributorsChildren[5] = {SettingsMessageTree(I18n::Message::QuentinGuidee), SettingsMessageTree(I18n::Message::DannySimmons), SettingsMessageTree(I18n::Message::JoachimLeFournis), SettingsMessageTree(I18n::Message::JeanBaptisteBoric), SettingsMessageTree(I18n::Message::MaximeFriess)};
constexpr SettingsMessageTree s_modelAngleChildren[3] = {SettingsMessageTree(I18n::Message::Degrees), SettingsMessageTree(I18n::Message::Radian), SettingsMessageTree(I18n::Message::Gradians)};
constexpr SettingsMessageTree s_modelEditionModeChildren[2] = {SettingsMessageTree(I18n::Message::Edition2D), SettingsMessageTree(I18n::Message::EditionLinear)};
constexpr SettingsMessageTree s_modelFloatDisplayModeChildren[4] = {SettingsMessageTree(I18n::Message::Decimal), SettingsMessageTree(I18n::Message::Scientific), SettingsMessageTree(I18n::Message::Engineering), SettingsMessageTree(I18n::Message::SignificantFigures)};
constexpr SettingsMessageTree s_modelComplexFormatChildren[3] = {SettingsMessageTree(I18n::Message::Real), SettingsMessageTree(I18n::Message::Cartesian), SettingsMessageTree(I18n::Message::Polar)};
constexpr SettingsMessageTree s_symbolChildren[4] = {SettingsMessageTree(I18n::Message::SymbolMultiplicationCross), SettingsMessageTree(I18n::Message::SymbolMultiplicationMiddleDot), SettingsMessageTree(I18n::Message::SymbolMultiplicationStar), SettingsMessageTree(I18n::Message::SymbolMultiplicationAutoSymbol)};
constexpr SettingsMessageTree s_symbolChildren[4] = {SettingsMessageTree(I18n::Message::SymbolMultiplicationCross),SettingsMessageTree(I18n::Message::SymbolMultiplicationMiddleDot),SettingsMessageTree(I18n::Message::SymbolMultiplicationStar),SettingsMessageTree(I18n::Message::SymbolMultiplicationAutoSymbol)};
//sub-menus
constexpr SettingsMessageTree s_modelMathOptionsChildren[5] = {SettingsMessageTree(I18n::Message::AngleUnit, s_modelAngleChildren, 3), SettingsMessageTree(I18n::Message::DisplayMode, s_modelFloatDisplayModeChildren, 4), SettingsMessageTree(I18n::Message::EditionMode, s_modelEditionModeChildren, 2), SettingsMessageTree(I18n::Message::ComplexFormat, s_modelComplexFormatChildren, 3), SettingsMessageTree(I18n::Message::SymbolMultiplication, s_symbolChildren, 4)};
constexpr SettingsMessageTree s_modelExamChildren[4] = {SettingsMessageTree(I18n::Message::LEDColor, s_ledColorChildren, 4), SettingsMessageTree(I18n::Message::SymbolicEnabled), SettingsMessageTree(I18n::Message::ActivateExamMode), SettingsMessageTree(I18n::Message::ActivateDutchExamMode)};
constexpr SettingsMessageTree s_modelExamChildren[3] = {SettingsMessageTree(I18n::Message::LEDColor, s_ledColorChildren, 4), SettingsMessageTree(I18n::Message::ExamModeMode, s_examModeMode, 3), SettingsMessageTree(I18n::Message::ActivateExamMode)};
constexpr SettingsMessageTree s_accessibilityChildren[6] = {SettingsMessageTree(I18n::Message::AccessibilityInvertColors), SettingsMessageTree(I18n::Message::AccessibilityMagnify),SettingsMessageTree(I18n::Message::AccessibilityGamma),SettingsMessageTree(I18n::Message::AccessibilityGammaRed),SettingsMessageTree(I18n::Message::AccessibilityGammaGreen),SettingsMessageTree(I18n::Message::AccessibilityGammaBlue)};
#ifdef USERNAME
constexpr SettingsMessageTree s_modelAboutChildren[7] = {SettingsMessageTree(I18n::Message::Username), SettingsMessageTree(I18n::Message::SoftwareVersion), SettingsMessageTree(I18n::Message::CustomSoftwareVersion), SettingsMessageTree(I18n::Message::MicroPythonVersion), SettingsMessageTree(I18n::Message::SerialNumber), SettingsMessageTree(I18n::Message::FccId), SettingsMessageTree(I18n::Message::Contributors, s_contributorsChildren, 5)};

View File

@@ -6,6 +6,7 @@ namespace Settings {
// TODO: factorize most parts of the final models with main_controller_prompt_beta and main_controller_prompt_update
//sub-sub-menus
constexpr SettingsMessageTree s_ledColorChildren[4] = {SettingsMessageTree(I18n::Message::ColorWhite), SettingsMessageTree(I18n::Message::ColorGreen), SettingsMessageTree(I18n::Message::ColorBlue), SettingsMessageTree(I18n::Message::ColorYellow)};
constexpr SettingsMessageTree s_examModeMode[3] = {SettingsMessageTree(I18n::Message::ExamModeModeStandard), SettingsMessageTree(I18n::Message::ExamModeModeNoSym), SettingsMessageTree(I18n::Message::ExamModeModeDutch)};
constexpr SettingsMessageTree s_contributorsChildren[5] = {SettingsMessageTree(I18n::Message::QuentinGuidee), SettingsMessageTree(I18n::Message::DannySimmons), SettingsMessageTree(I18n::Message::JoachimLeFournis), SettingsMessageTree(I18n::Message::JeanBaptisteBoric), SettingsMessageTree(I18n::Message::MaximeFriess)};
constexpr SettingsMessageTree s_modelAngleChildren[3] = {SettingsMessageTree(I18n::Message::Degrees), SettingsMessageTree(I18n::Message::Radian), SettingsMessageTree(I18n::Message::Gradians)};
constexpr SettingsMessageTree s_modelEditionModeChildren[2] = {SettingsMessageTree(I18n::Message::Edition2D), SettingsMessageTree(I18n::Message::EditionLinear)};
@@ -15,7 +16,7 @@ constexpr SettingsMessageTree s_symbolChildren[4] = {SettingsMessageTree(I18n::M
//sub-menus
constexpr SettingsMessageTree s_modelMathOptionsChildren[5] = {SettingsMessageTree(I18n::Message::AngleUnit, s_modelAngleChildren, 3), SettingsMessageTree(I18n::Message::DisplayMode, s_modelFloatDisplayModeChildren, 4), SettingsMessageTree(I18n::Message::EditionMode, s_modelEditionModeChildren, 2), SettingsMessageTree(I18n::Message::ComplexFormat, s_modelComplexFormatChildren, 3), SettingsMessageTree(I18n::Message::SymbolMultiplication, s_symbolChildren, 4)};
constexpr SettingsMessageTree s_modelExamChildren[4] = {SettingsMessageTree(I18n::Message::LEDColor, s_ledColorChildren, 4), SettingsMessageTree(I18n::Message::SymbolicEnabled), SettingsMessageTree(I18n::Message::ActivateExamMode), SettingsMessageTree(I18n::Message::ActivateDutchExamMode)};
constexpr SettingsMessageTree s_modelExamChildren[3] = {SettingsMessageTree(I18n::Message::LEDColor, s_ledColorChildren, 4), SettingsMessageTree(I18n::Message::ExamModeMode, s_examModeMode, 3), SettingsMessageTree(I18n::Message::ActivateExamMode)};
constexpr SettingsMessageTree s_accessibilityChildren[6] = {SettingsMessageTree(I18n::Message::AccessibilityInvertColors), SettingsMessageTree(I18n::Message::AccessibilityMagnify),SettingsMessageTree(I18n::Message::AccessibilityGamma),SettingsMessageTree(I18n::Message::AccessibilityGammaRed),SettingsMessageTree(I18n::Message::AccessibilityGammaGreen),SettingsMessageTree(I18n::Message::AccessibilityGammaBlue)};
#ifdef USERNAME
constexpr SettingsMessageTree s_modelAboutChildren[7] = {SettingsMessageTree(I18n::Message::Username), SettingsMessageTree(I18n::Message::SoftwareVersion), SettingsMessageTree(I18n::Message::CustomSoftwareVersion), SettingsMessageTree(I18n::Message::MicroPythonVersion), SettingsMessageTree(I18n::Message::SerialNumber), SettingsMessageTree(I18n::Message::FccId), SettingsMessageTree(I18n::Message::Contributors, s_contributorsChildren, 5)};
@@ -27,7 +28,7 @@ constexpr SettingsMessageTree s_modelMenu[] =
{SettingsMessageTree(I18n::Message::MathOptions, s_modelMathOptionsChildren, 5),
SettingsMessageTree(I18n::Message::Brightness),
SettingsMessageTree(I18n::Message::Language),
SettingsMessageTree(I18n::Message::ExamMode, s_modelExamChildren, 4),
SettingsMessageTree(I18n::Message::ExamMode, s_modelExamChildren, 3),
SettingsMessageTree(I18n::Message::Accessibility, s_accessibilityChildren, 6),
#ifdef USERNAME
SettingsMessageTree(I18n::Message::About, s_modelAboutChildren, 7)};

View File

@@ -5,6 +5,7 @@ namespace Settings {
//sub-sub-menus
constexpr SettingsMessageTree s_ledColorChildren[4] = {SettingsMessageTree(I18n::Message::ColorWhite), SettingsMessageTree(I18n::Message::ColorGreen), SettingsMessageTree(I18n::Message::ColorBlue), SettingsMessageTree(I18n::Message::ColorYellow)};
constexpr SettingsMessageTree s_examModeMode[3] = {SettingsMessageTree(I18n::Message::ExamModeModeStandard), SettingsMessageTree(I18n::Message::ExamModeModeNoSym), SettingsMessageTree(I18n::Message::ExamModeModeDutch)};
constexpr SettingsMessageTree s_contributorsChildren[5] = {SettingsMessageTree(I18n::Message::QuentinGuidee), SettingsMessageTree(I18n::Message::DannySimmons), SettingsMessageTree(I18n::Message::JoachimLeFournis), SettingsMessageTree(I18n::Message::JeanBaptisteBoric), SettingsMessageTree(I18n::Message::MaximeFriess)};
constexpr SettingsMessageTree s_modelAngleChildren[3] = {SettingsMessageTree(I18n::Message::Degrees), SettingsMessageTree(I18n::Message::Radian), SettingsMessageTree(I18n::Message::Gradians)};
constexpr SettingsMessageTree s_modelEditionModeChildren[2] = {SettingsMessageTree(I18n::Message::Edition2D), SettingsMessageTree(I18n::Message::EditionLinear)};
@@ -14,7 +15,7 @@ constexpr SettingsMessageTree s_symbolChildren[4] = {SettingsMessageTree(I18n::M
//sub-menus
constexpr SettingsMessageTree s_modelMathOptionsChildren[5] = {SettingsMessageTree(I18n::Message::AngleUnit, s_modelAngleChildren, 3), SettingsMessageTree(I18n::Message::DisplayMode, s_modelFloatDisplayModeChildren, 4), SettingsMessageTree(I18n::Message::EditionMode, s_modelEditionModeChildren, 2), SettingsMessageTree(I18n::Message::ComplexFormat, s_modelComplexFormatChildren, 3), SettingsMessageTree(I18n::Message::SymbolMultiplication, s_symbolChildren, 4)};
constexpr SettingsMessageTree s_modelExamChildren[4] = {SettingsMessageTree(I18n::Message::LEDColor, s_ledColorChildren, 4), SettingsMessageTree(I18n::Message::SymbolicEnabled), SettingsMessageTree(I18n::Message::ActivateExamMode), SettingsMessageTree(I18n::Message::ActivateDutchExamMode)};
constexpr SettingsMessageTree s_modelExamChildren[3] = {SettingsMessageTree(I18n::Message::LEDColor, s_ledColorChildren, 4), SettingsMessageTree(I18n::Message::ExamModeMode, s_examModeMode, 3), SettingsMessageTree(I18n::Message::ActivateExamMode)};
constexpr SettingsMessageTree s_accessibilityChildren[6] = {SettingsMessageTree(I18n::Message::AccessibilityInvertColors), SettingsMessageTree(I18n::Message::AccessibilityMagnify),SettingsMessageTree(I18n::Message::AccessibilityGamma),SettingsMessageTree(I18n::Message::AccessibilityGammaRed),SettingsMessageTree(I18n::Message::AccessibilityGammaGreen),SettingsMessageTree(I18n::Message::AccessibilityGammaBlue)};
#ifdef USERNAME
constexpr SettingsMessageTree s_modelAboutChildren[7] = {SettingsMessageTree(I18n::Message::Username), SettingsMessageTree(I18n::Message::SoftwareVersion), SettingsMessageTree(I18n::Message::CustomSoftwareVersion), SettingsMessageTree(I18n::Message::MicroPythonVersion), SettingsMessageTree(I18n::Message::SerialNumber), SettingsMessageTree(I18n::Message::FccId), SettingsMessageTree(I18n::Message::Contributors, s_contributorsChildren, 5)};

View File

@@ -17,23 +17,12 @@ ExamModeController::ExamModeController(Responder * parentResponder) :
m_preferencesController(this),
m_examModeCell(I18n::Message::Default, KDFont::LargeFont),
m_ledCell(KDFont::LargeFont, KDFont::SmallFont),
m_symbolicCell(I18n::Message::SymbolicEnabled, KDFont::LargeFont),
m_cell{ MessageTableCell(I18n::Message::ExamModeActive, KDFont::LargeFont), MessageTableCell(I18n::Message::ActivateDutchExamMode, KDFont::LargeFont) }
m_modeCell(KDFont::LargeFont, KDFont::SmallFont)
{
}
int ExamModeController::initialSelectedRow() const {
int row = selectedRow();
if (row >= numberOfRows()) {
return numberOfRows()-1;
} else if (row < 0) {
return 0;
}
return row;
}
bool ExamModeController::handleEvent(Ion::Events::Event event) {
I18n::Message childLabel = m_messageTreeModel->children(selectedRow())->label();
I18n::Message childLabel = m_messageTreeModel->children(selectedRow())->label();
if (event == Ion::Events::OK || event == Ion::Events::EXE || event == Ion::Events::Right) {
if (GlobalPreferences::sharedGlobalPreferences()->isInExamMode()) {
// If the exam mode is already on, this re-activate the same exam mode
@@ -41,72 +30,43 @@ bool ExamModeController::handleEvent(Ion::Events::Event event) {
if (childLabel == I18n::Message::ActivateExamMode || childLabel == I18n::Message::ExamModeActive)
AppsContainer::sharedAppsContainer()->displayExamModePopUp(mode);
return true;
} else if (childLabel == I18n::Message::ActivateDutchExamMode) {
GlobalPreferences::ExamMode mode = GlobalPreferences::ExamMode::Dutch;
if (childLabel == I18n::Message::ActivateExamMode || childLabel == I18n::Message::ExamModeActive)
AppsContainer::sharedAppsContainer()->displayExamModePopUp(mode);
return true;
}
if (childLabel == I18n::Message::ActivateExamMode || childLabel == I18n::Message::ExamModeActive) {
AppsContainer::sharedAppsContainer()->displayExamModePopUp(GlobalPreferences::sharedGlobalPreferences()->examMode());
GlobalPreferences::ExamMode mode = GlobalPreferences::ExamMode::Standard;
AppsContainer::sharedAppsContainer()->displayExamModePopUp(GlobalPreferences::sharedGlobalPreferences()->tempExamMode());
return true;
}
if (childLabel == I18n::Message::LEDColor) {
if (childLabel == I18n::Message::LEDColor || childLabel == I18n::Message::ExamModeMode) {
GenericSubController * subController = &m_preferencesController;
subController->setMessageTreeModel(m_messageTreeModel->children(selectedRow()));
StackViewController * stack = stackController();
stack->push(subController);
return true;
}
if (childLabel == I18n::Message::SymbolicEnabled) {
Preferences * preferences = Preferences::sharedPreferences();
preferences->setExamSymbolic(!preferences->isExamSymbolic());
m_selectableTableView.reloadData();
return true;
}
}
return GenericSubController::handleEvent(event);
}
int ExamModeController::numberOfRows() const {
if (GlobalPreferences::sharedGlobalPreferences()->language() != I18n::Language::EN || GlobalPreferences::sharedGlobalPreferences()->isInExamMode()) {
return 1;
}
return GenericSubController::numberOfRows();
}
HighlightCell * ExamModeController::reusableCell(int index, int type) {
assert(index == 0);
if (type == 0) {
return &m_ledCell;
assert(type == 0);
assert(index >= 0 && index < 3);
switch(index) {
case 0:
return &m_ledCell;
case 1:
return &m_modeCell;
case 2:
return &m_examModeCell;
}
if (type == 1) {
return &m_symbolicCell;
}
return &m_examModeCell;
}
int ExamModeController::reusableCellCount(int type) {
switch (type) {
case 0:
return 1;
case 1:
return 1;
case 2:
return 1;
default:
assert(false);
return 0;
}
/*assert(type == 0);
assert(index >= 0 && index < k_maxNumberOfCells);
return &m_cell[index];*/
assert(type == 0);
return 3;
}
/*int ExamModeController::reusableCellCount(int type) {
return k_maxNumberOfCells;
}*/
void ExamModeController::willDisplayCellForIndex(HighlightCell * cell, int index) {
Preferences * preferences = Preferences::sharedPreferences();
GenericSubController::willDisplayCellForIndex(cell, index);
@@ -121,24 +81,10 @@ void ExamModeController::willDisplayCellForIndex(HighlightCell * cell, int index
I18n::Message message = (I18n::Message) m_messageTreeModel->children(index)->children((int)preferences->colorOfLED())->label();
myTextCell->setSubtitle(message);
}
if (thisLabel == I18n::Message::SymbolicEnabled) {
MessageTableCellWithSwitch * mySwitchCell = (MessageTableCellWithSwitch *)cell;
SwitchView * mySwitch = (SwitchView *)mySwitchCell->accessoryView();
mySwitch->setState(preferences->isExamSymbolic());
}
}
int ExamModeController::typeAtLocation(int i, int j) {
switch (j) {
case 0:
return 0;
case 1:
return 1;
case 2:
return 2;
default:
assert(false);
return 0;
if (thisLabel == I18n::Message::ExamModeMode) {
MessageTableCellWithChevronAndMessage * myTextCell = (MessageTableCellWithChevronAndMessage *)cell;
I18n::Message message = (I18n::Message) m_messageTreeModel->children(index)->children((uint8_t)GlobalPreferences::sharedGlobalPreferences()->tempExamMode() - 1)->label();
myTextCell->setSubtitle(message);
}
}

View File

@@ -10,19 +10,14 @@ class ExamModeController : public GenericSubController {
public:
ExamModeController(Responder * parentResponder);
bool handleEvent(Ion::Events::Event event) override;
int numberOfRows() const override;
HighlightCell * reusableCell(int index, int type) override;
int reusableCellCount(int type) override;
void willDisplayCellForIndex(HighlightCell * cell, int index) override;
int typeAtLocation(int i, int j) override;
private:
MessageTableCell m_examModeCell;
MessageTableCellWithChevronAndMessage m_ledCell;
MessageTableCellWithChevronAndMessage m_modeCell;
PreferencesController m_preferencesController;
MessageTableCellWithSwitch m_symbolicCell;
int initialSelectedRow() const override;
static constexpr int k_maxNumberOfCells = 2;
MessageTableCell m_cell[k_maxNumberOfCells];
};
}

View File

@@ -128,6 +128,24 @@ Layout PreferencesController::layoutForPreferences(I18n::Message message) {
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
// Exam mode modes
case I18n::Message::ExamModeModeStandard:
{
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
case I18n::Message::ExamModeModeNoSym:
{
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
case I18n::Message::ExamModeModeDutch:
{
const char * text = " ";
return LayoutHelper::String(text, strlen(text), k_layoutFont);
}
// Symbol controller
case I18n::Message::SymbolMultiplicationCross: // × and · aren't single characters, so they cannot be constructed into codepoints..?
@@ -182,6 +200,8 @@ void PreferencesController::setPreferenceWithValueIndex(I18n::Message message, i
preferences->setComplexFormat((Preferences::ComplexFormat)valueIndex);
} else if (message == I18n::Message::LEDColor) {
preferences->setColorOfLED((Preferences::LEDColor)valueIndex);
} else if (message == I18n::Message::ExamModeMode) {
GlobalPreferences::sharedGlobalPreferences()->setTempExamMode((GlobalPreferences::ExamMode)((uint8_t)valueIndex + 1));
} else if (message == I18n::Message::SymbolMultiplication) {
preferences->setSymbolMultiplication((Preferences::SymbolMultiplication)valueIndex);
}

View File

@@ -85,7 +85,7 @@ void TitleBarView::refreshPreferences() {
char buffer[bufferSize];
int numberOfChar = 0;
Preferences * preferences = Preferences::sharedPreferences();
if (GlobalPreferences::sharedGlobalPreferences()->isInExamMode() && Preferences::sharedPreferences()->isExamSymbolic()) {
if (GlobalPreferences::sharedGlobalPreferences()->isInExamModeSymbolic()) {
// Display "cas" if in exam mode with symbolic computation enabled
numberOfChar += strlcpy(buffer+numberOfChar, I18n::translate(I18n::Message::Sym), bufferSize - numberOfChar);
assert(numberOfChar < bufferSize-1);

View File

@@ -9,7 +9,7 @@ namespace LED {
KDColor updateColorWithPlugAndCharge() {
KDColor ledColor = getColor();
if (GlobalPreferences::sharedGlobalPreferences()->isInExamMode()) { // If exam mode is on, we do not update the LED with the plugged/charging state
if (!GlobalPreferences::sharedGlobalPreferences()->isInExamMode()) { // If exam mode is on, we do not update the LED with the plugged/charging state
if (USB::isPlugged()) {
ledColor = Battery::isCharging() ? KDColorOrange : KDColorGreen;
} else {

View File

@@ -18,12 +18,13 @@ char ones[Config::ExamModeBufferSize]
/* The exam mode is written in flash so that it is resilient to resets.
* We erase the dedicated flash sector (all bits written to 1) and, upon
* deactivating or activating standard or Dutch exam mode we write one or two
* deactivating or activating standard, nosym or Dutch exam mode we write one, two or tree
* bits to 0. To determine in which exam mode we are, we count the number of
* leading 0 bits. If it is equal to:
* - 0[3]: the exam mode is off;
* - 1[3]: the standard exam mode is activated;
* - 2[3]: the Dutch exam mode is activated. */
* - 2[3]: the NoSym exam mode is activated.
* - 3[3]: the Dutch exam mode is activated. */
/* significantExamModeAddress returns the first uint32_t * in the exam mode
* flash sector that does not point to 0. If this flash sector has only 0s or
@@ -76,14 +77,14 @@ uint8_t * SignificantExamModeAddress() {
uint8_t FetchExamMode() {
uint8_t * readingAddress = SignificantExamModeAddress();
// Count the number of 0[3] before reading address
uint32_t nbOfZerosBefore = ((readingAddress - (uint8_t *)&_exam_mode_buffer_start) * numberOfBitsInByte) % 3;
uint32_t nbOfZerosBefore = ((readingAddress - (uint8_t *)&_exam_mode_buffer_start) * numberOfBitsInByte) % 4;
// Count the number of 0[3] at reading address
size_t numberOfLeading0 = (numberOfBitsInByte - numberOfBitsAfterLeadingZeroes(*readingAddress)) % 3;
return (nbOfZerosBefore + numberOfLeading0) % 3;
size_t numberOfLeading0 = (numberOfBitsInByte - numberOfBitsAfterLeadingZeroes(*readingAddress)) % 4;
return (nbOfZerosBefore + numberOfLeading0) % 4;
}
void IncrementExamMode(uint8_t delta) {
assert(delta == 1 || delta == 2);
assert(delta == 1 || delta == 2 || delta == 3);
uint8_t * writingAddress = SignificantExamModeAddress();
assert(*writingAddress != 0);
size_t nbOfTargetedOnes = numberOfBitsAfterLeadingZeroes(*writingAddress);

View File

@@ -64,8 +64,6 @@ public:
void setColorOfLED(LEDColor color) { m_colorOfLED = color; }
SymbolMultiplication symbolofMultiplication() const {return m_symbolMultiplication;}
void setSymbolMultiplication(SymbolMultiplication symbolofMultiplication) {m_symbolMultiplication = symbolofMultiplication;}
bool isExamSymbolic() const {return m_examSymbolic;}
void setExamSymbolic(bool examSymbolic) {m_examSymbolic = examSymbolic;}
private:
AngleUnit m_angleUnit;
PrintFloatMode m_displayMode;
@@ -74,7 +72,6 @@ private:
uint8_t m_numberOfSignificantDigits;
LEDColor m_colorOfLED;
SymbolMultiplication m_symbolMultiplication;
bool m_examSymbolic;
};
}

View File

@@ -14,8 +14,7 @@ Preferences::Preferences() :
m_complexFormat(Preferences::ComplexFormat::Real),
m_numberOfSignificantDigits(PrintFloat::k_numberOfPrintedSignificantDigits),
m_colorOfLED(Preferences::LEDColor::White),
m_symbolMultiplication(Preferences::SymbolMultiplication::Auto),
m_examSymbolic(true)
m_symbolMultiplication(Preferences::SymbolMultiplication::Auto)
{}
Preferences * Preferences::sharedPreferences() {