diff --git a/.github/workflows/TestCompile.yml b/.github/workflows/TestCompile.yml index 4fd96e5..5cc9501 100644 --- a/.github/workflows/TestCompile.yml +++ b/.github/workflows/TestCompile.yml @@ -1,7 +1,7 @@ # TestCompile.yml # Github workflow script to test compile all examples of an Arduino library repository. # -# Copyright (C) 2020 Armin Joachimsmeyer +# Copyright (C) 2020-2023 Armin Joachimsmeyer # https://github.com/ArminJo/Github-Actions # @@ -16,16 +16,16 @@ jobs: - name: Checkout uses: actions/checkout@master -# - name: Checkout custom library -# uses: actions/checkout@v3 -# with: -# repository: ArminJo/Arduino-BlueDisplay -# ref: master -# path: CustomLibrary_BlueDisplay # must contain string "Custom" + - name: Checkout new BlueDisplay library + uses: actions/checkout@v3 + with: + repository: ArminJo/Arduino-BlueDisplay + ref: master + path: CustomLibrary_BD # must contain string "Custom" + # Must remove BlueDisplay from REQUIRED_LIBRARIES - name: Compile all examples uses: ArminJo/arduino-test-compile@master with: - sketch-names: SimpleDSO.cpp - build-properties: '{ "All": "-DUSE_SIMPLE_SERIAL" }' - required-libraries: BlueDisplay + sketch-names: SimpleDSO.ino +# required-libraries: BlueDisplay diff --git a/FrequencyGeneratorPage.hpp b/FrequencyGeneratorPage.hpp index 1b8d4f3..db3b891 100644 --- a/FrequencyGeneratorPage.hpp +++ b/FrequencyGeneratorPage.hpp @@ -16,7 +16,7 @@ * 2nd order (better for sawtooth): 1 kOhm and 22 nF -> 4.7 kOhm and 4.7 nF * * - * Copyright (C) 2015-2022 Armin Joachimsmeyer + * Copyright (C) 2015-2023 Armin Joachimsmeyer * Email: armin.joachimsmeyer@gmail.com * * This file is part of Arduino-Simple-DSO https://github.com/ArminJo/Arduino-Simple-DSO. @@ -28,8 +28,8 @@ * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . @@ -40,21 +40,10 @@ #if defined(AVR) #include "FrequencyGeneratorPage.h" -//#include "SimpleTouchScreenDSO.h" - -#include // for dtostrf - -#else -#include "Pages.h" -#include "main.h" // for StringBuffer -#include "TouchDSO.h" #endif #include "Waveforms.h" -#include // for printf -#include // for pow and log10f - static void (*sLastRedrawCallback)(void); #define COLOR_BACKGROUND_FREQ COLOR16_WHITE @@ -80,7 +69,7 @@ static void (*sLastRedrawCallback)(void); */ #if defined(AVR) const uint16_t FixedFrequencyButtonCaptions[NUMBER_OF_FIXED_FREQUENCY_BUTTONS] PROGMEM -= { 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000}; += { 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000 }; // the compiler cannot optimize 2 occurrences of the same PROGMEM string :-( const char StringmHz[] PROGMEM = "mHz"; @@ -89,11 +78,11 @@ const char String10Hz[] PROGMEM = "10Hz"; const char StringkHz[] PROGMEM = "kHz"; const char StringMHz[] PROGMEM = "MHz"; -const char* RangeButtonStrings[5] = {StringmHz, StringHz, String10Hz, StringkHz, StringMHz}; +const char *RangeButtonStrings[5] = { StringmHz, StringHz, String10Hz, StringkHz, StringMHz }; #else const uint16_t FixedFrequencyButtonCaptions[NUMBER_OF_FIXED_FREQUENCY_BUTTONS] = { 1, 2, 5, 10, 20, 50, 100, 200, 500, 1000 }; const char *const RangeButtonStrings[5] = { "mHz", "Hz", "10Hz", "kHz", "MHz" }; -const char FrequencyFactorChars[4] = { 'm', ' ', 'k', 'M' }; +const char FrequencyRangeChars[4] = { 'm', ' ', 'k', 'M' }; struct FrequencyInfoStruct sFrequencyInfo; #endif @@ -112,7 +101,7 @@ BDButton TouchButtonFrequencyStartStop; BDButton TouchButtonGetFrequency; BDButton TouchButtonWaveform; -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(SUPPORT_LOCAL_DISPLAY) BDButton TouchButton1; BDButton TouchButton2; BDButton TouchButton5; @@ -133,11 +122,11 @@ BDSlider TouchSliderFrequency; void initFrequencyGeneratorPageGui(void); -void doFrequencySlider(BDSlider *aTheTouchedSlider, uint16_t aValue); +void doSetFrequencyFromSliderValue(BDSlider *aTheTouchedSlider, uint16_t aFrequencySliderValue); void doWaveformMode(BDButton *aTheTouchedButton, int16_t aValue); -void doSetFixedFrequency(BDButton *aTheTouchedButton, int16_t aValue); -void doSetFrequencyRange(BDButton *aTheTouchedButton, int16_t aValue); +void doSetFixedFrequency(BDButton *aTheTouchedButton, int16_t aNormalizedFrequency); +void doSetFrequencyRange(BDButton *aTheTouchedButton, int16_t aInputRangeIndex); void doFrequencyGeneratorStartStop(BDButton *aTheTouchedButton, int16_t aValue); void doGetFrequency(BDButton *aTheTouchedButton, int16_t aValue); @@ -172,7 +161,7 @@ void initFrequencyGeneratorPage(void) { sFrequencyInfo.isOutputEnabled = true; // to start output at first display of page -#if !defined(LOCAL_DISPLAY_EXISTS) +#if !defined(SUPPORT_LOCAL_DISPLAY) initFrequencyGeneratorPageGui(); #endif } @@ -180,12 +169,12 @@ void initFrequencyGeneratorPage(void) { void startFrequencyGeneratorPage(void) { BlueDisplay1.clearDisplay(); -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(SUPPORT_LOCAL_DISPLAY) // do it here to enable freeing of button resources in stopFrequencyGeneratorPage() initFrequencyGeneratorPageGui(); #endif - setWaveformFrequency(); + setWaveformFrequencyFromNormalizedValues(); drawFrequencyGeneratorPage(); /* @@ -204,7 +193,7 @@ void loopFrequencyGeneratorPage(void) { } void stopFrequencyGeneratorPage(void) { -#if defined(BD_DRAW_TO_LOCAL_DISPLAY_TOO) +#if defined(SUPPORT_LOCAL_DISPLAY) // free buttons for (unsigned int i = 0; i < NUMBER_OF_FIXED_FREQUENCY_BUTTONS; ++i) { TouchButtonFixedFrequency[i]->deinit(); @@ -229,10 +218,15 @@ void stopFrequencyGeneratorPage(void) { void initFrequencyGeneratorPageGui() { // Frequency slider for 1 to 1000 at top of screen TouchSliderFrequency.init(FREQ_SLIDER_X, FREQ_SLIDER_Y, FREQ_SLIDER_SIZE, FREQ_SLIDER_MAX_VALUE, - FREQ_SLIDER_MAX_VALUE, 0, COLOR16_BLUE, COLOR16_GREEN, FLAG_SLIDER_SHOW_BORDER | FLAG_SLIDER_IS_HORIZONTAL, &doFrequencySlider); + FREQ_SLIDER_MAX_VALUE, 0, COLOR16_BLUE, COLOR16_GREEN, FLAG_SLIDER_SHOW_BORDER | FLAG_SLIDER_IS_HORIZONTAL, + &doSetFrequencyFromSliderValue); /* - * Fixed frequency buttons next. Example of button handling without button objects + * Fixed frequency buttons next. + * Example of button handling without button objects. + * We rely on button handles / ID's being simple integers and increasing by one for each init. + * We use a start button for initialization, which changes position, value and caption. + * We use the start button ID as start id for drawing all buttons. */ uint16_t tXPos = 0; uint16_t tFrequency; @@ -248,12 +242,12 @@ void initFrequencyGeneratorPageGui() { sprintf(sStringBuffer, "%u", tFrequency); #endif -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(SUPPORT_LOCAL_DISPLAY) TouchButtonFixedFrequency[i]->init(tXPos, 96, BUTTON_WIDTH_10, BUTTON_HEIGHT_6, COLOR16_BLUE, sStringBuffer, TEXT_SIZE_11, 0, tFrequency, &doSetFixedFrequency); #else - TouchButtonFirstFixedFrequency.init(tXPos, 92, - BUTTON_WIDTH_10, BUTTON_HEIGHT_6, COLOR16_BLUE, sStringBuffer, TEXT_SIZE_11, 0, tFrequency, &doSetFixedFrequency); + TouchButtonFirstFixedFrequency.init(tXPos, 98, BUTTON_WIDTH_10, BUTTON_HEIGHT_6, COLOR16_BLUE, sStringBuffer, TEXT_SIZE_11, + 0, tFrequency, &doSetFixedFrequency); #endif tXPos += BUTTON_WIDTH_10 + BUTTON_DEFAULT_SPACING_QUARTER; @@ -261,13 +255,13 @@ void initFrequencyGeneratorPageGui() { tFrequencyCaptionPtr++; #endif } -#if !defined(LOCAL_DISPLAY_EXISTS) +#if !defined(SUPPORT_LOCAL_DISPLAY) TouchButtonFirstFixedFrequency.mButtonHandle -= NUMBER_OF_FIXED_FREQUENCY_BUTTONS - 1; #endif // Range next tXPos = 0; - int tYPos = REMOTE_DISPLAY_HEIGHT - BUTTON_HEIGHT_4 - BUTTON_HEIGHT_5 - BUTTON_DEFAULT_SPACING; + int tYPos = DISPLAY_HEIGHT - BUTTON_HEIGHT_4 - BUTTON_HEIGHT_5 - BUTTON_DEFAULT_SPACING; for (int i = 0; i < NUMBER_OF_FREQUENCY_RANGE_BUTTONS; ++i) { uint16_t tButtonColor = BUTTON_AUTO_RED_GREEN_FALSE_COLOR; if (i == BUTTON_INDEX_SELECTED_INITIAL) { @@ -282,38 +276,38 @@ void initFrequencyGeneratorPageGui() { ActiveTouchButtonFrequencyRange = TouchButtonFrequencyRanges[BUTTON_INDEX_SELECTED_INITIAL]; - TouchButtonFrequencyStartStop.init(0, REMOTE_DISPLAY_HEIGHT - BUTTON_HEIGHT_4, BUTTON_WIDTH_3, BUTTON_HEIGHT_4, 0, F("Start"), + TouchButtonFrequencyStartStop.init(0, DISPLAY_HEIGHT - BUTTON_HEIGHT_4, BUTTON_WIDTH_3, BUTTON_HEIGHT_4, 0, F("Start"), TEXT_SIZE_26, FLAG_BUTTON_DO_BEEP_ON_TOUCH | FLAG_BUTTON_TYPE_TOGGLE_RED_GREEN, sFrequencyInfo.isOutputEnabled, &doFrequencyGeneratorStartStop); TouchButtonFrequencyStartStop.setCaptionForValueTrue(F("Stop")); - TouchButtonGetFrequency.init(BUTTON_WIDTH_3_POS_2, REMOTE_DISPLAY_HEIGHT - BUTTON_HEIGHT_4, BUTTON_WIDTH_3, + TouchButtonGetFrequency.init(BUTTON_WIDTH_3_POS_2, DISPLAY_HEIGHT - BUTTON_HEIGHT_4, BUTTON_WIDTH_3, BUTTON_HEIGHT_4, COLOR16_BLUE, F("Hz..."), TEXT_SIZE_22, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doGetFrequency); #if defined(AVR) - TouchButtonWaveform.init(BUTTON_WIDTH_3_POS_3, REMOTE_DISPLAY_HEIGHT - BUTTON_HEIGHT_4, BUTTON_WIDTH_3, - BUTTON_HEIGHT_4, COLOR16_BLUE, "", TEXT_SIZE_18, FLAG_BUTTON_DO_BEEP_ON_TOUCH, sFrequencyInfo.Waveform, &doWaveformMode); + TouchButtonWaveform.init(BUTTON_WIDTH_3_POS_3, DISPLAY_HEIGHT - BUTTON_HEIGHT_4, BUTTON_WIDTH_3, + BUTTON_HEIGHT_4, COLOR16_BLUE, "", TEXT_SIZE_18, FLAG_BUTTON_DO_BEEP_ON_TOUCH, sFrequencyInfo.Waveform, &doWaveformMode); setWaveformButtonCaption(); #endif } void drawFrequencyGeneratorPage(void) { // do not clear screen here since it is called periodically for GUI refresh while DSO is running - BDButton::deactivateAllButtons(); - BDSlider::deactivateAllSliders(); -#if defined(LOCAL_DISPLAY_EXISTS) + BDButton::deactivateAll(); + BDSlider::deactivateAll(); +#if !defined(ARDUINO) TouchButtonMainHome.drawButton(); #else TouchButtonBack.drawButton(); #endif TouchSliderFrequency.drawSlider(); - BlueDisplay1.drawText(TEXT_SIZE_11_WIDTH, FREQ_SLIDER_Y + 3 * FREQ_SLIDER_SIZE + TEXT_SIZE_11_HEIGHT, F("1"), - TEXT_SIZE_11, COLOR16_BLUE, COLOR_BACKGROUND_FREQ); + BlueDisplay1.drawText(TEXT_SIZE_11_WIDTH, FREQ_SLIDER_Y + 3 * FREQ_SLIDER_SIZE + TEXT_SIZE_11_HEIGHT, F("1"), TEXT_SIZE_11, + COLOR16_BLUE, COLOR_BACKGROUND_FREQ); #if defined(AVR) - BlueDisplay1.drawText(REMOTE_DISPLAY_WIDTH - 5 * TEXT_SIZE_11_WIDTH, - FREQ_SLIDER_Y + 3 * FREQ_SLIDER_SIZE + TEXT_SIZE_11_HEIGHT, F("1000"), TEXT_SIZE_11, COLOR16_BLUE, - COLOR_BACKGROUND_FREQ); + BlueDisplay1.drawText(DISPLAY_WIDTH - 5 * TEXT_SIZE_11_WIDTH, + FREQ_SLIDER_Y + 3 * FREQ_SLIDER_SIZE + TEXT_SIZE_11_HEIGHT, F("1000"), TEXT_SIZE_11, COLOR16_BLUE, + COLOR_BACKGROUND_FREQ); #else BlueDisplay1.drawText(BlueDisplay1.getDisplayWidth() - 5 * TEXT_SIZE_11_WIDTH, FREQ_SLIDER_Y + 3 * FREQ_SLIDER_SIZE + TEXT_SIZE_11_HEIGHT, ("1000"), TEXT_SIZE_11, COLOR16_BLUE, @@ -322,10 +316,7 @@ void drawFrequencyGeneratorPage(void) { // fixed frequency buttons // we know that the buttons handles are increasing numbers -#if !defined(LOCAL_DISPLAY_EXISTS) - BDButton tButton(TouchButtonFirstFixedFrequency); -#endif -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(SUPPORT_LOCAL_DISPLAY) for (uint8_t i = 0; i < NUMBER_OF_FIXED_FREQUENCY_BUTTONS - 1; ++i) { // Generate strings each time buttons are drawn since only the pointer to caption is stored in button sprintf(sStringBuffer, "%u", FixedFrequencyButtonCaptions[i]); @@ -336,9 +327,10 @@ void drawFrequencyGeneratorPage(void) { TouchButtonFixedFrequency[NUMBER_OF_FIXED_FREQUENCY_BUTTONS - 1]->setCaption("1k"); TouchButtonFixedFrequency[NUMBER_OF_FIXED_FREQUENCY_BUTTONS - 1]->drawButton(); #else + BDButton tButton(TouchButtonFirstFixedFrequency); for (uint8_t i = 0; i < NUMBER_OF_FIXED_FREQUENCY_BUTTONS; ++i) { tButton.drawButton(); - tButton.mButtonHandle++; + tButton.mButtonHandle++; // Simply increment id to get the next button } #endif @@ -357,95 +349,97 @@ void drawFrequencyGeneratorPage(void) { } /* - * correct the GUI values with factor 10 for 10HzRange + * Handle the 10HzRange of frequency GUI */ -void setFrequencyNormalizedForGUI(float aGUIFrequencyValue) { +void setFrequencyNormalizedForGUI(float aNormalizedFrequency) { if (is10HzRange) { - if (aGUIFrequencyValue <= 100) { - setNormalizedFrequencyFactor(FREQUENCY_FACTOR_INDEX_HERTZ); - aGUIFrequencyValue *= 10; + // we must dynamically change frequency range + if (aNormalizedFrequency <= 100) { + setNormalizedFrequencyFactorFromRangeIndex(FREQUENCY_RANGE_INDEX_HERTZ); + aNormalizedFrequency *= 10; } else { - setNormalizedFrequencyFactor(FREQUENCY_FACTOR_INDEX_KILO_HERTZ); - aGUIFrequencyValue /= 100; + setNormalizedFrequencyFactorFromRangeIndex(FREQUENCY_RANGE_INDEX_KILO_HERTZ); + aNormalizedFrequency /= 100; } } - sFrequencyInfo.FrequencyNormalized = aGUIFrequencyValue; + sFrequencyInfo.FrequencyNormalizedTo_1_to_1000 = aNormalizedFrequency; } #pragma GCC diagnostic ignored "-Wunused-parameter" -/* - * Slider handlers +/** + * Convert linear slider value to exponential normalized frequency from 1 to 1000 */ -void doFrequencySlider(BDSlider *aTheTouchedSlider, uint16_t aValue) { - float tValueFloat = aValue; - tValueFloat = tValueFloat / (FREQ_SLIDER_MAX_VALUE / 3); // gives 0-3 +void doSetFrequencyFromSliderValue(BDSlider *aTheTouchedSlider, uint16_t aFrequencySliderValue) { + float tNormalizedFrequencyFloat = aFrequencySliderValue; + tNormalizedFrequencyFloat = tNormalizedFrequencyFloat / (FREQ_SLIDER_MAX_VALUE / 3); // gives 0-3 // 950 byte program memory required for pow() and log10f() - tValueFloat = (pow(10, tValueFloat)); // normalize value to 1-1000 - setFrequencyNormalizedForGUI(tValueFloat); + tNormalizedFrequencyFloat = (pow(10, tNormalizedFrequencyFloat)); // normalize value to 1-1000 + setFrequencyNormalizedForGUI(tNormalizedFrequencyFloat); setWaveformFrequencyAndPrintValues(); } -/* - * Button handlers - */ -#if defined(AVR) -void setWaveformButtonCaption(void) { - TouchButtonWaveform.setCaptionPGM(getWaveformModePGMString(), (DisplayControl.DisplayPage == DISPLAY_PAGE_FREQUENCY)); -} -#endif - -void doWaveformMode(BDButton *aTheTouchedButton, int16_t aValue) { -#if defined(AVR) - cycleWaveformMode(); - setWaveformButtonCaption(); -#endif -} - /** * Set frequency to fixed value 1,2,5,10...,1000 */ -void doSetFixedFrequency(BDButton *aTheTouchedButton, int16_t aValue) { - setFrequencyNormalizedForGUI(aValue); +void doSetFixedFrequency(BDButton *aTheTouchedButton, int16_t aNormalizedFrequency) { + setFrequencyNormalizedForGUI(aNormalizedFrequency); + // Play error feedback tone, if frequency is not available for this waveform bool tErrorOrClippingHappend = setWaveformFrequencyAndPrintValues(); -#if defined(LOCAL_DISPLAY_EXISTS) - FeedbackTone(tErrorOrClippingHappend); +#if defined(SUPPORT_LOCAL_DISPLAY) + LocalTouchButton::playFeedbackTone(tErrorOrClippingHappend); #else - BlueDisplay1.playFeedbackTone(tErrorOrClippingHappend); + BDButton::playFeedbackTone(tErrorOrClippingHappend); #endif } /** - * sets the unit (mHz - MHz) - * set color for old and new button + * Sets the frequency range (mHz - MHz) + * Set color for old and new button */ -void doSetFrequencyRange(BDButton *aTheTouchedButton, int16_t aValue) { +void doSetFrequencyRange(BDButton *aTheTouchedButton, int16_t aInputRangeIndex) { if (ActiveTouchButtonFrequencyRange != *aTheTouchedButton) { // Handling of 10 Hz button - if (aValue == INDEX_OF_10HZ) { + // convert input range index to output range index + if (aInputRangeIndex == INDEX_OF_10HZ) { is10HzRange = true; } else { is10HzRange = false; } - if (aValue >= INDEX_OF_10HZ) { - aValue--; + uint8_t tOutputRangeIndex = aInputRangeIndex; + if (aInputRangeIndex >= INDEX_OF_10HZ) { + tOutputRangeIndex = aInputRangeIndex - 1; } // No MHz for PWM waveforms - if (aValue != FREQUENCY_FACTOR_INDEX_MEGA_HERTZ || sFrequencyInfo.Waveform == WAVEFORM_SQUARE) { + if (aInputRangeIndex != FREQUENCY_RANGE_INDEX_MEGA_HERTZ || sFrequencyInfo.Waveform == WAVEFORM_SQUARE) { + // Set color for old and new button ActiveTouchButtonFrequencyRange.setButtonColorAndDraw( BUTTON_AUTO_RED_GREEN_FALSE_COLOR); ActiveTouchButtonFrequencyRange = *aTheTouchedButton; aTheTouchedButton->setButtonColorAndDraw( BUTTON_AUTO_RED_GREEN_TRUE_COLOR); - setNormalizedFrequencyFactor(aValue); + setNormalizedFrequencyFactorFromRangeIndex(tOutputRangeIndex); setWaveformFrequencyAndPrintValues(); } } } -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(AVR) +void setWaveformButtonCaption(void) { + TouchButtonWaveform.setCaption(getWaveformModePGMString(), (DisplayControl.DisplayPage == DSO_PAGE_FREQUENCY)); +} +#endif + +void doWaveformMode(BDButton *aTheTouchedButton, int16_t aValue) { +#if defined(AVR) + cycleWaveformMode(); + setWaveformButtonCaption(); +#endif +} + +#if defined(SUPPORT_LOCAL_DISPLAY) /** * gets frequency value from numberpad * @param aTheTouchedButton @@ -474,7 +468,7 @@ void doSetFrequency(float aValue) { /** * Request frequency numerical */ -void doGetFrequency(BDButton * aTheTouchedButton, int16_t aValue) { +void doGetFrequency(BDButton *aTheTouchedButton, int16_t aValue) { BlueDisplay1.getNumberWithShortPrompt(&doSetFrequency, F("frequency [Hz]")); } #endif @@ -505,12 +499,12 @@ void printFrequencyAndPeriod() { float tPeriodMicros; #if defined(AVR) - dtostrf(sFrequencyInfo.FrequencyNormalized, 9, 3, &sStringBuffer[20]); - sprintf_P(sStringBuffer, PSTR("%s%cHz"), &sStringBuffer[20], FrequencyFactorChars[sFrequencyInfo.FrequencyFactorIndex]); + dtostrf(sFrequencyInfo.FrequencyNormalizedTo_1_to_1000, 9, 3, &sStringBuffer[20]); + sprintf_P(sStringBuffer, PSTR("%s%cHz"), &sStringBuffer[20], FrequencyRangeChars[sFrequencyInfo.FrequencyRangeIndex]); #else - snprintf(sStringBuffer, sizeof sStringBuffer, "%9.3f%cHz", sFrequencyInfo.FrequencyNormalized, - FrequencyFactorChars[sFrequencyInfo.FrequencyFactorIndex]); + snprintf(sStringBuffer, sizeof sStringBuffer, "%9.3f%cHz", sFrequencyInfo.FrequencyNormalizedTo_1_to_1000, + FrequencyRangeChars[sFrequencyInfo.FrequencyRangeIndex]); #endif // print frequency @@ -537,9 +531,9 @@ void printFrequencyAndPeriod() { // 950 byte program memory required for pow() and log10f() uint16_t tSliderValue; - tSliderValue = log10f(sFrequencyInfo.FrequencyNormalized) * (FREQ_SLIDER_MAX_VALUE / 3); + tSliderValue = log10f(sFrequencyInfo.FrequencyNormalizedTo_1_to_1000) * (FREQ_SLIDER_MAX_VALUE / 3); if (is10HzRange) { - if (sFrequencyInfo.FrequencyFactorIndex == FREQUENCY_FACTOR_INDEX_KILO_HERTZ) { + if (sFrequencyInfo.FrequencyRangeIndex == FREQUENCY_RANGE_INDEX_KILO_HERTZ) { tSliderValue += 2 * (FREQ_SLIDER_MAX_VALUE / 3); } else { tSliderValue -= (FREQ_SLIDER_MAX_VALUE / 3); @@ -555,9 +549,7 @@ void printFrequencyAndPeriod() { * @return true if error / clipping happened */ bool setWaveformFrequencyAndPrintValues() { - bool tErrorOrClippingHappend; - - tErrorOrClippingHappend = setWaveformFrequency(); + bool tErrorOrClippingHappend = setWaveformFrequencyFromNormalizedValues(); printFrequencyAndPeriod(); return tErrorOrClippingHappend; } @@ -565,19 +557,19 @@ bool setWaveformFrequencyAndPrintValues() { #if !defined(AVR) // content for AVR is in Waveforms.cpp -#define WAVEFORM_SQUARE 0 -#define WAVEFORM_SINE 1 -#define WAVEFORM_TRIANGLE 2 -#define WAVEFORM_SAWTOOTH 3 - -void setNormalizedFrequencyFactor(int aIndexValue) { - sFrequencyInfo.FrequencyFactorIndex = aIndexValue; - uint32_t tFactor = 1; - while (aIndexValue > 0) { - tFactor *= 1000; - aIndexValue--; +#define WAVEFORM_SQUARE 0 +#define WAVEFORM_SINE 1 +#define WAVEFORM_TRIANGLE 2 +#define WAVEFORM_SAWTOOTH 3 + +void setNormalizedFrequencyFactorFromRangeIndex(uint8_t aFrequencyRangeIndex) { + sFrequencyInfo.FrequencyRangeIndex = aFrequencyRangeIndex; + uint32_t tNormalizedFactorTimes1000 = 1; + while (aFrequencyRangeIndex > 0) { + tNormalizedFactorTimes1000 *= 1000; + aFrequencyRangeIndex--; } - sFrequencyInfo.FrequencyFactorTimes1000 = tFactor; + sFrequencyInfo.FrequencyNormalizedFactorTimes1000 = tNormalizedFactorTimes1000; } /* @@ -588,28 +580,28 @@ void setNormalizedFrequencyFactor(int aIndexValue) { * First put value of 1000 to next range, * then undo if value < 1.00001 and existing range is one lower */ -void setNormalizedFrequencyAndFactor(float aValue) { - uint8_t tFrequencyFactorIndex = 1; - // normalize Frequency to 1 - 1000 and compute FrequencyFactorIndex - if (aValue < 1) { - tFrequencyFactorIndex = 0; //mHz - aValue *= 1000; +void setNormalizedFrequencyAndFactor(float aFrequency) { + uint8_t tFrequencyRangeIndex = 1; + // normalize Frequency to 1 - 1000 and compute FrequencyRangeIndex + if (aFrequency < 1) { + tFrequencyRangeIndex = 0; //mHz + aFrequency *= 1000; } else { // 1000.1 to avoid switching to next range because of resolution issues - while (aValue >= 1000) { - aValue /= 1000; - tFrequencyFactorIndex++; + while (aFrequency >= 1000) { + aFrequency /= 1000; + tFrequencyRangeIndex++; } } // check if tFrequencyFactorIndex - 1 fits better - if (aValue < 1.00001 && sFrequencyInfo.FrequencyFactorIndex == (tFrequencyFactorIndex - 1)) { - aValue *= 1000; - tFrequencyFactorIndex--; + if (aFrequency < 1.00001 && sFrequencyInfo.FrequencyRangeIndex == (tFrequencyRangeIndex - 1)) { + aFrequency *= 1000; + tFrequencyRangeIndex--; } - setNormalizedFrequencyFactor(tFrequencyFactorIndex); - sFrequencyInfo.FrequencyNormalized = aValue; + setNormalizedFrequencyFactorFromRangeIndex(tFrequencyRangeIndex); + sFrequencyInfo.FrequencyNormalizedTo_1_to_1000 = aFrequency; } bool setWaveformFrequency(float aValue) { @@ -644,8 +636,8 @@ bool setWaveformFrequency(float aValue) { return hasError; } -bool setWaveformFrequency() { - return setWaveformFrequency((sFrequencyInfo.FrequencyNormalized * sFrequencyInfo.FrequencyFactorTimes1000) / 1000); +bool setWaveformFrequencyFromNormalizedValues() { + return setWaveformFrequency((sFrequencyInfo.FrequencyNormalizedTo_1_to_1000 * sFrequencyInfo.FrequencyNormalizedFactorTimes1000) / 1000); } float getPeriodMicros() { diff --git a/SimpleDSO.h b/SimpleDSO.h index 58dcc8c..4fa1e63 100644 --- a/SimpleDSO.h +++ b/SimpleDSO.h @@ -1,9 +1,23 @@ /* - * SimpleTouchScreenDSO.h + * SimpleDSO.h * - * Copyright (C) 2015 Armin Joachimsmeyer + * Copyright (C) 2015-2023 Armin Joachimsmeyer * Email: armin.joachimsmeyer@gmail.com - * License: GPL v3 (http://www.gnu.org/licenses/gpl.html) + * + * This file is part of Arduino-Simple-DSO https://github.com/ArminJo/Arduino-Simple-DSO. + * + * Arduino-Simple-DSO is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ #ifndef _SIMPLE_TOUCHSCREEN_DSO_H @@ -35,12 +49,6 @@ #define MILLIS_BETWEEN_INFO_OUTPUT 1000 -/* - * Display size - */ -#define REMOTE_DISPLAY_HEIGHT 256 // we use 8 bit resolution and have 256 different analog values -#define REMOTE_DISPLAY_WIDTH DISPLAY_HALF_VGA_WIDTH // 320 - #define THOUSANDS_SEPARATOR '.' /* @@ -97,9 +105,9 @@ /* * External attenuator values */ -#define ATTENUATOR_TYPE_NO_ATTENUATOR 0 // No attenuator at all. Start with aRef = VCC -> see ATTENUATOR_DETECT_PIN_0 -#define ATTENUATOR_TYPE_FIXED_ATTENUATOR 1 // Fixed attenuator at Channel0,1,2 assume manual AC/DC switch -#define ATTENUATOR_TYPE_ACTIVE_ATTENUATOR 2 // to be developed +#define ATTENUATOR_TYPE_NO_ATTENUATOR 0 // No attenuator at all. Start with aRef = VCC -> see ATTENUATOR_DETECT_PIN_0 +#define ATTENUATOR_TYPE_FIXED_ATTENUATOR 1 // Fixed attenuator at Channel0, 1, 2 +#define ATTENUATOR_TYPE_ACTIVE_ATTENUATOR 2 // to be developed #define NUMBER_OF_CHANNEL_WITH_ACTIVE_ATTENUATOR 2 struct MeasurementControlStruct { @@ -110,10 +118,10 @@ struct MeasurementControlStruct { bool isSingleShotMode; float VCC; // Volt of VCC - uint8_t ADCReference; // DEFAULT = 1 =VCC INTERNAL = 3 = 1.1 volt + uint8_t ADCReferenceShifted; // DEFAULT = 1 =VCC INTERNAL = 3 = 1.1 volt // Input select - uint8_t ADCInputMUXChannelIndex; + uint8_t ADMUXChannel; uint8_t AttenuatorType; //ATTENUATOR_TYPE_NO_ATTENUATOR, ATTENUATOR_TYPE_SIMPLE_ATTENUATOR, ATTENUATOR_TYPE_ACTIVE_ATTENUATOR bool ChannelHasActiveAttenuator; @@ -175,15 +183,18 @@ extern struct MeasurementControlStruct MeasurementControl; // values for DisplayPage // using enums increases code size by 120 bytes for Arduino -#define DISPLAY_PAGE_START 0 // Start GUI -#define DISPLAY_PAGE_CHART 1 // Chart in analyze and running mode -#define DISPLAY_PAGE_SETTINGS 2 -#define DISPLAY_PAGE_FREQUENCY 3 -#if !defined(AVR) -#define DISPLAY_PAGE_MORE_SETTINGS 4 -#define DISPLAY_PAGE_SYST_INFO 5 +#define DSO_PAGE_START 0 // Start GUI +#define DSO_PAGE_CHART 1 // Chart in analyze and running mode +#define DSO_PAGE_SETTINGS 2 +#define DSO_PAGE_FREQUENCY 3 +#ifndef AVR +#define DSO_PAGE_MORE_SETTINGS 4 +#define DSO_PAGE_SYST_INFO 5 #endif +#define DSO_SUB_PAGE_MAIN 0 +#define DSO_SUB_PAGE_FFT 1 + // modes for showInfoMode #define INFO_MODE_NO_INFO 0 #define INFO_MODE_SHORT_INFO 1 @@ -192,7 +203,9 @@ struct DisplayControlStruct { uint8_t TriggerLevelDisplayValue; // For clearing old line of manual trigger level setting int8_t XScale; // Factor for X Data expansion(>0) 0 = no scale, 2->display 1 value 2 times etc. - uint8_t DisplayPage; + uint8_t DisplayPage; // START, CHART, SETTINGS, MORE_SETTINGS + uint8_t DisplaySubPage; // DSO_SUB_PAGE_FFT + bool DrawWhileAcquire; uint8_t showInfoMode; @@ -205,7 +218,7 @@ extern DisplayControlStruct DisplayControl; * Data buffer */ struct DataBufferStruct { - uint8_t DisplayBuffer[REMOTE_DISPLAY_WIDTH]; + uint8_t DisplayBuffer[DISPLAY_WIDTH]; uint8_t * DataBufferNextInPointer; uint8_t * DataBufferNextDrawPointer; // pointer to DataBuffer - for draw-while-acquire mode uint16_t DataBufferNextDrawIndex; // index in DisplayBuffer - for draw-while-acquire mode @@ -213,7 +226,7 @@ struct DataBufferStruct { uint8_t * DataBufferEndPointer; // Used to synchronize ISR with main loop bool DataBufferFull; - // AcqusitionSize is REMOTE_DISPLAY_WIDTH except on last acquisition before stop then it is DATABUFFER_SIZE + // AcqusitionSize is DISPLAY_WIDTH except on last acquisition before stop then it is DATABUFFER_SIZE uint16_t AcquisitionSize; // Pointer for horizontal scrolling uint8_t * DataBufferDisplayStart; diff --git a/SimpleDSO.cpp b/SimpleDSO.ino similarity index 95% rename from SimpleDSO.cpp rename to SimpleDSO.ino index 8328340..4a0a96b 100644 --- a/SimpleDSO.cpp +++ b/SimpleDSO.ino @@ -13,8 +13,8 @@ * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . @@ -159,38 +159,27 @@ //#define DEBUG #include -/* - * Enabling program features dependent on display configuration - */ -//#define LOCAL_DISPLAY_EXISTS // Activate, if a local display is attached and should be drawn simultaneously -//#define USE_HY32D // Activate, if local display is a HY32D / SSD1289 type. Otherwise a MI0283QT2 type is assumed. - /* * Settings to configure the BlueDisplay library and to reduce its size */ +#define DISPLAY_HEIGHT 256 // We use 8 bit resolution and have 256 different analog values +#define DISPLAY_WIDTH 320 // Use the size of the local LCD screens available //#define BLUETOOTH_BAUD_RATE BAUD_115200 // Activate this, if you have reprogrammed the HC05 module for 115200, otherwise 9600 is used as baud rate //#define DO_NOT_NEED_BASIC_TOUCH_EVENTS // Disables basic touch events like down, move and up. Saves 620 bytes program memory and 36 bytes RAM #define USE_SIMPLE_SERIAL // Do not use the Serial object. Saves up to 1250 bytes program memory and 185 bytes RAM, if Serial is not used otherwise -//#define SUPPORT_LOCAL_DISPLAY // Supports simultaneously drawing on a locally attached display. Not (yet) implemented for all commands! -#include "BlueDisplay.hpp" - -#if defined(SUPPORT_LOCAL_DISPLAY) && !defined(LOCAL_DISPLAY_EXISTS) -#error SUPPORT_LOCAL_DISPLAY is defined but no local display seems to be attached since LOCAL_DISPLAY_EXISTS is not defined. +#if !defined(USE_SIMPLE_SERIAL) +#error SimpleDSO works only with USE_SIMPLE_SERIAL activated, since the serial interrupts kill the DSO timing! #endif +#include "BlueDisplay.hpp" #include "SimpleDSO.h" +#include "LocalDisplay/digitalWriteFast.h" #include "FrequencyGeneratorPage.hpp" // include sources #include "TouchDSOGui.hpp" // include sources -#include "digitalWriteFast.h" - -#if ! defined(USE_SIMPLE_SERIAL) -#error TouchScreenDSO works only with USE_SIMPLE_SERIAL activated, since the serial interrupts kill the DSO timing! -#endif /********************** * Buttons *********************/ - BDButton TouchButtonBack; // global flag for page control. Is evaluated by calling loop or page and set by buttonBack handler bool sBackButtonPressed; @@ -209,8 +198,8 @@ bool sBackButtonPressed; #define TOIE2 TOIE3 #endif -#define ADC_TEMPERATURE_CHANNEL 8 -#define ADC_1_1_VOLT_CHANNEL 0x0E +#define ADC_TEMPERATURE_CHANNEL 0x08 +#define ADC_1_1_VOLT_CHANNEL 0x0E /* * Timebase values overview: Polling mode @@ -362,7 +351,7 @@ void drawRemainingDataBufferValues(void); float getTemperature(void); void setVCCValue(void); inline void setPrescaleFactor(uint8_t aFactor); -void setADCReference(uint8_t aReference); +void setADCReferenceShifted(uint8_t aReferenceShifted); void setTimer2FastPWMOutput(); void initTimer2(void); @@ -374,7 +363,7 @@ void initTimer2(void); void initDisplay(void) { BlueDisplay1.setFlagsAndSize( BD_FLAG_FIRST_RESET_ALL | BD_FLAG_USE_MAX_SIZE | BD_FLAG_LONG_TOUCH_ENABLE | BD_FLAG_ONLY_TOUCH_MOVE_DISABLE, - REMOTE_DISPLAY_WIDTH, REMOTE_DISPLAY_HEIGHT); + DISPLAY_WIDTH, DISPLAY_HEIGHT); BlueDisplay1.setCharacterMapping(0xD1, 0x21D1); // Ascending in UTF16 - for printInfo() BlueDisplay1.setCharacterMapping(0xD2, 0x21D3); // Descending in UTF16 - for printInfo() BlueDisplay1.setCharacterMapping(0xD4, 0x2227); // UP (logical AND) in UTF16 @@ -472,11 +461,10 @@ void setup() { MeasurementControl.RawDSOReadingACZero = 0x200; delay(100); - setVCCValue(); setChannel(tStartChannel); // outputs button caption! /* - * setChannel() needs: + * setChannel() requires: * AttenuatorType * isACMode * VCC @@ -490,7 +478,7 @@ void setup() { * ChannelHasAttenuator * isACModeANDChannelHasAttenuator * AttenuatorValue - * ADCReference + * ADCReferenceShifted * * setChannel calls setInputRange(2,2) and this sets: * OffsetValue @@ -505,7 +493,7 @@ void setup() { DisplayControl.EraseColor = COLOR_BACKGROUND_DSO; DisplayControl.showHistory = false; - DisplayControl.DisplayPage = DISPLAY_PAGE_START; + DisplayControl.DisplayPage = DSO_PAGE_START; DisplayControl.showInfoMode = INFO_MODE_SHORT_INFO; //setACMode(!digitalReadFast(AC_DC_PIN)); @@ -522,13 +510,12 @@ void setup() { registerTouchUpCallback(&doSwitchInfoModeOnTouchUp); registerLongTouchDownCallback(&doLongTouchDownDSO, 900); - BlueDisplay1.playFeedbackTone(FEEDBACK_TONE_OK); + BDButton::playFeedbackTone(); delay(400); - setVCCValue(); - BlueDisplay1.playFeedbackTone(FEEDBACK_TONE_OK); + setVCCValue(); // this sets ADMUX to 1.1 volt reference channel + BDButton::playFeedbackTone(); initStackFreeMeasurement(); - } /************************************************************************ @@ -581,7 +568,7 @@ void __attribute__((noreturn)) loop(void) { if (sDoInfoOutput) { sDoInfoOutput = false; - if (DisplayControl.DisplayPage == DISPLAY_PAGE_CHART) { + if (DisplayControl.DisplayPage == DSO_PAGE_CHART) { if (!DisplayControl.showHistory) { // This enables slow display devices to skip frames BlueDisplay1.clearDisplayOptional(COLOR_BACKGROUND_DSO); @@ -590,14 +577,14 @@ void __attribute__((noreturn)) loop(void) { if (DisplayControl.showInfoMode != INFO_MODE_NO_INFO) { printInfo(); } - } else if (DisplayControl.DisplayPage == DISPLAY_PAGE_SETTINGS) { + } else if (DisplayControl.DisplayPage == DSO_PAGE_SETTINGS) { // refresh buttons drawDSOSettingsPage(); - } else if (DisplayControl.DisplayPage == DISPLAY_PAGE_FREQUENCY) { + } else if (DisplayControl.DisplayPage == DSO_PAGE_FREQUENCY) { // refresh buttons drawFrequencyGeneratorPage(); #if !defined(AVR) - } else if (DisplayControl.DisplayPage == DISPLAY_PAGE_MORE_SETTINGS) { + } else if (DisplayControl.DisplayPage == DSO_PAGE_MORE_SETTINGS) { // refresh buttons drawDSOMoreSettingsPage(); #endif @@ -614,7 +601,7 @@ void __attribute__((noreturn)) loop(void) { */ MeasurementControl.StopRequested = false; MeasurementControl.isRunning = false; - if (MeasurementControl.ADCReference != DEFAULT) { + if (MeasurementControl.ADCReferenceShifted != (DEFAULT << REFS0)) { // get new VCC Value setVCCValue(); } @@ -635,7 +622,7 @@ void __attribute__((noreturn)) loop(void) { // handle trigger line DisplayControl.TriggerLevelDisplayValue = getDisplayFromRawInputValue(MeasurementControl.RawTriggerLevel); if (tLastTriggerDisplayValue - != DisplayControl.TriggerLevelDisplayValue&& DisplayControl.DisplayPage == DISPLAY_PAGE_CHART) { + != DisplayControl.TriggerLevelDisplayValue&& DisplayControl.DisplayPage == DSO_PAGE_CHART) { clearTriggerLine(tLastTriggerDisplayValue); drawTriggerLine(); } @@ -713,7 +700,7 @@ void __attribute__((noreturn)) loop(void) { /* * Analyze mode here */ - if (sDoInfoOutput && DisplayControl.DisplayPage == DISPLAY_PAGE_SETTINGS) { + if (sDoInfoOutput && DisplayControl.DisplayPage == DSO_PAGE_SETTINGS) { sDoInfoOutput = false; /* * show VCC and Temp and stack @@ -726,17 +713,17 @@ void __attribute__((noreturn)) loop(void) { /* * Handle Sub-Pages */ - if (DisplayControl.DisplayPage == DISPLAY_PAGE_SETTINGS) { + if (DisplayControl.DisplayPage == DSO_PAGE_SETTINGS) { if (sBackButtonPressed) { sBackButtonPressed = false; - DisplayControl.DisplayPage = DISPLAY_PAGE_CHART; + DisplayControl.DisplayPage = DSO_PAGE_CHART; redrawDisplay(); } - } else if (DisplayControl.DisplayPage == DISPLAY_PAGE_FREQUENCY) { + } else if (DisplayControl.DisplayPage == DSO_PAGE_FREQUENCY) { if (sBackButtonPressed) { sBackButtonPressed = false; stopFrequencyGeneratorPage(); - DisplayControl.DisplayPage = DISPLAY_PAGE_SETTINGS; + DisplayControl.DisplayPage = DSO_PAGE_SETTINGS; redrawDisplay(); } else { //not required here, because is contains only checkAndHandleEvents() @@ -758,8 +745,9 @@ void __attribute__((noreturn)) loop(void) { * sets ADC status register including prescaler */ void startAcquisition(void) { - DataBufferControl.AcquisitionSize = REMOTE_DISPLAY_WIDTH; - DataBufferControl.DataBufferEndPointer = &DataBufferControl.DataBuffer[REMOTE_DISPLAY_WIDTH - 1]; + ADMUX = MeasurementControl.ADMUXChannel | MeasurementControl.ADCReferenceShifted; // it may be overwritten by getVoltage() + DataBufferControl.AcquisitionSize = DISPLAY_WIDTH; + DataBufferControl.DataBufferEndPointer = &DataBufferControl.DataBuffer[DISPLAY_WIDTH - 1]; if (MeasurementControl.StopRequested) { DataBufferControl.AcquisitionSize = DATABUFFER_SIZE; DataBufferControl.DataBufferEndPointer = &DataBufferControl.DataBuffer[DATABUFFER_SIZE - 1]; @@ -990,14 +978,14 @@ void acquireDataFast(void) { * 10-50us range. Data is stored directly as 16 bit value and not processed. * => we have only half number of samples (tLoopCount) */ - if (DATABUFFER_SIZE < REMOTE_DISPLAY_WIDTH * 2) { + if (DATABUFFER_SIZE < DISPLAY_WIDTH * 2) { // In this configuration (for testing etc.) we have not enough space - // for DISPLAY_WIDTH 16 bit-values which need (REMOTE_DISPLAY_WIDTH * 2) bytes. + // for DISPLAY_WIDTH 16 bit-values which need (DISPLAY_WIDTH * 2) bytes. // The compiler will remove the code if the configuration does not hold ;-) tLoopCount = DATABUFFER_SIZE / 2; - } else if (tLoopCount > REMOTE_DISPLAY_WIDTH) { + } else if (tLoopCount > DISPLAY_WIDTH) { // Last measurement before stop, fill the whole buffer with 16 bit values - // During running measurements we know here (see if above) that we can get REMOTE_DISPLAY_WIDTH 16 bit values + // During running measurements we know here (see if above) that we can get DISPLAY_WIDTH 16 bit values tLoopCount = tLoopCount / 2; } *DataPointerFast++ = tUValue.byte.LowByte; @@ -1092,7 +1080,7 @@ void acquireDataFast(void) { ADCSRA &= ~_BV(ADATE); // Disable auto-triggering MeasurementControl.RawValueMax = tValueMax; MeasurementControl.RawValueMin = tValueMin; - if (tIndex <= TIMEBASE_INDEX_ULTRAFAST_MODES && tLoopCount > REMOTE_DISPLAY_WIDTH) { + if (tIndex <= TIMEBASE_INDEX_ULTRAFAST_MODES && tLoopCount > DISPLAY_WIDTH) { // compensate for half sample count in last measurement in ultra fast mode tIntegrateValue *= 2; // set remaining of buffer to zero @@ -1400,14 +1388,14 @@ void setInputRange(uint8_t aShiftValue, uint8_t aActiveAttenuatorValue) { } resetOffset(); - if (MeasurementControl.isRunning && DisplayControl.DisplayPage == DISPLAY_PAGE_CHART) { + if (MeasurementControl.isRunning && DisplayControl.DisplayPage == DSO_PAGE_CHART) { //clear old grid, since it will be changed BlueDisplay1.clearDisplay(); } float tNewGridVoltage; uint16_t tHorizontalGridSizeShift8; - if (MeasurementControl.ADCReference == DEFAULT) { + if (MeasurementControl.ADCReferenceShifted == (DEFAULT << REFS0)) { /* * 5 volt reference */ @@ -1526,16 +1514,16 @@ void computeAutoRange(void) { // ignore warnings since we know that now tPeakToPeak is positive #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wsign-compare" - if (tPeakToPeak >= REMOTE_DISPLAY_HEIGHT * 2) { + if (tPeakToPeak >= DISPLAY_HEIGHT * 2) { tNewValueShift = 2; - } else if (tPeakToPeak >= REMOTE_DISPLAY_HEIGHT) { + } else if (tPeakToPeak >= DISPLAY_HEIGHT) { #pragma GCC diagnostic pop tNewValueShift = 1; } else if (MeasurementControl.AttenuatorValue > 0 && MeasurementControl.AttenuatorType >= ATTENUATOR_TYPE_ACTIVE_ATTENUATOR) { /* * only max value is relevant for attenuator switching! */ - if (MeasurementControl.RawValueMax < ((REMOTE_DISPLAY_HEIGHT - (REMOTE_DISPLAY_HEIGHT / 10)) * 4) / ATTENUATOR_FACTOR) { + if (MeasurementControl.RawValueMax < ((DISPLAY_HEIGHT - (DISPLAY_HEIGHT / 10)) * 4) / ATTENUATOR_FACTOR) { // more than 10 percent below theoretical threshold -> switch attenuator to higher resolution tNewAttenuatorValue--; tNewValueShift = 2; @@ -1638,7 +1626,7 @@ uint16_t getAttenuatorFactor(void) { /* * toggle between DC and AC mode */ -void doAcDcMode(__attribute__((unused)) BDButton *aTheTouchedButton, __attribute__((unused)) int16_t aValue) { +void doAcDcMode(BDButton *aTheTouchedButton __attribute__((unused)), int16_t aValue __attribute__((unused))) { setACMode(!MeasurementControl.ChannelIsACMode); } @@ -1672,14 +1660,14 @@ void doSetTriggerDelay(float aValue) { /* * toggle between 5 and 1.1 volt reference */ -void doADCReference(__attribute__((unused)) BDButton *aTheTouchedButton, __attribute__((unused)) int16_t aValue) { - uint8_t tNewReference = MeasurementControl.ADCReference; - if (MeasurementControl.ADCReference == DEFAULT) { - tNewReference = INTERNAL; +void doADCReference(BDButton *aTheTouchedButton __attribute__((unused)), int16_t aValue __attribute__((unused))) { + uint8_t tNewReferenceShifted = MeasurementControl.ADCReferenceShifted; + if (MeasurementControl.ADCReferenceShifted == (DEFAULT << REFS0)) { + tNewReferenceShifted = (INTERNAL << REFS0); } else { - tNewReference = DEFAULT; + tNewReferenceShifted = (DEFAULT << REFS0); } - setADCReference(tNewReference); // switch hardware + setADCReferenceShifted(tNewReferenceShifted); setReferenceButtonCaption(); if (!MeasurementControl.RangeAutomatic) { // set new grid values @@ -1687,7 +1675,7 @@ void doADCReference(__attribute__((unused)) BDButton *aTheTouchedButton, __ } } -void doStartStopDSO(__attribute__((unused)) BDButton *aTheTouchedButton, __attribute__((unused)) int16_t aValue) { +void doStartStopDSO(BDButton *aTheTouchedButton __attribute__((unused)), int16_t aValue __attribute__((unused))) { if (MeasurementControl.isRunning) { /* * Stop here @@ -1731,7 +1719,7 @@ void doStartStopDSO(__attribute__((unused)) BDButton *aTheTouchedButton, __ * Start here */ BlueDisplay1.clearDisplay(); - DisplayControl.DisplayPage = DISPLAY_PAGE_CHART; + DisplayControl.DisplayPage = DSO_PAGE_CHART; //DisplayControl.showInfoMode = true; activateChartGui(); drawGridLinesWithHorizLabelsAndTriggerLine(); @@ -1745,10 +1733,10 @@ void doStartStopDSO(__attribute__((unused)) BDButton *aTheTouchedButton, __ * Graphical output section ************************************************************************/ /* - * returns false if display was scrolled + * returns false if display was successfully scrolled, true on error */ -uint8_t scrollChart(int aScrollAmount) { - if (DisplayControl.DisplayPage != DISPLAY_PAGE_CHART) { +bool scrollChart(int aScrollAmount) { + if (DisplayControl.DisplayPage != DSO_PAGE_CHART) { return true; } bool isError = false; @@ -1766,7 +1754,7 @@ uint8_t scrollChart(int aScrollAmount) { // Only half of data buffer is filled tMaxAddress = &DataBufferControl.DataBuffer[DATABUFFER_SIZE / 2]; } - tMaxAddress = tMaxAddress - (REMOTE_DISPLAY_WIDTH / DisplayControl.XScale); + tMaxAddress = tMaxAddress - (DISPLAY_WIDTH / DisplayControl.XScale); if (DataBufferControl.DataBufferDisplayStart > tMaxAddress) { DataBufferControl.DataBufferDisplayStart = tMaxAddress; isError = true; @@ -1817,11 +1805,11 @@ void drawRemainingDataBufferValues(void) { uint16_t tBufferIndex = DataBufferControl.DataBufferNextDrawIndex; while (DataBufferControl.DataBufferNextDrawPointer < DataBufferControl.DataBufferNextInPointer - && tBufferIndex < REMOTE_DISPLAY_WIDTH) { + && tBufferIndex < DISPLAY_WIDTH) { /* * clear old line */ - if (tBufferIndex < REMOTE_DISPLAY_WIDTH - 1) { + if (tBufferIndex < DISPLAY_WIDTH - 1) { // fetch next value and clear line in advance tValueByte = DataBufferControl.DisplayBuffer[tBufferIndex]; tNextValueByte = DataBufferControl.DisplayBuffer[tBufferIndex + 1]; @@ -1834,7 +1822,7 @@ void drawRemainingDataBufferValues(void) { tValueByte = *DataBufferControl.DataBufferNextDrawPointer++; DataBufferControl.DisplayBuffer[tBufferIndex] = tValueByte; - if (tBufferIndex != 0 && tBufferIndex <= REMOTE_DISPLAY_WIDTH - 1) { + if (tBufferIndex != 0 && tBufferIndex <= DISPLAY_WIDTH - 1) { // get last value and draw line tLastValueByte = DataBufferControl.DisplayBuffer[tBufferIndex - 1]; BlueDisplay1.drawLineFastOneX(tBufferIndex - 1, tLastValueByte, tValueByte, COLOR_DATA_RUN); @@ -1944,7 +1932,7 @@ void printInfo(bool aRecomputeValues) { } else { tRefMultiplier = 1; } - if (MeasurementControl.ADCReference == DEFAULT) { + if (MeasurementControl.ADCReferenceShifted == (DEFAULT << REFS0)) { tReferenceChar = '5'; tRefMultiplier *= MeasurementControl.VCC / 1024.0; /* @@ -1995,10 +1983,10 @@ void printInfo(bool aRecomputeValues) { /* * Long version 1. line Timebase, Channel, (min, average, max, peak to peak) voltage, Trigger, Reference. */ - sprintf_P(sStringBuffer, PSTR("%3u%cs %c %s %s %s P2P%sV %sV %c"), tTimebaseUnitsPerGrid, tTimebaseUnitChar, + sprintf_P(sStringBuffer, PSTR("%3u%cs %c %s %s %s P2P%sV %sV %cV"), tTimebaseUnitsPerGrid, tTimebaseUnitChar, tSlopeChar, tMinStringBuffer, tAverageStringBuffer, tMaxStringBuffer, tP2PStringBuffer, tTriggerStringBuffer, tReferenceChar); - memcpy_P(&sStringBuffer[8], ADCInputMUXChannelStrings[MeasurementControl.ADCInputMUXChannelIndex], 4); + memcpy_P(&sStringBuffer[8], ADCInputMUXChannelStrings[MeasurementControl.ADMUXChannel], 4); BlueDisplay1.drawText(INFO_LEFT_MARGIN, FONT_SIZE_INFO_LONG_ASC, sStringBuffer, FONT_SIZE_INFO_LONG, COLOR16_BLACK, COLOR_INFO_BACKGROUND); @@ -2033,7 +2021,7 @@ void printInfo(bool aRecomputeValues) { /* * Short version */ -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(SUPPORT_LOCAL_DISPLAY) snprintf(sStringBuffer, sizeof sStringBuffer, "%6.*fV %6.*fV%s%4u%cs", tPrecision, getFloatFromRawValue(MeasurementControl.RawValueAverage), tPrecision, getFloatFromRawValue(tValueDiff), tBufferForPeriodAndFrequency, tUnitsPerGrid, tTimebaseUnitChar); @@ -2071,7 +2059,7 @@ void printTriggerInfo(void) { } else { tRefMultiplier = 1; } - if (MeasurementControl.ADCReference == DEFAULT) { + if (MeasurementControl.ADCReferenceShifted == (DEFAULT << REFS0)) { tRefMultiplier *= MeasurementControl.VCC / 1024.0; /* * Use 1023 to get 5 volt display for full scale reading @@ -2308,7 +2296,7 @@ float getFloatFromDisplayValue(uint8_t aDisplayValue) { } else { tFactor = 1; } - if (MeasurementControl.ADCReference == DEFAULT) { + if (MeasurementControl.ADCReferenceShifted == (DEFAULT << REFS0)) { tFactor *= MeasurementControl.VCC / 1024.0; } else { tFactor *= 1.1 / 1024.0; @@ -2336,7 +2324,7 @@ void setVCCValue(void) { * ShiftValue * ADCInputMUXChannel * ADCInputMUXChannelChar - * ADCReference + * ADCReferenceShifted * tHasACDC * isACMode * @@ -2354,7 +2342,6 @@ void setVCCValue(void) { * ChannelHasAttenuator * */ void setChannel(uint8_t aChannel) { - MeasurementControl.ADCInputMUXChannelIndex = aChannel; /* * Set default values for plain inputs without attenuator but potential AC/DC capabilities */ @@ -2362,7 +2349,7 @@ void setChannel(uint8_t aChannel) { bool tIsACMode = false; MeasurementControl.AttenuatorValue = 0; // no attenuator attached at channel uint8_t tHasAC_DC = true; - uint8_t tReference = DEFAULT; // DEFAULT/1 -> VCC INTERNAL/3 -> 1.1 volt + uint8_t tReferenceShifted = (DEFAULT << REFS0); // DEFAULT/1 -> VCC INTERNAL/3 -> 1.1 volt if (MeasurementControl.AttenuatorType >= ATTENUATOR_TYPE_ACTIVE_ATTENUATOR) { if (aChannel < NUMBER_OF_CHANNEL_WITH_ACTIVE_ATTENUATOR) { @@ -2370,7 +2357,7 @@ void setChannel(uint8_t aChannel) { // restore AC mode for this channels tIsACMode = MeasurementControl.isACMode; // use internal reference if attenuator is available - tReference = INTERNAL; + tReferenceShifted = (INTERNAL << REFS0); } else { tHasAC_DC = false; MeasurementControl.ChannelHasActiveAttenuator = false; @@ -2382,12 +2369,12 @@ void setChannel(uint8_t aChannel) { MeasurementControl.AttenuatorValue = aChannel; // channel 0 has 10^0 attenuation factor etc. // restore AC mode for this channels tIsACMode = MeasurementControl.isACMode; - tReference = INTERNAL; + tReferenceShifted = (INTERNAL << REFS0); } } /* - * Map channel index to special channel numbers + * Map some channel indexes to special channel numbers */ if (aChannel == MAX_ADC_EXTERNAL_CHANNEL + 1) { aChannel = ADC_TEMPERATURE_CHANNEL; // Temperature @@ -2397,11 +2384,12 @@ void setChannel(uint8_t aChannel) { aChannel = ADC_1_1_VOLT_CHANNEL; // 1.1 Reference tHasAC_DC = false; } - ADMUX = aChannel | (tReference << REFS0); + ADMUX = aChannel | tReferenceShifted; + MeasurementControl.ADMUXChannel = aChannel; + MeasurementControl.ADCReferenceShifted = tReferenceShifted; MeasurementControl.ChannelIsACMode = tIsACMode; MeasurementControl.ChannelHasAC_DCSwitch = tHasAC_DC; - MeasurementControl.ADCReference = tReference; //the second parameter for active attenuator is only required if ChannelHasActiveAttenuator == true setInputRange(2, 2); @@ -2412,9 +2400,9 @@ inline void setPrescaleFactor(uint8_t aFactor) { } // DEFAULT/1 -> VCC INTERNAL/3 -> 1.1 volt -void setADCReference(uint8_t aReference) { - MeasurementControl.ADCReference = aReference; - ADMUX = (ADMUX & ~0xC0) | (aReference << REFS0); +void setADCReferenceShifted(uint8_t aReferenceShifted) { + MeasurementControl.ADCReferenceShifted = aReferenceShifted; + ADMUX = (ADMUX & ~0xC0) | aReferenceShifted; } void setTimer2FastPWMOutput() { diff --git a/TouchDSOCommon.h b/TouchDSOCommon.h index 30f61a2..9b9d1ea 100644 --- a/TouchDSOCommon.h +++ b/TouchDSOCommon.h @@ -3,37 +3,32 @@ * * Declarations for AVR and ARM common section * - * Copyright (C) 2017 Armin Joachimsmeyer + * Copyright (C) 2017-2023 Armin Joachimsmeyer * Email: armin.joachimsmeyer@gmail.com - * License: GPL v3 (http://www.gnu.org/licenses/gpl.html) + * + * This file is part of Arduino-Simple-DSO https://github.com/ArminJo/Arduino-Simple-DSO. + * + * Arduino-Simple-DSO is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * */ #ifndef _TOUCH_DSO_COMMON_H #define _TOUCH_DSO_COMMON_H -#include "BlueDisplay.h" -#if defined(AVR) -#include "FrequencyGeneratorPage.h" -#endif - -#if ! defined(__AVR__) -// No PROGMEM on ARM -#define PROGMEM -#define __FlashStringHelper char -#define setCaptionPGM setCaption -#define setCaptionFromStringArrayPGM setCaptionFromStringArray -#define drawTextPGM drawText -# if !defined(F) -#define F(a) a -# endif -# if !defined(PSTR) -#define PSTR(a) a -# endif -#endif - #if defined(AVR) // Data buffer size (must be small enough to leave appr. 7 % (144 Byte) for stack -#define DATABUFFER_SIZE (3*REMOTE_DISPLAY_WIDTH) //960 +#define DATABUFFER_SIZE (3*DISPLAY_WIDTH) //960 #else #if defined(STM32F303xC) #define DATABUFFER_SIZE_FACTOR 9 @@ -42,8 +37,8 @@ #endif #endif -#define DISPLAY_VALUE_FOR_ZERO (REMOTE_DISPLAY_HEIGHT - 1) -//#define DISPLAY_VALUE_FOR_ZERO (REMOTE_DISPLAY_HEIGHT - 2) // Zero line is not exactly at bottom of display to improve readability +#define DISPLAY_VALUE_FOR_ZERO (DISPLAY_HEIGHT - 1) +//#define DISPLAY_VALUE_FOR_ZERO (DISPLAY_HEIGHT - 2) // Zero line is not exactly at bottom of display to improve readability /* * CHANNEL @@ -62,8 +57,8 @@ extern uint8_t const ADCInputMUXChannels[ADC_CHANNEL_COUNT]; #endif #define NUMBER_OF_CHANNELS_WITH_FIXED_ATTENUATOR 3 // Channel0 = /1, Ch1= /10, Ch2= /100 -extern const char * const ADCInputMUXChannelStrings[]; -extern const char * const ChannelDivByButtonStrings[]; +extern const char *const ADCInputMUXChannelStrings[]; +extern const char *const ChannelDivByButtonStrings[]; /* * Trigger values @@ -158,7 +153,7 @@ extern const char * const ChannelDivByButtonStrings[]; #endif extern const float TimebaseExactDivValuesMicros[] PROGMEM; -#define HORIZONTAL_LINE_LABELS_CAPION_X (REMOTE_DISPLAY_WIDTH - TEXT_SIZE_11_WIDTH * 4) +#define HORIZONTAL_LINE_LABELS_CAPION_X (DISPLAY_WIDTH - TEXT_SIZE_11_WIDTH * 4) /* * OFFSET */ @@ -169,32 +164,32 @@ extern const float TimebaseExactDivValuesMicros[] PROGMEM; /* * COLORS */ -#define COLOR_BACKGROUND_DSO COLOR16_WHITE -#define COLOR_INFO_BACKGROUND COLOR16(0xC8,0xC8,0x00) // background for info lines or elements +#define COLOR_BACKGROUND_DSO COLOR16_WHITE +#define COLOR_INFO_BACKGROUND COLOR16(0xC8,0xC8,0x00) // background for info lines or elements // Data colors -#define COLOR_DATA_RUN COLOR16_BLUE -#define COLOR_DATA_HOLD COLOR16_RED +#define COLOR_DATA_RUN COLOR16_BLUE +#define COLOR_DATA_HOLD COLOR16_RED // to see old chart values -#define COLOR_DATA_HISTORY COLOR16(0x20,0xFF,0x20) +#define COLOR_DATA_HISTORY COLOR16(0x20,0xFF,0x20) // Button colors -#define COLOR_GUI_CONTROL COLOR16_RED -#define COLOR_GUI_TRIGGER COLOR16_BLUE -#define COLOR_GUI_SOURCE_TIMEBASE COLOR16(0x00,0xE0,0x00) +#define COLOR_GUI_CONTROL COLOR16_RED +#define COLOR_GUI_TRIGGER COLOR16_BLUE +#define COLOR_GUI_SOURCE_TIMEBASE COLOR16(0x00,0xE0,0x00) // Line colors -#define COLOR_VOLTAGE_PICKER COLOR16_YELLOW +#define COLOR_VOLTAGE_PICKER COLOR16_YELLOW #define COLOR_VOLTAGE_PICKER_SLIDER COLOR16(0xFF,0XFF,0xD0) // Light Yellow -#define COLOR_TRIGGER_LINE COLOR16_PURPLE -#define COLOR_TRIGGER_SLIDER COLOR16(0xFF,0XE8,0xFF) // light Magenta -#define COLOR_HOR_REF_LINE_LABEL COLOR16_BLUE -#define COLOR_MAX_MIN_LINE COLOR16_GREEN -#define COLOR_GRID_LINES COLOR16(0x00,0x98,0x00) +#define COLOR_TRIGGER_LINE COLOR16_PURPLE +#define COLOR_TRIGGER_SLIDER COLOR16(0xFF,0XE8,0xFF) // light Magenta +#define COLOR_HOR_REF_LINE_LABEL COLOR16_BLUE +#define COLOR_MAX_MIN_LINE COLOR16_GREEN +#define COLOR_GRID_LINES COLOR16(0x00,0x98,0x00) // Label colors -#define COLOR_HOR_GRID_LINE_LABEL COLOR16_BLUE -#define COLOR_HOR_GRID_LINE_LABEL_NEGATIVE COLOR16_RED +#define COLOR_HOR_GRID_LINE_LABEL COLOR16_BLUE +#define COLOR_HOR_GRID_LINE_LABEL_NEGATIVE COLOR16_RED /* * GUI LAYOUT, POSITIONS + SIZES @@ -226,10 +221,10 @@ extern const float TimebaseExactDivValuesMicros[] PROGMEM; #define START_PAGE_ROW_INCREMENT BUTTON_HEIGHT_4_256_LINE_2 #define START_PAGE_BUTTON_HEIGHT BUTTON_HEIGHT_4_256 -#define SINGLESHOT_PPRINT_VALUE_X (REMOTE_DISPLAY_WIDTH - TEXT_SIZE_11_WIDTH) +#define SINGLESHOT_PPRINT_VALUE_X (DISPLAY_WIDTH - TEXT_SIZE_11_WIDTH) #define SETTINGS_PAGE_INFO_Y (BUTTON_HEIGHT_5_256_LINE_5 - (TEXT_SIZE_11_DECEND + 1)) #else -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(SUPPORT_LOCAL_DISPLAY) #define FONT_SIZE_INFO_SHORT TEXT_SIZE_11 // for 1 line info #define FONT_SIZE_INFO_LONG TEXT_SIZE_11 // for 3 lines info #define FONT_SIZE_INFO_SHORT_ASC TEXT_SIZE_11_ASCEND // for 3 lines info @@ -251,7 +246,7 @@ extern const float TimebaseExactDivValuesMicros[] PROGMEM; #define SLIDER_TLEVEL_POS_X (14 * FONT_SIZE_INFO_LONG_WIDTH) // Position of slider #define TRIGGER_LEVEL_INFO_SHORT_X (SLIDER_TLEVEL_POS_X + SLIDER_BAR_WIDTH) -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(SUPPORT_LOCAL_DISPLAY) #define TRIGGER_LEVEL_INFO_LONG_X (11 * FONT_SIZE_INFO_LONG_WIDTH) #else #define TRIGGER_LEVEL_INFO_LONG_X (11 * FONT_SIZE_INFO_LONG_WIDTH +1) // +1 since we have a special character in the string before @@ -278,11 +273,11 @@ extern BDButton TouchButtonCalibrateVoltage; extern BDButton TouchButtonMinMaxMode; extern BDButton TouchButtonDrawModeTriggerLine; #endif -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(SUPPORT_LOCAL_DISPLAY) extern BDButton TouchButtonDrawModeLinePixel; extern BDButton TouchButtonADS7846TestOnOff; extern BDSlider TouchSliderBacklight; -#endif // LOCAL_DISPLAY_EXISTS +#endif // SUPPORT_LOCAL_DISPLAY extern BDButton TouchButtonSingleshot; extern BDButton TouchButtonStartStopDSOMeasurement; @@ -343,15 +338,15 @@ void resetOffset(void); void setOffsetAutomatic(bool aNewState); void setACMode(bool aNewACMode); int changeOffsetGridCount(int aValue); + #if defined(AVR) uint8_t changeRange(int8_t aChangeAmount); uint8_t changeTimeBaseValue(int8_t aChangeValue); #else int changeDisplayRangeAndAdjustOffsetGridCount(int aValue); int changeTimeBaseValue(int aChangeValue); - +bool changeXScale(int aValue); #endif -int changeXScale(int aValue); // Output and draw section void initDSOGUI(void); @@ -369,7 +364,7 @@ void clearTriggerLine(uint8_t aTriggerLevelDisplayValue); void drawRunningOnlyPartOfGui(void); void activateChartGui(void); #if defined(AVR) -uint8_t scrollChart(int aValue); +bool scrollChart(int aValue); uint8_t getDisplayFromRawInputValue(uint16_t aRawValue); void drawDataBuffer(uint8_t *aByteBuffer, uint16_t aColor, uint16_t aClearBeforeColor); #else @@ -388,14 +383,14 @@ void printInfo(bool aRecomputeValues = true); void printTriggerInfo(void); // GUI event handler section -void doSwitchInfoModeOnTouchUp(struct TouchEvent * const aTouchPosition); -void doLongTouchDownDSO(struct TouchEvent * const aTouchPosition); -void doSwipeEndDSO(struct Swipe * const aSwipeInfo); +void doSwitchInfoModeOnTouchUp(struct TouchEvent *const aTouchPosition); +void doLongTouchDownDSO(struct TouchEvent *const aTouchPosition); +void doSwipeEndDSO(struct Swipe *const aSwipeInfo); void doSetTriggerDelay(float aValue); // Button handler section #if defined(AVR) -void doADCReference(BDButton * aTheTouchedButton, int16_t aValue); +void doADCReference(BDButton *aTheTouchedButton, int16_t aValue); #else void doShowPretriggerValuesOnOff(BDButton * aTheTouchedButton, int16_t aValue); void doShowFFT(BDButton * aTheTouchedButton, int16_t aValue); @@ -405,25 +400,25 @@ void doShowSystemInfoPage(BDButton * aTheTouchedButton, int16_t aValue); void doVoltageCalibration(BDButton * aTheTouchedButton, int16_t aValue); void doDrawModeTriggerLine(BDButton * aTheTouchedButton, int16_t aValue); #endif -void doStartStopDSO(BDButton * aTheTouchedButton, int16_t aValue); -void doDefaultBackButton(BDButton * aTheTouchedButton, int16_t aValue); -void doShowFrequencyPage(BDButton * aTheTouchedButton, int16_t aValue); -void doShowSettingsPage(BDButton * aTheTouchedButton, int16_t aValue); -void doTriggerSlope(BDButton * aTheTouchedButton, int16_t aValue); -void doStartSingleshot(BDButton * aTheTouchedButton, int16_t aValue); -void doTriggerMode(BDButton * aTheTouchedButton, int16_t aValue); -void doRangeMode(BDButton * aTheTouchedButton, int16_t aValue); -void doChartHistory(BDButton * aTheTouchedButton, int16_t aValue); -void doPromptForTriggerDelay(BDButton * aTheTouchedButton, int16_t aValue); -void doChannelSelect(BDButton * aTheTouchedButton, int16_t aValue); -void doOffsetMode(BDButton * aTheTouchedButton, int16_t aValue); -void doAcDcMode(BDButton * aTheTouchedButton, int16_t aValue); - -#if defined(LOCAL_DISPLAY_EXISTS) +void doStartStopDSO(BDButton *aTheTouchedButton, int16_t aValue); +void doDefaultBackButton(BDButton *aTheTouchedButton, int16_t aValue); +void doShowFrequencyPage(BDButton *aTheTouchedButton, int16_t aValue); +void doShowSettingsPage(BDButton *aTheTouchedButton, int16_t aValue); +void doTriggerSlope(BDButton *aTheTouchedButton, int16_t aValue); +void doStartSingleshot(BDButton *aTheTouchedButton, int16_t aValue); +void doTriggerMode(BDButton *aTheTouchedButton, int16_t aValue); +void doRangeMode(BDButton *aTheTouchedButton, int16_t aValue); +void doChartHistory(BDButton *aTheTouchedButton, int16_t aValue); +void doPromptForTriggerDelay(BDButton *aTheTouchedButton, int16_t aValue); +void doChannelSelect(BDButton *aTheTouchedButton, int16_t aValue); +void doOffsetMode(BDButton *aTheTouchedButton, int16_t aValue); +void doAcDcMode(BDButton *aTheTouchedButton, int16_t aValue); + +#if defined(SUPPORT_LOCAL_DISPLAY) void readADS7846Channels(void); void doADS7846TestOnOff(BDButton * aTheTouchedButton, int16_t aValue); void doDrawMode(BDButton * aTheTouchedButton, int16_t aValue); -#endif // LOCAL_DISPLAY_EXISTS +#endif // SUPPORT_LOCAL_DISPLAY // Slider handler section void doTriggerLevel(BDSlider *aTheTouchedSlider, uint16_t aValue); diff --git a/TouchDSOGui.hpp b/TouchDSOGui.hpp index 01516b8..adffb81 100644 --- a/TouchDSOGui.hpp +++ b/TouchDSOGui.hpp @@ -3,7 +3,7 @@ * * Implements the common (GUI) parts of AVR and ARM development * - * Copyright (C) 2017-2022 Armin Joachimsmeyer + * Copyright (C) 2017-2023 Armin Joachimsmeyer * Email: armin.joachimsmeyer@gmail.com * * This file is part of Arduino-Simple-DSO https://github.com/ArminJo/Arduino-Simple-DSO. @@ -15,29 +15,17 @@ * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ + #ifndef _TOUCH_DSO_GUI_HPP #define _TOUCH_DSO_GUI_HPP -#if defined(AVR) -#include - -//#include "SimpleTouchScreenDSO.h" -#include "digitalWriteFast.h" -#else -#include "Pages.h" -#include "TouchDSO.h" - -#include "Chart.h" // for adjustIntWithScaleFactor() -#include "BlueDisplay.h" -#endif // defined(AVR) - uint8_t sLastPickerValue; #define MIN_SAMPLES_PER_PERIOD_FOR_RELIABLE_FREQUENCY_VALUE 3 @@ -132,7 +120,7 @@ void computePeriodFrequency(void) { // First display value is the first after triggering condition so we have at least one trigger, but still no period. tCount = 0; } - for (i = 0; i < REMOTE_DISPLAY_WIDTH; ++i) { + for (i = 0; i < DISPLAY_WIDTH; ++i) { #else /** * Get period and frequency and average for display @@ -440,7 +428,7 @@ void setACMode(bool aNewACMode) { #if defined(AVR) // must do it here after settings of flags and before drawing setACModeButtonCaption(); - if (DisplayControl.DisplayPage == DISPLAY_PAGE_SETTINGS) { + if (DisplayControl.DisplayPage == DSO_PAGE_SETTINGS) { // hide/show offset drawDSOSettingsPage(); } @@ -465,7 +453,7 @@ void clearInfo(uint8_t aOldMode) { if (aOldMode == INFO_MODE_LONG_INFO) { tHeight = (2 * FONT_SIZE_INFO_LONG) + 1; } - BlueDisplay1.fillRectRel(INFO_LEFT_MARGIN, 0, REMOTE_DISPLAY_WIDTH, tHeight, COLOR_BACKGROUND_DSO); + BlueDisplay1.fillRectRel(INFO_LEFT_MARGIN, 0, DISPLAY_WIDTH, tHeight, COLOR_BACKGROUND_DSO); } /*********************************************************************** @@ -486,13 +474,12 @@ BDButton TouchButtonMinMaxMode; BDButton TouchButtonDrawModeTriggerLine; #endif #endif -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(SUPPORT_LOCAL_DISPLAY) BDButton TouchButtonDrawModeLinePixel; const char DrawModeButtonStringLine[] = "Line"; const char DrawModeButtonStringPixel[] = "Pixel"; BDButton TouchButtonADS7846TestOnOff; -BDSlider TouchSliderBacklight; #endif BDButton TouchButtonSingleshot; @@ -504,9 +491,9 @@ const char sTriggerModeButtonStringManualTimeout[] PROGMEM = "Trigger\nman timeo const char sTriggerModeButtonStringManual[] PROGMEM = "Trigger\nman"; const char sTriggerModeButtonStringFreeRunning[] PROGMEM = "Trigger\nfree"; const char sTriggerModeButtonStringExternal[] PROGMEM = "Trigger\next"; -const char *const sTriggerModeButtonCaptionStringArray[] PROGMEM = { sTriggerModeButtonStringAuto, - sTriggerModeButtonStringManualTimeout, sTriggerModeButtonStringManual, sTriggerModeButtonStringFreeRunning, - sTriggerModeButtonStringExternal }; +const char *const sTriggerModeButtonCaptionStringArray[] PROGMEM = {sTriggerModeButtonStringAuto, + sTriggerModeButtonStringManualTimeout, sTriggerModeButtonStringManual, sTriggerModeButtonStringFreeRunning, + sTriggerModeButtonStringExternal}; BDButton TouchButtonTriggerDelay; BDButton TouchButtonChartHistoryOnOff; @@ -524,14 +511,14 @@ const char StringTemperature[] PROGMEM = "Temp"; const char StringVRefint[] PROGMEM = "VRef"; const char StringVBattDiv2[] PROGMEM = "\xBD" "VBatt"; #if defined(AVR) -const char *const ADCInputMUXChannelStrings[] = { StringChannel0, StringChannel1, StringChannel2, StringChannel3, StringChannel4, - StringTemperature, StringVRefint }; +const char *const ADCInputMUXChannelStrings[] = {StringChannel0, StringChannel1, StringChannel2, StringChannel3, StringChannel4, + StringTemperature, StringVRefint}; #else #if defined(STM32F30X) const char *const ADCInputMUXChannelStrings[ADC_CHANNEL_COUNT] = { StringChannel2, StringChannel3, StringChannel4, StringTemperature, StringVBattDiv2, StringVRefint }; -uint8_t const ADCInputMUXChannels[] = { ADC_CHANNEL_2, ADC_CHANNEL_3, ADC_CHANNEL_4, -ADC_CHANNEL_TEMPSENSOR, ADC_CHANNEL_VBAT, ADC_CHANNEL_VREFINT }; +uint8_t const ADCInputMUXChannels[] = { ADC_CHANNEL_2, ADC_CHANNEL_3, ADC_CHANNEL_4, ADC_CHANNEL_TEMPSENSOR, ADC_CHANNEL_VBAT, + ADC_CHANNEL_VREFINT }; #else const char * const ADCInputMUXChannelStrings[] = {StringChannel0, StringChannel1, StringChannel2, StringChannel3, StringTemperature, StringVRefint}; @@ -550,8 +537,8 @@ BDButton TouchButtonAutoOffsetMode; const char AutoOffsetButtonString0[] PROGMEM = "Offset\n0V"; const char AutoOffsetButtonStringAuto[] PROGMEM = "Offset\nauto"; const char AutoOffsetButtonStringMan[] PROGMEM = "Offset\nman"; -const char *const sAutoOffsetButtonCaptionStringArray[] PROGMEM = { AutoOffsetButtonString0, AutoOffsetButtonStringAuto, - AutoOffsetButtonStringMan }; +const char *const sAutoOffsetButtonCaptionStringArray[] PROGMEM = {AutoOffsetButtonString0, AutoOffsetButtonStringAuto, + AutoOffsetButtonStringMan}; BDButton TouchButtonAutoRangeOnOff; const char AutoRangeButtonStringAuto[] PROGMEM = "Range\nauto"; @@ -568,7 +555,7 @@ BDSlider TouchSliderTriggerLevel; BDSlider TouchSliderVoltagePicker; void initDSOGUI(void) { - BlueDisplay1.setButtonsGlobalFlags(FLAG_BUTTON_GLOBAL_USE_UP_EVENTS_FOR_BUTTONS); // since swipe can start on a button + BDButton::setGlobalFlags (FLAG_BUTTON_GLOBAL_USE_UP_EVENTS_FOR_BUTTONS); // since swipe can start on a button int tPosY = 0; /*************************** @@ -577,11 +564,11 @@ void initDSOGUI(void) { // 1. row // Button for Singleshot #if defined(AVR) - TouchButtonSingleshot.init(BUTTON_WIDTH_3_POS_3, tPosY, BUTTON_WIDTH_3, START_PAGE_BUTTON_HEIGHT, - COLOR_GUI_CONTROL, F("Singleshot"), TEXT_SIZE_14, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doStartSingleshot); + TouchButtonSingleshot.init(BUTTON_WIDTH_3_POS_3, tPosY, BUTTON_WIDTH_3, START_PAGE_BUTTON_HEIGHT, COLOR_GUI_CONTROL, + F("Singleshot"), TEXT_SIZE_14, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doStartSingleshot); #else - TouchButtonSingleshot.init(BUTTON_WIDTH_6_POS_4, tPosY, BUTTON_WIDTH_3, START_PAGE_BUTTON_HEIGHT, - COLOR_GUI_CONTROL, F("Singleshot"), TEXT_SIZE_14, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doStartSingleshot); + TouchButtonSingleshot.init(BUTTON_WIDTH_6_POS_4, tPosY, BUTTON_WIDTH_3, START_PAGE_BUTTON_HEIGHT, COLOR_GUI_CONTROL, + F("Singleshot"), TEXT_SIZE_14, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doStartSingleshot); #endif // 2. row @@ -603,10 +590,9 @@ void initDSOGUI(void) { // 4. row tPosY += 2 * START_PAGE_ROW_INCREMENT; #if !defined(AVR) -// Button for show FFT - only for Start and Chart pages - TouchButtonFFT.init(0, tPosY, BUTTON_WIDTH_3, BUTTON_HEIGHT_4, COLOR16_GREEN, "FFT", - TEXT_SIZE_22, FLAG_BUTTON_DO_BEEP_ON_TOUCH | FLAG_BUTTON_TYPE_TOGGLE_RED_GREEN_MANUAL_REFRESH, DisplayControl.ShowFFT, - &doShowFFT); +// Button for show FFT - only for Start and Chart pages. Invisible if running. + TouchButtonFFT.init(0, tPosY, BUTTON_WIDTH_3, BUTTON_HEIGHT_4, 0, "FFT", TEXT_SIZE_22, + FLAG_BUTTON_DO_BEEP_ON_TOUCH | FLAG_BUTTON_TYPE_TOGGLE_RED_GREEN_MANUAL_REFRESH, DisplayControl.ShowFFT, &doShowFFT); #endif // Button for settings page @@ -622,23 +608,23 @@ void initDSOGUI(void) { /* * Button for chart history (erase color). Must be at first row since it is (hidden) active at running mode */ -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(SUPPORT_LOCAL_DISPLAY) TouchButtonChartHistoryOnOff.init(SLIDER_DEFAULT_BAR_WIDTH + 6, tPosY, BUTTON_WIDTH_3 - (SLIDER_DEFAULT_BAR_WIDTH + 6), - SETTINGS_PAGE_BUTTON_HEIGHT, COLOR_GUI_DISPLAY_CONTROL, "History", TEXT_SIZE_11, + SETTINGS_PAGE_BUTTON_HEIGHT, 0, "History", TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH | FLAG_BUTTON_TYPE_TOGGLE_RED_GREEN_MANUAL_REFRESH, 0, &doChartHistory); #else - TouchButtonChartHistoryOnOff.init(0, tPosY, BUTTON_WIDTH_3, SETTINGS_PAGE_BUTTON_HEIGHT, COLOR16_RED, F("History"), - TEXT_SIZE_18, FLAG_BUTTON_DO_BEEP_ON_TOUCH | FLAG_BUTTON_TYPE_TOGGLE_RED_GREEN_MANUAL_REFRESH, 0, &doChartHistory); + TouchButtonChartHistoryOnOff.init(0, tPosY, BUTTON_WIDTH_3, SETTINGS_PAGE_BUTTON_HEIGHT, 0, F("History"), TEXT_SIZE_18, + FLAG_BUTTON_DO_BEEP_ON_TOUCH | FLAG_BUTTON_TYPE_TOGGLE_RED_GREEN_MANUAL_REFRESH, 0, &doChartHistory); #endif // Button for slope TouchButtonSlope.init(BUTTON_WIDTH_3_POS_2, tPosY, BUTTON_WIDTH_3, SETTINGS_PAGE_BUTTON_HEIGHT, COLOR_GUI_TRIGGER, "", - TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doTriggerSlope); + TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doTriggerSlope); setSlopeButtonCaption(); // Back button for sub pages TouchButtonBack.init(BUTTON_WIDTH_3_POS_3, tPosY, BUTTON_WIDTH_3, SETTINGS_PAGE_BUTTON_HEIGHT, COLOR_GUI_CONTROL, F("Back"), - TEXT_SIZE_22, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doDefaultBackButton); + TEXT_SIZE_22, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doDefaultBackButton); // 2. row tPosY += SETTINGS_PAGE_ROW_INCREMENT; @@ -652,47 +638,47 @@ void initDSOGUI(void) { // Button for trigger mode TouchButtonTriggerMode.init(BUTTON_WIDTH_3_POS_2, tPosY, BUTTON_WIDTH_3, SETTINGS_PAGE_BUTTON_HEIGHT, COLOR_GUI_TRIGGER, "", - TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doTriggerMode); + TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doTriggerMode); setTriggerModeButtonCaption(); // Button for channel 0 TouchButtonChannels[0].init(BUTTON_WIDTH_3_POS_3, tPosY, BUTTON_WIDTH_6, SETTINGS_PAGE_BUTTON_HEIGHT, - BUTTON_AUTO_RED_GREEN_FALSE_COLOR, "", TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doChannelSelect); + BUTTON_AUTO_RED_GREEN_FALSE_COLOR, "", TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doChannelSelect); // Button for channel 1 - TouchButtonChannels[1].init(REMOTE_DISPLAY_WIDTH - BUTTON_WIDTH_6, tPosY, BUTTON_WIDTH_6, SETTINGS_PAGE_BUTTON_HEIGHT, - BUTTON_AUTO_RED_GREEN_FALSE_COLOR, "", TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 1, &doChannelSelect); + TouchButtonChannels[1].init(DISPLAY_WIDTH - BUTTON_WIDTH_6, tPosY, BUTTON_WIDTH_6, SETTINGS_PAGE_BUTTON_HEIGHT, + BUTTON_AUTO_RED_GREEN_FALSE_COLOR, "", TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 1, &doChannelSelect); // 3. row tPosY += SETTINGS_PAGE_ROW_INCREMENT; #if !defined(AVR) // Button for pretrigger area show -#if defined(LOCAL_DISPLAY_EXISTS) - TouchButtonShowPretriggerValuesOnOff.init(SLIDER_DEFAULT_BAR_WIDTH + 6, tPosY, - BUTTON_WIDTH_3 - (SLIDER_DEFAULT_BAR_WIDTH + 6), SETTINGS_PAGE_BUTTON_HEIGHT, - COLOR_BLACK, "Show\nPretrigger", TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH | FLAG_BUTTON_TYPE_TOGGLE_RED_GREEN, - (DisplayControl.DatabufferPreTriggerDisplaySize != 0), &doShowPretriggerValuesOnOff); +#if defined(SUPPORT_LOCAL_DISPLAY) + TouchButtonShowPretriggerValuesOnOff.init(SLIDER_DEFAULT_BAR_WIDTH + 6, tPosY, BUTTON_WIDTH_3 - (SLIDER_DEFAULT_BAR_WIDTH + 6), + SETTINGS_PAGE_BUTTON_HEIGHT, 0, "Show\nPretrigger", TEXT_SIZE_11, + FLAG_BUTTON_DO_BEEP_ON_TOUCH | FLAG_BUTTON_TYPE_TOGGLE_RED_GREEN, (DisplayControl.DatabufferPreTriggerDisplaySize != 0), + &doShowPretriggerValuesOnOff); #else - TouchButtonShowPretriggerValuesOnOff.init(0, tPosY, BUTTON_WIDTH_3, SETTINGS_PAGE_BUTTON_HEIGHT, - COLOR_BLACK, "Show\nPretrigger", TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH | FLAG_BUTTON_TYPE_TOGGLE_RED_GREEN, + TouchButtonShowPretriggerValuesOnOff.init(0, tPosY, BUTTON_WIDTH_3, SETTINGS_PAGE_BUTTON_HEIGHT, 0, "Show\nPretrigger", + TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH | FLAG_BUTTON_TYPE_TOGGLE_RED_GREEN, (DisplayControl.DatabufferPreTriggerDisplaySize != 0), &doShowPretriggerValuesOnOff); #endif #endif // Button for AutoRange on off TouchButtonAutoRangeOnOff.init(BUTTON_WIDTH_3_POS_2, tPosY, BUTTON_WIDTH_3, SETTINGS_PAGE_BUTTON_HEIGHT, COLOR_GUI_TRIGGER, "", - TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doRangeMode); + TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doRangeMode); setAutoRangeModeAndButtonCaption(true); // Button for channel 2 TouchButtonChannels[2].init(BUTTON_WIDTH_3_POS_3, tPosY, BUTTON_WIDTH_6, SETTINGS_PAGE_BUTTON_HEIGHT, - BUTTON_AUTO_RED_GREEN_FALSE_COLOR, "", TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 2, &doChannelSelect); + BUTTON_AUTO_RED_GREEN_FALSE_COLOR, "", TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 2, &doChannelSelect); setChannelButtonsCaption(); // Button for channel select - TouchButtonChannelSelect.init(REMOTE_DISPLAY_WIDTH - BUTTON_WIDTH_6, tPosY, BUTTON_WIDTH_6, SETTINGS_PAGE_BUTTON_HEIGHT, - BUTTON_AUTO_RED_GREEN_FALSE_COLOR, reinterpret_cast(StringChannel3), TEXT_SIZE_11, + TouchButtonChannelSelect.init(DISPLAY_WIDTH - BUTTON_WIDTH_6, tPosY, BUTTON_WIDTH_6, SETTINGS_PAGE_BUTTON_HEIGHT, + BUTTON_AUTO_RED_GREEN_FALSE_COLOR, reinterpret_cast(StringChannel3), TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 42, &doChannelSelect); // 4. row @@ -700,52 +686,49 @@ void initDSOGUI(void) { #if !defined(AVR) // Button for min/max acquisition mode -#if defined(LOCAL_DISPLAY_EXISTS) +# if defined(SUPPORT_LOCAL_DISPLAY) TouchButtonMinMaxMode.init(SLIDER_DEFAULT_BAR_WIDTH + 6, tPosY, BUTTON_WIDTH_3 - (SLIDER_DEFAULT_BAR_WIDTH + 6), - SETTINGS_PAGE_BUTTON_HEIGHT, COLOR_GUI_DISPLAY_CONTROL, "", TEXT_SIZE_11, - FLAG_BUTTON_DO_BEEP_ON_TOUCH | FLAG_BUTTON_TYPE_TOGGLE_RED_GREEN, MeasurementControl.isMinMaxMode, &doMinMaxMode); - setMinMaxModeButtonCaption(); -#else - TouchButtonMinMaxMode.init(0, tPosY, BUTTON_WIDTH_3, SETTINGS_PAGE_BUTTON_HEIGHT, COLOR_BLACK, "Sample\nmode", TEXT_SIZE_11, - FLAG_BUTTON_DO_BEEP_ON_TOUCH | FLAG_BUTTON_TYPE_TOGGLE_RED_GREEN, MeasurementControl.isMinMaxMode, &doMinMaxMode); - TouchButtonMinMaxMode.setCaptionForValueTrue("Min/Max\nmode"); -#endif - + SETTINGS_PAGE_BUTTON_HEIGHT, COLOR_GUI_TRIGGER, "Min/Max\nmode", TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, true, + &doMinMaxMode); +# else + TouchButtonMinMaxMode.init(0, tPosY, BUTTON_WIDTH_3, SETTINGS_PAGE_BUTTON_HEIGHT, COLOR_GUI_TRIGGER, "Min/Max\nmode", + TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, true, &doMinMaxMode); +# endif #endif // Button for auto offset on, 0-Volt, manual TouchButtonAutoOffsetMode.init(BUTTON_WIDTH_3_POS_2, tPosY, BUTTON_WIDTH_3, SETTINGS_PAGE_BUTTON_HEIGHT, COLOR_GUI_TRIGGER, "", - TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doOffsetMode); + TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doOffsetMode); setAutoOffsetButtonCaption(); #if defined(FUTURE) // Button for trigger line mode TouchButtonDrawModeTriggerLine.init(BUTTON_WIDTH_3_POS_3, tPosY, BUTTON_WIDTH_3, SETTINGS_PAGE_BUTTON_HEIGHT, - COLOR_GUI_DISPLAY_CONTROL, "Trigger\nline", TEXT_SIZE_11, + 0, "Trigger\nline", TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH | FLAG_BUTTON_TYPE_TOGGLE_RED_GREEN, DisplayControl.showTriggerInfoLine, &doDrawModeTriggerLine); #endif // 5. row - tPosY = REMOTE_DISPLAY_HEIGHT - SETTINGS_PAGE_BUTTON_HEIGHT; + tPosY = DISPLAY_HEIGHT - SETTINGS_PAGE_BUTTON_HEIGHT; // Button for selecting Frequency page. TouchButtonFrequencyPage.init(0, tPosY, BUTTON_WIDTH_3, SETTINGS_PAGE_BUTTON_HEIGHT, COLOR16_RED, F("Frequency\nGenerator"), - TEXT_SIZE_14, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doShowFrequencyPage); + TEXT_SIZE_14, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doShowFrequencyPage); // Button for AC / DC TouchButtonAcDc.init(BUTTON_WIDTH_3_POS_2, tPosY, BUTTON_WIDTH_3, SETTINGS_PAGE_BUTTON_HEIGHT, COLOR_GUI_TRIGGER, "", - TEXT_SIZE_22, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doAcDcMode); + TEXT_SIZE_22, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doAcDcMode); setACModeButtonCaption(); #if defined(AVR) // Button for reference voltage switching TouchButtonADCReference.init(BUTTON_WIDTH_3_POS_3, tPosY, BUTTON_WIDTH_3, SETTINGS_PAGE_BUTTON_HEIGHT, - COLOR_GUI_SOURCE_TIMEBASE, "", TEXT_SIZE_18, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doADCReference); + COLOR_GUI_SOURCE_TIMEBASE, "", TEXT_SIZE_18, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doADCReference); #else // Button for more-settings pages - TouchButtonDSOMoreSettings.init(BUTTON_WIDTH_3_POS_3, tPosY, BUTTON_WIDTH_3, BUTTON_HEIGHT_5, - COLOR_GUI_CONTROL, "More", TEXT_SIZE_22, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doShowMoreSettingsPage); + TouchButtonDSOMoreSettings.init(BUTTON_WIDTH_3_POS_3, tPosY, BUTTON_WIDTH_3, BUTTON_HEIGHT_5, COLOR_GUI_CONTROL, "More", + TEXT_SIZE_22, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doShowMoreSettingsPage); /*************************** * More Settings page @@ -753,8 +736,8 @@ void initDSOGUI(void) { // 1. row tPosY = 0; // Button for voltage calibration - TouchButtonCalibrateVoltage.init(0, tPosY, BUTTON_WIDTH_3, BUTTON_HEIGHT_4, - COLOR_GUI_SOURCE_TIMEBASE, "Calibrate U", TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doVoltageCalibration); + TouchButtonCalibrateVoltage.init(0, tPosY, BUTTON_WIDTH_3, BUTTON_HEIGHT_4, COLOR_GUI_SOURCE_TIMEBASE, "Calibrate U", + TEXT_SIZE_11, FLAG_BUTTON_DO_BEEP_ON_TOUCH, 0, &doVoltageCalibration); // 2. row tPosY += SETTINGS_PAGE_ROW_INCREMENT; // Button for system info @@ -767,16 +750,16 @@ void initDSOGUI(void) { */ // make slider slightly visible // slider for voltage picker - TouchSliderVoltagePicker.init(SLIDER_VPICKER_POS_X, 0, SLIDER_BAR_WIDTH, REMOTE_DISPLAY_HEIGHT, REMOTE_DISPLAY_HEIGHT, 0, 0, - COLOR_VOLTAGE_PICKER_SLIDER, FLAG_SLIDER_VALUE_BY_CALLBACK, &doVoltagePicker); - TouchSliderVoltagePicker.setBarBackgroundColor( COLOR_VOLTAGE_PICKER_SLIDER); + TouchSliderVoltagePicker.init(SLIDER_VPICKER_POS_X, 0, SLIDER_BAR_WIDTH, DISPLAY_HEIGHT, DISPLAY_HEIGHT, 0, + COLOR16_WHITE, COLOR_VOLTAGE_PICKER_SLIDER, FLAG_SLIDER_VALUE_BY_CALLBACK, &doVoltagePicker); + TouchSliderVoltagePicker.setBarBackgroundColor(COLOR_VOLTAGE_PICKER_SLIDER); // slider for trigger level - TouchSliderTriggerLevel.init(SLIDER_TLEVEL_POS_X, 0, SLIDER_BAR_WIDTH, REMOTE_DISPLAY_HEIGHT, REMOTE_DISPLAY_HEIGHT, 0, 0, - COLOR_TRIGGER_SLIDER, FLAG_SLIDER_VALUE_BY_CALLBACK, &doTriggerLevel); - TouchSliderTriggerLevel.setBarBackgroundColor( COLOR_TRIGGER_SLIDER); + TouchSliderTriggerLevel.init(SLIDER_TLEVEL_POS_X, 0, SLIDER_BAR_WIDTH, DISPLAY_HEIGHT, DISPLAY_HEIGHT, 0, + COLOR16_WHITE, COLOR_TRIGGER_SLIDER, FLAG_SLIDER_VALUE_BY_CALLBACK, &doTriggerLevel); + TouchSliderTriggerLevel.setBarBackgroundColor(COLOR_TRIGGER_SLIDER); -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(SUPPORT_LOCAL_DISPLAY) // 2. row // Button for switching draw mode - line/pixel TouchButtonDrawModeLinePixel.init(0, BUTTON_HEIGHT_4_LINE_2, BUTTON_WIDTH_3, @@ -791,8 +774,8 @@ void initDSOGUI(void) { /* * Backlight slider */ - TouchSliderBacklight.init(0, 0, SLIDER_DEFAULT_BAR_WIDTH, BACKLIGHT_MAX_VALUE, BACKLIGHT_MAX_VALUE, getBacklightValue(), - COLOR16_BLUE, COLOR16_GREEN, FLAG_SLIDER_VERTICAL_SHOW_NOTHING, &doBacklightSlider); + TouchSliderBacklight.init(0, 0, SLIDER_DEFAULT_BAR_WIDTH, BACKLIGHT_MAX_BRIGHTNESS_VALUE, BACKLIGHT_MAX_BRIGHTNESS_VALUE, sCurrentBacklightPercent, + COLOR16_WHITE, COLOR16_GREEN, FLAG_SLIDER_VERTICAL_SHOW_NOTHING, &doBacklightSlider); #endif } @@ -805,7 +788,7 @@ void activateChartGui(void) { TouchButtonSingleshot.activate(); TouchButtonStartStopDSOMeasurement.activate(); TouchButtonSettingsPage.activate(); -#if !defined(AVR) +#if !defined(ARDUINO) TouchButtonFFT.activate(); #endif @@ -814,7 +797,7 @@ void activateChartGui(void) { TouchSliderTriggerLevel.drawSlider(); } -#if defined(LOCAL_DISPLAY_EXISTS) +#if !defined(ARDUINO) TouchButtonMainHome.activate(); #endif } @@ -830,7 +813,7 @@ void redrawDisplay() { /* * running mode */ - if (DisplayControl.DisplayPage >= DISPLAY_PAGE_SETTINGS) { + if (DisplayControl.DisplayPage >= DSO_PAGE_SETTINGS) { drawDSOSettingsPage(); } else { activateChartGui(); @@ -840,16 +823,16 @@ void redrawDisplay() { #if !defined(AVR) TouchButtonChartHistoryOnOff.activate(); //??? // initialize FFTDisplayBuffer - memset(&DisplayBufferFFT[0], REMOTE_DISPLAY_HEIGHT - 1, sizeof(DisplayBufferFFT)); + memset(&DisplayBufferFFT[0], DISPLAY_HEIGHT - 1, sizeof(DisplayBufferFFT)); #endif } } else { /* * analyze mode */ - if (DisplayControl.DisplayPage == DISPLAY_PAGE_START) { + if (DisplayControl.DisplayPage == DSO_PAGE_START) { drawStartPage(); - } else if (DisplayControl.DisplayPage == DISPLAY_PAGE_CHART) { + } else if (DisplayControl.DisplayPage == DSO_PAGE_CHART) { activateChartGui(); drawGridLinesWithHorizLabelsAndTriggerLine(); drawMinMaxLines(); @@ -857,11 +840,11 @@ void redrawDisplay() { #if defined(AVR) drawDataBuffer(DataBufferControl.DataBufferDisplayStart, COLOR_DATA_HOLD, DisplayControl.EraseColor); #else - drawDataBuffer(DataBufferControl.DataBufferDisplayStart, REMOTE_DISPLAY_WIDTH, COLOR_DATA_HOLD, 0, - DRAW_MODE_REGULAR, MeasurementControl.isEffectiveMinMaxMode); + drawDataBuffer(DataBufferControl.DataBufferDisplayStart, DISPLAY_WIDTH, COLOR_DATA_HOLD, 0, DRAW_MODE_REGULAR, + MeasurementControl.isEffectiveMinMaxMode); #endif printInfo(); - } else if (DisplayControl.DisplayPage == DISPLAY_PAGE_SETTINGS) { + } else if (DisplayControl.DisplayPage == DSO_PAGE_SETTINGS) { drawDSOSettingsPage(); } } @@ -884,19 +867,17 @@ void drawStartPage(void) { #endif TouchButtonSettingsPage.drawButton(); //Welcome text - BlueDisplay1.drawMLText(10, BUTTON_HEIGHT_4_LINE_2 + 32, F("Welcome to\nArduino DSO"), 32, COLOR16_BLUE, - COLOR16_NO_BACKGROUND); - BlueDisplay1.drawText(10, BUTTON_HEIGHT_4_LINE_2 + (3 * 32), F("300 kSamples/s"), 22, COLOR16_BLUE, - COLOR_BACKGROUND_DSO); - uint8_t tPos = BlueDisplay1.drawText(10, BUTTON_HEIGHT_4_LINE_2 + (3 * 32) + 22, F("V" VERSION_DSO "/" VERSION_BLUE_DISPLAY), + BlueDisplay1.drawMLText(10, BUTTON_HEIGHT_4_LINE_2 + 34, F("Welcome to\nArduino DSO"), 32, COLOR16_BLUE, COLOR16_NO_BACKGROUND); + BlueDisplay1.drawText(10, BUTTON_HEIGHT_4_LINE_2 + (3 * 32), F("300 kSamples/s"), 22, COLOR16_BLUE, COLOR_BACKGROUND_DSO); + uint8_t + tPos = BlueDisplay1.drawText(10, BUTTON_HEIGHT_4_LINE_2 + (3 * 32) + 22, F("V" VERSION_DSO "/" VERSION_BLUE_DISPLAY), 11, COLOR16_BLUE, COLOR_BACKGROUND_DSO); BlueDisplay1.drawText(tPos, BUTTON_HEIGHT_4_LINE_2 + (3 * 32) + 22, F(" from " __DATE__), 11, COLOR16_BLUE, - COLOR_BACKGROUND_DSO); + COLOR_BACKGROUND_DSO); // Hints #if !defined(AVR) - BlueDisplay1.drawText(BUTTON_WIDTH_3, TEXT_SIZE_11_ASCEND, "\xABScale\xBB", TEXT_SIZE_11, COLOR_YELLOW, - COLOR_BACKGROUND_DSO); + BlueDisplay1.drawText(SLIDER_DEFAULT_BAR_WIDTH + 6, BUTTON_HEIGHT_4 + TEXT_SIZE_22_ASCEND, "\xABScale\xBB", TEXT_SIZE_22, COLOR16_YELLOW, COLOR_BACKGROUND_DSO); #endif BlueDisplay1.drawText(BUTTON_WIDTH_3, BUTTON_HEIGHT_4_LINE_4 + BUTTON_DEFAULT_SPACING + TEXT_SIZE_22_ASCEND, F("\xABScroll\xBB"), TEXT_SIZE_22, COLOR16_GREEN, COLOR_BACKGROUND_DSO); @@ -922,14 +903,14 @@ void drawDSOSettingsPage(void) { * Determine colors for 3 fixed channel buttons */ for (int i = 0; i < NUMBER_OF_CHANNELS_WITH_FIXED_ATTENUATOR; ++i) { - if (i == MeasurementControl.ADCInputMUXChannelIndex) { + if (i == MeasurementControl.ADMUXChannel) { tButtonColor = BUTTON_AUTO_RED_GREEN_TRUE_COLOR; } else { tButtonColor = BUTTON_AUTO_RED_GREEN_FALSE_COLOR; } TouchButtonChannels[i].setButtonColorAndDraw(tButtonColor); } - if (MeasurementControl.ADCInputMUXChannelIndex >= NUMBER_OF_CHANNELS_WITH_FIXED_ATTENUATOR) { + if (MeasurementControl.ADMUXChannel >= NUMBER_OF_CHANNELS_WITH_FIXED_ATTENUATOR) { tButtonColor = BUTTON_AUTO_RED_GREEN_TRUE_COLOR; } else { tButtonColor = BUTTON_AUTO_RED_GREEN_FALSE_COLOR; @@ -957,7 +938,7 @@ void drawDSOSettingsPage(void) { TouchButtonDrawModeTriggerLine.drawButton(); #endif -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(SUPPORT_LOCAL_DISPLAY) TouchSliderBacklight.drawSlider(); #endif @@ -977,13 +958,13 @@ void drawDSOSettingsPage(void) { #if !defined(AVR) void drawDSOMoreSettingsPage(void) { // do not clear screen here since gui is refreshed periodically while DSO is running - BDButton::deactivateAllButtons(); - BDSlider::deactivateAllSliders(); + BDButton::deactivateAll(); + BDSlider::deactivateAll(); //1. Row TouchButtonCalibrateVoltage.drawButton(); TouchButtonBack.drawButton(); -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(SUPPORT_LOCAL_DISPLAY) //2. Row TouchButtonDrawModeLinePixel.drawButton(); TouchButtonADS7846TestOnOff.drawButton(); @@ -1007,18 +988,18 @@ void drawRunningOnlyPartOfGui(void) { // } if (!MeasurementControl.RangeAutomatic || MeasurementControl.OffsetMode == OFFSET_MODE_MANUAL) { -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(SUPPORT_LOCAL_DISPLAY) BlueDisplay1.drawMLText(TEXT_SIZE_11_WIDTH, TEXT_SIZE_11_HEIGHT + TEXT_SIZE_22_ASCEND, "\xD4\nR\na\nn\ng\ne\n\xD5", TEXT_SIZE_22, COLOR_GUI_TRIGGER, COLOR16_NO_BACKGROUND); #else //START_PAGE_BUTTON_HEIGHT + TEXT_SIZE_22_ASCEND is to much for 240 display BlueDisplay1.drawText(TEXT_SIZE_11_WIDTH, START_PAGE_BUTTON_HEIGHT, F("\xD4\nR\na\nn\ng\ne\n\xD5"), TEXT_SIZE_22, - COLOR_GUI_TRIGGER, COLOR16_NO_BACKGROUND); + COLOR_GUI_TRIGGER, COLOR16_NO_BACKGROUND); #endif } if (MeasurementControl.OffsetMode != OFFSET_MODE_0_VOLT) { -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(SUPPORT_LOCAL_DISPLAY) BlueDisplay1.drawMLText(BUTTON_WIDTH_3_POS_3 - TEXT_SIZE_22_WIDTH, TEXT_SIZE_11_HEIGHT + TEXT_SIZE_22_ASCEND, "\xD4\nO\nf\nf\ns\ne\nt\n\xD5", TEXT_SIZE_22, COLOR_GUI_TRIGGER, COLOR16_NO_BACKGROUND); #else @@ -1027,8 +1008,8 @@ void drawRunningOnlyPartOfGui(void) { #endif } - BlueDisplay1.drawText(BUTTON_WIDTH_8, BUTTON_HEIGHT_4_LINE_4 - TEXT_SIZE_22_DECEND, F("\xABTimeBase\xBB"), - TEXT_SIZE_22, COLOR_GUI_SOURCE_TIMEBASE, COLOR_BACKGROUND_DSO); + BlueDisplay1.drawText(BUTTON_WIDTH_8, BUTTON_HEIGHT_4_LINE_4 - TEXT_SIZE_22_DECEND, F("\xABTimeBase\xBB"), TEXT_SIZE_22, + COLOR_GUI_SOURCE_TIMEBASE, COLOR_BACKGROUND_DSO); //1. Row TouchButtonChartHistoryOnOff.drawButton(); @@ -1051,7 +1032,7 @@ void clearTriggerLine(uint8_t aTriggerLevelDisplayValue) { if (!MeasurementControl.isRunning) { // in analysis mode restore graph at old y position uint8_t *ScreenBufferPointer = &DisplayBuffer[0]; - for (unsigned int i = 0; i < REMOTE_DISPLAY_WIDTH; ++i) { + for (unsigned int i = 0; i < DISPLAY_WIDTH; ++i) { int tValueByte = *ScreenBufferPointer++; if (tValueByte == aTriggerLevelDisplayValue) { // restore old pixel @@ -1068,7 +1049,7 @@ void clearTriggerLine(uint8_t aTriggerLevelDisplayValue) { void drawTriggerLine(void) { uint8_t tValue = DisplayControl.TriggerLevelDisplayValue; if (tValue != 0 && MeasurementControl.TriggerMode < TRIGGER_MODE_FREE) { - BlueDisplay1.drawLineRel(0, tValue, REMOTE_DISPLAY_WIDTH, 0, COLOR_TRIGGER_LINE); + BlueDisplay1.drawLineRel(0, tValue, DISPLAY_WIDTH, 0, COLOR_TRIGGER_LINE); } } @@ -1084,19 +1065,19 @@ void drawMinMaxLines(void) { #endif tValueDisplay = getDisplayFromRawInputValue(MeasurementControl.RawValueMax); if (tValueDisplay != 0) { - BlueDisplay1.drawLineRel(0, tValueDisplay, REMOTE_DISPLAY_WIDTH, 0, COLOR_MAX_MIN_LINE); + BlueDisplay1.drawLineRel(0, tValueDisplay, DISPLAY_WIDTH, 0, COLOR_MAX_MIN_LINE); } // min line tValueDisplay = getDisplayFromRawInputValue(MeasurementControl.RawValueMin); if (tValueDisplay != DISPLAY_VALUE_FOR_ZERO) { - BlueDisplay1.drawLineRel(0, tValueDisplay, REMOTE_DISPLAY_WIDTH, 0, COLOR_MAX_MIN_LINE); + BlueDisplay1.drawLineRel(0, tValueDisplay, DISPLAY_WIDTH, 0, COLOR_MAX_MIN_LINE); } } void clearHorizontalLineAndRestoreGrid(int aYposition) { // clear line - BlueDisplay1.drawLineRel(0, aYposition, REMOTE_DISPLAY_WIDTH, 0, COLOR_BACKGROUND_DSO); - for (unsigned int tXPos = TIMING_GRID_WIDTH - 1; tXPos < REMOTE_DISPLAY_WIDTH - 1; tXPos += TIMING_GRID_WIDTH) { + BlueDisplay1.drawLineRel(0, aYposition, DISPLAY_WIDTH, 0, COLOR_BACKGROUND_DSO); + for (unsigned int tXPos = TIMING_GRID_WIDTH - 1; tXPos < DISPLAY_WIDTH - 1; tXPos += TIMING_GRID_WIDTH) { BlueDisplay1.drawPixel(tXPos, aYposition, COLOR_GRID_LINES); } } @@ -1105,12 +1086,12 @@ void clearHorizontalLineAndRestoreGrid(int aYposition) { * draws vertical timing + horizontal reference voltage lines */ void drawGridLinesWithHorizLabelsAndTriggerLine() { - if (DisplayControl.DisplayPage != DISPLAY_PAGE_CHART) { + if (DisplayControl.DisplayPage != DSO_PAGE_CHART) { return; } // vertical (timing) lines - for (unsigned int tXPos = TIMING_GRID_WIDTH - 1; tXPos < REMOTE_DISPLAY_WIDTH; tXPos += TIMING_GRID_WIDTH) { - BlueDisplay1.drawLineRel(tXPos, 0, 0, REMOTE_DISPLAY_HEIGHT, COLOR_GRID_LINES); + for (unsigned int tXPos = TIMING_GRID_WIDTH - 1; tXPos < DISPLAY_WIDTH; tXPos += TIMING_GRID_WIDTH) { + BlueDisplay1.drawLineRel(tXPos, 0, 0, DISPLAY_HEIGHT, COLOR_GRID_LINES); } #if defined(AVR) /* @@ -1129,18 +1110,18 @@ void drawGridLinesWithHorizLabelsAndTriggerLine() { for (int32_t tYPosLoop = 0x8000; tYPosLoop > 0; tYPosLoop -= MeasurementControl.HorizontalGridSizeShift8) { uint16_t tYPos = tYPosLoop / 0x100; // horizontal line - BlueDisplay1.drawLineRel(0, tYPos, REMOTE_DISPLAY_WIDTH, 0, COLOR_GRID_LINES); + BlueDisplay1.drawLineRel(0, tYPos, DISPLAY_WIDTH, 0, COLOR_GRID_LINES); dtostrf(tActualVoltage, tLength, tPrecision, tStringBuffer); // draw label over the line BlueDisplay1.drawText(HORIZONTAL_LINE_LABELS_CAPION_X, tYPos + (TEXT_SIZE_11_ASCEND / 2), tStringBuffer, 11, - COLOR_HOR_REF_LINE_LABEL, COLOR16_NO_BACKGROUND); - if (tYPos != REMOTE_DISPLAY_HEIGHT / 2) { + COLOR_HOR_REF_LINE_LABEL, COLOR16_NO_BACKGROUND); + if (tYPos != DISPLAY_HEIGHT / 2) { // line with negative value - BlueDisplay1.drawLineRel(0, REMOTE_DISPLAY_HEIGHT - tYPos, REMOTE_DISPLAY_WIDTH, 0, COLOR_GRID_LINES); + BlueDisplay1.drawLineRel(0, DISPLAY_HEIGHT - tYPos, DISPLAY_WIDTH, 0, COLOR_GRID_LINES); dtostrf(-tActualVoltage, tLength, tPrecision, tStringBuffer); // draw label over the line BlueDisplay1.drawText(HORIZONTAL_LINE_LABELS_CAPION_X - TEXT_SIZE_11_WIDTH, - REMOTE_DISPLAY_HEIGHT - tYPos + (TEXT_SIZE_11_ASCEND / 2), tStringBuffer, 11, COLOR_HOR_REF_LINE_LABEL, + DISPLAY_HEIGHT - tYPos + (TEXT_SIZE_11_ASCEND / 2), tStringBuffer, 11, COLOR_HOR_REF_LINE_LABEL, COLOR16_NO_BACKGROUND); } tActualVoltage += MeasurementControl.HorizontalGridVoltage; @@ -1155,11 +1136,11 @@ void drawGridLinesWithHorizLabelsAndTriggerLine() { for (int32_t tYPosLoop = 0xFF80; tYPosLoop > 0; tYPosLoop -= MeasurementControl.HorizontalGridSizeShift8) { uint16_t tYPos = tYPosLoop / 0x100; // horizontal line - BlueDisplay1.drawLineRel(0, tYPos, REMOTE_DISPLAY_WIDTH, 0, COLOR_GRID_LINES); + BlueDisplay1.drawLineRel(0, tYPos, DISPLAY_WIDTH, 0, COLOR_GRID_LINES); dtostrf(tActualVoltage, tLength, tPrecision, tStringBuffer); // draw label over the line BlueDisplay1.drawText(HORIZONTAL_LINE_LABELS_CAPION_X, tYPos - tCaptionOffset, tStringBuffer, 11, - COLOR_HOR_REF_LINE_LABEL, COLOR16_NO_BACKGROUND); + COLOR_HOR_REF_LINE_LABEL, COLOR16_NO_BACKGROUND); // draw next caption on the line tCaptionOffset = -(TEXT_SIZE_11_ASCEND / 2); tActualVoltage += MeasurementControl.HorizontalGridVoltage; @@ -1189,20 +1170,20 @@ void drawGridLinesWithHorizLabelsAndTriggerLine() { for (int tYPos = DISPLAY_VALUE_FOR_ZERO; tYPos > 0; tYPos -= HORIZONTAL_GRID_HEIGHT) { if (tLabelChanged) { // clear old label - int tXpos = REMOTE_DISPLAY_WIDTH - PIXEL_AFTER_LABEL - (5 * TEXT_SIZE_11_WIDTH); + int tXpos = DISPLAY_WIDTH - PIXEL_AFTER_LABEL - (5 * TEXT_SIZE_11_WIDTH); int tY = tYPos - tCaptionOffset; - BlueDisplay1.fillRect(tXpos, tY - TEXT_SIZE_11_ASCEND, REMOTE_DISPLAY_WIDTH - PIXEL_AFTER_LABEL + 1, + BlueDisplay1.fillRect(tXpos, tY - TEXT_SIZE_11_ASCEND, DISPLAY_WIDTH - PIXEL_AFTER_LABEL + 1, tY + TEXT_SIZE_11_HEIGHT - TEXT_SIZE_11_ASCEND, COLOR_BACKGROUND_DSO); // restore last vertical line since label may overlap these line BlueDisplay1.drawLineRel(9 * TIMING_GRID_WIDTH - 1, tY, 0, TEXT_SIZE_11_HEIGHT, COLOR_GRID_LINES); } // draw horizontal line - BlueDisplay1.drawLineRel(0, tYPos, REMOTE_DISPLAY_WIDTH, 0, COLOR_GRID_LINES); + BlueDisplay1.drawLineRel(0, tYPos, DISPLAY_WIDTH, 0, COLOR_GRID_LINES); int tCount = snprintf(sStringBuffer, sizeof sStringBuffer, "%0.*f", RangePrecision[MeasurementControl.DisplayRangeIndexForPrint], tActualVoltage); // right align but leave 2 pixel free after label for the last horizontal line - tPosX = REMOTE_DISPLAY_WIDTH - (tCount * TEXT_SIZE_11_WIDTH) - PIXEL_AFTER_LABEL; + tPosX = DISPLAY_WIDTH - (tCount * TEXT_SIZE_11_WIDTH) - PIXEL_AFTER_LABEL; // draw label over the line - use different color for negative values if (tActualVoltage >= 0) { tLabelColor = COLOR_HOR_GRID_LINE_LABEL; @@ -1224,9 +1205,9 @@ void setChannelButtonsCaption(void) { for (uint_fast8_t i = 0; i < NUMBER_OF_CHANNELS_WITH_FIXED_ATTENUATOR; ++i) { if (MeasurementControl.AttenuatorType == ATTENUATOR_TYPE_FIXED_ATTENUATOR) { // TouchButtonAutoOffsetMode.setCaptionFromStringArrayPGM(ChannelDivByButtonStrings, i); // requires 16 butes more - TouchButtonChannels[i].setCaptionPGM(ChannelDivByButtonStrings[i]); + TouchButtonChannels[i].setCaption((const __FlashStringHelper *)ChannelDivByButtonStrings[i]); } else { - TouchButtonChannels[i].setCaptionPGM(ADCInputMUXChannelStrings[i]); + TouchButtonChannels[i].setCaption((const __FlashStringHelper *)ADCInputMUXChannelStrings[i]); } } } @@ -1241,12 +1222,12 @@ void setSlopeButtonCaption(void) { SlopeButtonString[SLOPE_STRING_INDEX + 1] = 'e'; // for decending } SlopeButtonString[SLOPE_STRING_INDEX] = tChar; - TouchButtonSlope.setCaption(SlopeButtonString, (DisplayControl.DisplayPage == DISPLAY_PAGE_SETTINGS)); + TouchButtonSlope.setCaption(SlopeButtonString, (DisplayControl.DisplayPage == DSO_PAGE_SETTINGS)); } void setTriggerModeButtonCaption(void) { - TouchButtonTriggerMode.setCaptionFromStringArrayPGM(sTriggerModeButtonCaptionStringArray, MeasurementControl.TriggerMode, - (DisplayControl.DisplayPage == DISPLAY_PAGE_SETTINGS)); + TouchButtonTriggerMode.setCaptionFromStringArray((const __FlashStringHelper *const *)sTriggerModeButtonCaptionStringArray, MeasurementControl.TriggerMode, + (DisplayControl.DisplayPage == DSO_PAGE_SETTINGS)); } void setAutoRangeModeAndButtonCaption(bool aNewAutoRangeMode) { @@ -1257,19 +1238,19 @@ void setAutoRangeModeAndButtonCaption(bool aNewAutoRangeMode) { } else { tCaption = AutoRangeButtonStringManual; } - TouchButtonAutoRangeOnOff.setCaptionPGM(tCaption, (DisplayControl.DisplayPage == DISPLAY_PAGE_SETTINGS)); + TouchButtonAutoRangeOnOff.setCaption((const __FlashStringHelper *)tCaption, (DisplayControl.DisplayPage == DSO_PAGE_SETTINGS)); } void setAutoOffsetButtonCaption(void) { - TouchButtonAutoOffsetMode.setCaptionFromStringArrayPGM(sAutoOffsetButtonCaptionStringArray, MeasurementControl.OffsetMode, - (DisplayControl.DisplayPage == DISPLAY_PAGE_SETTINGS)); + TouchButtonAutoOffsetMode.setCaptionFromStringArray((const __FlashStringHelper *const *)sAutoOffsetButtonCaptionStringArray, MeasurementControl.OffsetMode, + (DisplayControl.DisplayPage == DSO_PAGE_SETTINGS)); } void setACModeButtonCaption(void) { if (MeasurementControl.ChannelIsACMode) { - TouchButtonAcDc.setCaptionPGM(PSTR("AC")); + TouchButtonAcDc.setCaption(F("AC")); } else { - TouchButtonAcDc.setCaptionPGM(PSTR("DC")); + TouchButtonAcDc.setCaption(F("DC")); } } @@ -1279,27 +1260,17 @@ void setTriggerDelayCaption(void) { if (MeasurementControl.TriggerDelayMode != TRIGGER_DELAY_NONE) { printfTriggerDelay(&sStringBuffer[14], MeasurementControl.TriggerDelayMillisOrMicros); } - TouchButtonTriggerDelay.setCaption(sStringBuffer, (DisplayControl.DisplayPage == DISPLAY_PAGE_SETTINGS)); + TouchButtonTriggerDelay.setCaption(sStringBuffer, (DisplayControl.DisplayPage == DSO_PAGE_SETTINGS)); } void setReferenceButtonCaption(void) { const char *tCaption; - if (MeasurementControl.ADCReference == DEFAULT) { + if (MeasurementControl.ADCReferenceShifted == (DEFAULT << REFS0)) { tCaption = ReferenceButtonVCC; } else { tCaption = ReferenceButton1_1V; } - TouchButtonADCReference.setCaptionPGM(tCaption, (DisplayControl.DisplayPage == DISPLAY_PAGE_SETTINGS)); -} -#endif - -#if defined(LOCAL_DISPLAY_EXISTS) -void setMinMaxModeButtonCaption(void) { - if (MeasurementControl.isMinMaxMode) { - TouchButtonMinMaxMode.setCaption("Min/Max\nmode"); - } else { - TouchButtonMinMaxMode.setCaption("Sample\nmode"); - } + TouchButtonADCReference.setCaption((const __FlashStringHelper *)tCaption, (DisplayControl.DisplayPage == DSO_PAGE_SETTINGS)); } #endif @@ -1320,36 +1291,15 @@ void startDSOSettingsPage(void) { * Switch between upper info line short/long/off */ void doSwitchInfoModeOnTouchUp(struct TouchEvent *const aTouchPosition) { -#if defined(LOCAL_DISPLAY_EXISTS) -// first check for buttons - if (!TouchButton::checkAllButtons(aTouchPosition->TouchPosition.PosX, aTouchPosition->TouchPosition.PosY)) { -#endif - if (DisplayControl.DisplayPage == DISPLAY_PAGE_CHART) { - // Wrap display mode -// uint8_t tOldMode = DisplayControl.showInfoMode; - uint8_t tNewMode = DisplayControl.showInfoMode + 1; - if (tNewMode > INFO_MODE_LONG_INFO) { - tNewMode = INFO_MODE_NO_INFO; - } - DisplayControl.showInfoMode = tNewMode; - redrawDisplay(); - -// if (tNewMode == INFO_MODE_NO_INFO) { -// if (MeasurementControl.isRunning) { -// // erase former info line -// clearInfo(tOldMode); -// } else { -// redrawDisplay(); -// } -// } else { -// // erase former info line -// clearInfo(tOldMode); -// printInfo(); -// } + if (DisplayControl.DisplayPage == DSO_PAGE_CHART) { + // Wrap display mode + uint8_t tNewMode = DisplayControl.showInfoMode + 1; + if (tNewMode > INFO_MODE_LONG_INFO) { + tNewMode = INFO_MODE_NO_INFO; } -#if defined(LOCAL_DISPLAY_EXISTS) + DisplayControl.showInfoMode = tNewMode; + redrawDisplay(); } -#endif } /* @@ -1358,7 +1308,7 @@ void doSwitchInfoModeOnTouchUp(struct TouchEvent *const aTouchPosition) { */ void doLongTouchDownDSO(struct TouchEvent *const aTouchPosition) { static bool sIsGUIVisible = false; - if (DisplayControl.DisplayPage == DISPLAY_PAGE_CHART) { + if (DisplayControl.DisplayPage == DSO_PAGE_CHART) { if (MeasurementControl.isRunning) { if (sIsGUIVisible) { // hide GUI @@ -1370,12 +1320,12 @@ void doLongTouchDownDSO(struct TouchEvent *const aTouchPosition) { sIsGUIVisible = !sIsGUIVisible; } else { // clear screen and show start gui - DisplayControl.DisplayPage = DISPLAY_PAGE_START; + DisplayControl.DisplayPage = DSO_PAGE_START; redrawDisplay(); } - } else if (DisplayControl.DisplayPage == DISPLAY_PAGE_START) { + } else if (DisplayControl.DisplayPage == DSO_PAGE_START) { // only chart (and voltage picker) - DisplayControl.DisplayPage = DISPLAY_PAGE_CHART; + DisplayControl.DisplayPage = DSO_PAGE_CHART; redrawDisplay(); } } @@ -1384,13 +1334,9 @@ void doLongTouchDownDSO(struct TouchEvent *const aTouchPosition) { * responsible for swipe detection and dispatching */ void doSwipeEndDSO(struct Swipe *const aSwipeInfo) { -#if defined(AVR) - uint8_t tFeedbackType = FEEDBACK_TONE_ERROR; -#else - int tFeedbackType = FEEDBACK_TONE_ERROR; -#endif + bool tIsError = true; - if (DisplayControl.DisplayPage == DISPLAY_PAGE_CHART) { + if (DisplayControl.DisplayPage == DSO_PAGE_CHART) { if (MeasurementControl.isRunning) { /* * Running mode @@ -1405,7 +1351,7 @@ void doSwipeEndDSO(struct Swipe *const aSwipeInfo) { int tTouchDeltaXGrid = aSwipeInfo->TouchDeltaX / 64; #endif if (tTouchDeltaXGrid != 0) { - tFeedbackType = changeTimeBaseValue(-tTouchDeltaXGrid); + tIsError = changeTimeBaseValue(-tTouchDeltaXGrid); printInfo(); } } else { @@ -1415,7 +1361,7 @@ void doSwipeEndDSO(struct Swipe *const aSwipeInfo) { #endif if (!MeasurementControl.RangeAutomatic) { #if defined(AVR) - tFeedbackType = changeRange(aSwipeInfo->TouchDeltaY / 64); + tIsError = changeRange(aSwipeInfo->TouchDeltaY / 64); #else /* * range manual. If offset not fixed, check if swipe in the right third of screen, then do changeOffsetGridCount() @@ -1424,36 +1370,34 @@ void doSwipeEndDSO(struct Swipe *const aSwipeInfo) { // decide which swipe to perform according to x position of swipe if (aSwipeInfo->TouchStartX > BUTTON_WIDTH_3_POS_2) { //offset - tFeedbackType = changeOffsetGridCount(tTouchDeltaYGrid); + tIsError = changeOffsetGridCount(tTouchDeltaYGrid); } else { - tFeedbackType = changeDisplayRangeAndAdjustOffsetGridCount(tTouchDeltaYGrid / 2); + tIsError = changeDisplayRangeAndAdjustOffsetGridCount(tTouchDeltaYGrid / 2); } } } else if (MeasurementControl.OffsetMode != OFFSET_MODE_0_VOLT) { - tFeedbackType = changeOffsetGridCount(tTouchDeltaYGrid); + tIsError = changeOffsetGridCount(tTouchDeltaYGrid); #endif } } } else { /* - * Analyze Mode scroll or scale + * Analyze Mode -> scroll or scale */ #if !defined(AVR) - if (aSwipeInfo->TouchStartY > BUTTON_HEIGHT_4_LINE_3 + TEXT_SIZE_22) { + if (aSwipeInfo->TouchStartY < LOCAL_DISPLAY_HEIGHT / 2) { + tIsError = changeXScale(aSwipeInfo->TouchDeltaX / 64); + } else #endif - tFeedbackType = scrollChart(-aSwipeInfo->TouchDeltaX); -#if !defined(AVR) - } else { - // scale - tFeedbackType = changeXScale(aSwipeInfo->TouchDeltaX / 64); + { + tIsError = scrollChart(-aSwipeInfo->TouchDeltaX); // Scroll } -#endif } } -#if defined(LOCAL_DISPLAY_EXISTS) - FeedbackTone(tFeedbackType); +#if defined(SUPPORT_LOCAL_DISPLAY) + LocalTouchButton::playFeedbackTone(tIsError); #else - BlueDisplay1.playFeedbackTone(tFeedbackType); + BDButton::playFeedbackTone(tIsError); #endif } @@ -1461,7 +1405,7 @@ void doSwipeEndDSO(struct Swipe *const aSwipeInfo) { * Button handler section ************************************************************************/ /* - * default handler for back button + * default handler for TouchButtonMainHome */ void doDefaultBackButton(BDButton *aTheTouchedButton, int16_t aValue) { sBackButtonPressed = true; @@ -1471,12 +1415,12 @@ void doDefaultBackButton(BDButton *aTheTouchedButton, int16_t aValue) { * show gui of settings screen */ void doShowSettingsPage(BDButton *aTheTouchedButton, int16_t aValue) { - DisplayControl.DisplayPage = DISPLAY_PAGE_SETTINGS; + DisplayControl.DisplayPage = DSO_PAGE_SETTINGS; redrawDisplay(); } void doShowFrequencyPage(BDButton *aTheTouchedButton, int16_t aValue) { - DisplayControl.DisplayPage = DISPLAY_PAGE_FREQUENCY; + DisplayControl.DisplayPage = DSO_PAGE_FREQUENCY; startFrequencyGeneratorPage(); } @@ -1543,16 +1487,16 @@ void doOffsetMode(BDButton *aTheTouchedButton, int16_t aValue) { * Cycle through all external and internal adc channels if button value is > 20 */ void doChannelSelect(BDButton *aTheTouchedButton, int16_t aValue) { -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(SUPPORT_LOCAL_DISPLAY) if (MeasurementControl.ADS7846ChannelsAsDatasource) { // ADS7846 channels - MeasurementControl.ADCInputMUXChannelIndex++; - if (MeasurementControl.ADCInputMUXChannelIndex >= ADS7846_CHANNEL_COUNT) { + MeasurementControl.ADMUXChannel++; + if (MeasurementControl.ADMUXChannel >= ADS7846_CHANNEL_COUNT) { // wrap to first channel connected to attenuator and restore ACRange - MeasurementControl.ADCInputMUXChannelIndex = 0; + MeasurementControl.ADMUXChannel = 0; MeasurementControl.isACMode = DSO_getACMode(); } - aTheTouchedButton->setCaption(ADS7846ChannelStrings[MeasurementControl.ADCInputMUXChannelIndex]); + aTheTouchedButton->setCaption(ADS7846ChannelStrings[MeasurementControl.ADMUXChannel]); } else #endif @@ -1563,7 +1507,7 @@ void doChannelSelect(BDButton *aTheTouchedButton, int16_t aValue) { /* * aValue > 20 means TouchButtonChannelSelect was pressed, so increment button caption here ( "Ch. 3", "Ch. 4", "Temp." , "VRef") */ - uint8_t tOldValue = MeasurementControl.ADCInputMUXChannelIndex; + uint8_t tOldValue = MeasurementControl.ADMUXChannel; // if channel 3 is not selected, increment channel, otherwise select channel 3 if (tOldValue < NUMBER_OF_CHANNELS_WITH_FIXED_ATTENUATOR) { // first press on this button -> stay at channel 3 @@ -1576,7 +1520,7 @@ void doChannelSelect(BDButton *aTheTouchedButton, int16_t aValue) { //reset caption of 4. button to "Ch 3" tCaptionIndex = NUMBER_OF_CHANNELS_WITH_FIXED_ATTENUATOR; } - TouchButtonChannelSelect.setCaptionPGM(ADCInputMUXChannelStrings[tCaptionIndex]); + TouchButtonChannelSelect.setCaption((const __FlashStringHelper *)ADCInputMUXChannelStrings[tCaptionIndex]); } } setChannel(tNewChannelValue); @@ -1587,7 +1531,7 @@ void doChannelSelect(BDButton *aTheTouchedButton, int16_t aValue) { * Refresh page if necessary */ // check it here since it is also called by setup - if (DisplayControl.DisplayPage == DISPLAY_PAGE_SETTINGS) { + if (DisplayControl.DisplayPage == DSO_PAGE_SETTINGS) { // manage AC/DC and auto offset buttons redrawDisplay(); } @@ -1598,7 +1542,7 @@ void doChannelSelect(BDButton *aTheTouchedButton, int16_t aValue) { */ void doChartHistory(BDButton *aTheTouchedButton, int16_t aValue) { DisplayControl.showHistory = aValue; - if (DisplayControl.DisplayPage == DISPLAY_PAGE_SETTINGS) { + if (DisplayControl.DisplayPage == DSO_PAGE_SETTINGS || DisplayControl.DisplayPage == DSO_PAGE_START) { aTheTouchedButton->drawButton(); } @@ -1620,7 +1564,7 @@ void doStartSingleshot(BDButton *aTheTouchedButton, int16_t aValue) { aTheTouchedButton->deactivate(); MeasurementControl.isSingleShotMode = true; - DisplayControl.DisplayPage = DISPLAY_PAGE_CHART; + DisplayControl.DisplayPage = DSO_PAGE_CHART; MeasurementControl.RawValueMax = 0; MeasurementControl.RawValueMin = 0; @@ -1681,7 +1625,7 @@ void doVoltagePicker(BDSlider *aTheTouchedSlider, uint16_t aValue) { // restore graph uint8_t *ScreenBufferPointer = &DisplayBuffer[0]; uint8_t *ScreenBufferMinPointer = &DisplayBufferMin[0]; - for (unsigned int i = 0; i < REMOTE_DISPLAY_WIDTH; ++i) { + for (unsigned int i = 0; i < DISPLAY_WIDTH; ++i) { int tValueByte = *ScreenBufferPointer++; if (tValueByte == tYpos) { BlueDisplay1.drawPixel(i, tValueByte, COLOR_DATA_HOLD); @@ -1698,7 +1642,7 @@ void doVoltagePicker(BDSlider *aTheTouchedSlider, uint16_t aValue) { // draw new line int tValue = DISPLAY_VALUE_FOR_ZERO - aValue; - BlueDisplay1.drawLine(0, tValue, REMOTE_DISPLAY_WIDTH, tValue, COLOR_VOLTAGE_PICKER); + BlueDisplay1.drawLine(0, tValue, DISPLAY_WIDTH, tValue, COLOR_VOLTAGE_PICKER); sLastPickerValue = aValue; float tVoltage = getFloatFromDisplayValue(tValue); @@ -1717,8 +1661,7 @@ void doVoltagePicker(BDSlider *aTheTouchedSlider, uint16_t aValue) { tYPos = SLIDER_VPICKER_INFO_LONG_Y; } // print value - BlueDisplay1.drawText(SLIDER_VPICKER_INFO_X, tYPos, sStringBuffer, FONT_SIZE_INFO_SHORT, COLOR16_BLACK, - COLOR_INFO_BACKGROUND); + BlueDisplay1.drawText(SLIDER_VPICKER_INFO_X, tYPos, sStringBuffer, FONT_SIZE_INFO_SHORT, COLOR16_BLACK, COLOR_INFO_BACKGROUND); } #if defined(AVR) @@ -1730,6 +1673,7 @@ void doPromptForTriggerDelay(BDButton *aTheTouchedButton, int16_t aValue) { } #else + void doShowPretriggerValuesOnOff(BDButton *aTheTouchedButton, int16_t aValue) { DisplayControl.DatabufferPreTriggerDisplaySize = 0; if (aValue) { @@ -1737,11 +1681,19 @@ void doShowPretriggerValuesOnOff(BDButton *aTheTouchedButton, int16_t aValue) { } } +void setMinMaxModeButtonCaption(void) { + if (MeasurementControl.isMinMaxMode) { + TouchButtonMinMaxMode.setCaption("Min/Max\nmode"); + } else { + TouchButtonMinMaxMode.setCaption("Sample\nmode"); + } +} + /* * Sets only the flag and button caption */ void doMinMaxMode(BDButton *aTheTouchedButton, int16_t aValue) { - MeasurementControl.isMinMaxMode = aValue; + MeasurementControl.isMinMaxMode = !aValue; // toggle mode if (MeasurementControl.TimebaseEffectiveIndex >= TIMEBASE_INDEX_CAN_USE_OVERSAMPLING) { // changeTimeBase() manages oversampling rate for Min/Max oversampling if (MeasurementControl.isRunning) { @@ -1751,17 +1703,20 @@ void doMinMaxMode(BDButton *aTheTouchedButton, int16_t aValue) { changeTimeBase(); } } + setMinMaxModeButtonCaption(); + TouchButtonMinMaxMode.setValueAndDraw(MeasurementControl.isMinMaxMode); } + /* * show gui of more settings screen */ void doShowMoreSettingsPage(BDButton *aTheTouchedButton, int16_t aValue) { - DisplayControl.DisplayPage = DISPLAY_PAGE_MORE_SETTINGS; + DisplayControl.DisplayPage = DSO_PAGE_MORE_SETTINGS; startDSOMoreSettingsPage(); } void doShowSystemInfoPage(BDButton *aTheTouchedButton, int16_t aValue) { - DisplayControl.DisplayPage = DISPLAY_PAGE_SYST_INFO; + DisplayControl.DisplayPage = DSO_PAGE_SYST_INFO; startSystemInfoPage(); } @@ -1770,37 +1725,38 @@ void doShowSystemInfoPage(BDButton *aTheTouchedButton, int16_t aValue) { */ void doShowFFT(BDButton *aTheTouchedButton, int16_t aValue) { DisplayControl.ShowFFT = aValue; - aTheTouchedButton->setValue(aValue); - + if (DisplayControl.DisplayPage == DSO_PAGE_START) { + // Show button on Start page + aTheTouchedButton->drawButton(); + } if (MeasurementControl.isRunning) { - if (DisplayControl.DisplayPage == DISPLAY_PAGE_SETTINGS) { - aTheTouchedButton->drawButton(); - } if (aValue) { // initialize FFTDisplayBuffer - memset(&DisplayBufferFFT[0], REMOTE_DISPLAY_HEIGHT - 1, sizeof(DisplayBufferFFT)); + memset(&DisplayBufferFFT[0], DISPLAY_HEIGHT - 1, sizeof(DisplayBufferFFT)); } else { clearFFTValuesOnDisplay(); } - } else if (DisplayControl.DisplayPage == DISPLAY_PAGE_CHART) { + } else if (DisplayControl.DisplayPage == DSO_PAGE_CHART) { if (aValue) { // compute and draw FFT - drawFFT(); + computeAndDrawFFT(); + DisplayControl.DisplaySubPage = DSO_SUB_PAGE_FFT; } else { // show graph data + DisplayControl.DisplaySubPage = DSO_SUB_PAGE_MAIN; redrawDisplay(); } } } #endif -#if defined(LOCAL_DISPLAY_EXISTS) +#if defined(SUPPORT_LOCAL_DISPLAY) /* * Toggle between pixel and line draw mode (for data chart) */ void doDrawMode(BDButton *aTheTouchedButton, int16_t aValue) { // erase old chart in old mode - drawDataBuffer(NULL, REMOTE_DISPLAY_WIDTH, DisplayControl.EraseColor, 0, DRAW_MODE_CLEAR_OLD, + drawDataBuffer(NULL, DISPLAY_WIDTH, DisplayControl.EraseColor, 0, DRAW_MODE_CLEAR_OLD, MeasurementControl.isEffectiveMinMaxMode); // switch mode if (!DisplayControl.drawPixelMode) { @@ -1817,7 +1773,7 @@ void doDrawMode(BDButton *aTheTouchedButton, int16_t aValue) { void doADS7846TestOnOff(BDButton *aTheTouchedButton, int16_t aValue) { aValue = !aValue; MeasurementControl.ADS7846ChannelsAsDatasource = aValue; - MeasurementControl.ADCInputMUXChannelIndex = 0; + MeasurementControl.ADMUXChannel = 0; if (aValue) { // ADS7846 Test on doAcDcMode(&TouchButtonAcDc, true); diff --git a/Waveforms.cpp b/Waveforms.cpp index 56fb99f..ad07c6f 100644 --- a/Waveforms.cpp +++ b/Waveforms.cpp @@ -21,7 +21,7 @@ * 2nd order (good for sine and triangle): 1 kOhm and 100 nF -> 4.7 kOhm and 22 nF * 2nd order (better for sawtooth): 1 kOhm and 22 nF -> 4.7 kOhm and 4.7 nF * - * Copyright (C) 2017 Armin Joachimsmeyer + * Copyright (C) 2017-2023 Armin Joachimsmeyer * Email: armin.joachimsmeyer@gmail.com * * This file is part of Arduino-Simple-DSO https://github.com/ArminJo/Arduino-Simple-DSO. @@ -33,8 +33,8 @@ * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . @@ -63,7 +63,7 @@ const uint8_t sSineTableQuarter128[SIZE_OF_SINE_TABLE_QUARTER + 1] PROGMEM = { 1 #define BASE_PERIOD_MICROS_FOR_TRIANGLE 8176UL // (1/F_CPU) * PWM_RESOLUTION * (256+255) Values -> 122.3092 Hz #define BASE_PERIOD_MICROS_FOR_SAWTOOTH 4096UL // (1/F_CPU) * PWM_RESOLUTION * 256 Values -> 244.140625 Hz -const char FrequencyFactorChars[4] = { 'm', ' ', 'k', 'M' }; +const char FrequencyRangeChars[4] = { 'm', ' ', 'k', 'M' }; /* * 8-bit PWM Output at PIN 10 @@ -108,27 +108,27 @@ void setWaveformMode(uint8_t aNewMode) { // start timer if not already done startWaveform(); // recompute values - setWaveformFrequency(); + setWaveformFrequencyFromNormalizedValues(); } void cycleWaveformMode() { setWaveformMode(sFrequencyInfo.Waveform + 1); } -const char * cycleWaveformModePGMString() { +const __FlashStringHelper* cycleWaveformModePGMString() { cycleWaveformMode(); return getWaveformModePGMString(); } -const char * getWaveformModePGMString() { - const char *tResultString; - tResultString = PSTR("Square"); +const __FlashStringHelper* getWaveformModePGMString() { + const __FlashStringHelper *tResultString; + tResultString = F("Square"); if (sFrequencyInfo.Waveform == WAVEFORM_SINE) { - tResultString = PSTR("Sine"); + tResultString = F("Sine"); } else if (sFrequencyInfo.Waveform == WAVEFORM_TRIANGLE) { - tResultString = PSTR("Triangle"); + tResultString = F("Triangle"); } else if (sFrequencyInfo.Waveform == WAVEFORM_SAWTOOTH) { - tResultString = PSTR("Sawtooth"); + tResultString = F("Sawtooth"); } return tResultString; } @@ -146,51 +146,56 @@ float getPeriodMicros() { return tPeriodMicros; } -void setNormalizedFrequencyFactor(int aIndexValue) { - sFrequencyInfo.FrequencyFactorIndex = aIndexValue; +void setNormalizedFrequencyFactorFromRangeIndex(uint8_t aFrequencyRangeIndex) { + sFrequencyInfo.FrequencyRangeIndex = aFrequencyRangeIndex; uint32_t tFactor = 1; - while (aIndexValue >= 1) { + while (aFrequencyRangeIndex >= 1) { tFactor *= 1000; - aIndexValue--; + aFrequencyRangeIndex--; } - sFrequencyInfo.FrequencyFactorTimes1000 = tFactor; + sFrequencyInfo.FrequencyNormalizedFactorTimes1000 = tFactor; } /* - * Set display values sFrequencyNormalized and sFrequencyFactorIndex - * - * Problem is set e.g. value of 1 Hz as 1000 mHz or 1 Hz? - * so we just try to keep the existing range. - * First put value of 1000 to next range, - * then undo if value < 1.00001 and existing range is one lower + * Convert the effective frequency for display purposes to + * a normalized value between 1 and 100 and a factor, so that + * aEffectiveFrequency = FrequencyNormalizedTo_1_to_1000 * (FrequencyNormalizedFactorTimes1000 / 1000) */ -void setNormalizedFrequencyAndFactor(float aValue) { - uint8_t tFrequencyFactorIndex = 1; - // normalize Frequency to 1 - 1000 and compute FrequencyFactorIndex - if (aValue < 1) { - tFrequencyFactorIndex = 0; //mHz - aValue *= 1000; +void setNormalizedFrequencyAndFactor(float aFrequency) { + uint8_t tFrequencyRangeIndex = 1; + + /* + * Normalize Frequency to 1 - 1000 and compute FrequencyRangeIndex + */ + if (aFrequency < 1) { + tFrequencyRangeIndex = 0; // mHz + aFrequency *= 1000; } else { - // 1000.1 to avoid switching to next range because of resolution issues - while (aValue >= 1000) { - aValue /= 1000; - tFrequencyFactorIndex++; + while (aFrequency >= 1000) { + aFrequency /= 1000; + tFrequencyRangeIndex++; } } - // check if tFrequencyFactorIndex - 1 fits better - if (aValue < 1.00001 && sFrequencyInfo.FrequencyFactorIndex == (tFrequencyFactorIndex - 1)) { - aValue *= 1000; - tFrequencyFactorIndex--; + /* + * One problem is, to decide to set the value of e.g. 1 Hz as 1000 mHz or 1 Hz. + * So we just try to keep the existing range. + */ + // Check if tFrequencyRangeIndex - 1 fits better. 1000.1 to avoid switching to next range because of resolution issues + if (aFrequency < 1.00001 && sFrequencyInfo.FrequencyRangeIndex == (tFrequencyRangeIndex - 1)) { + aFrequency *= 1000; + tFrequencyRangeIndex--; } - setNormalizedFrequencyFactor(tFrequencyFactorIndex); - sFrequencyInfo.FrequencyNormalized = aValue; + setNormalizedFrequencyFactorFromRangeIndex(tFrequencyRangeIndex); + sFrequencyInfo.FrequencyNormalizedTo_1_to_1000 = aFrequency; } -bool setWaveformFrequency() { - return setWaveformFrequency((sFrequencyInfo.FrequencyNormalized * sFrequencyInfo.FrequencyFactorTimes1000) / 1000); +bool setWaveformFrequencyFromNormalizedValues() { + return setWaveformFrequency( + (sFrequencyInfo.FrequencyNormalizedTo_1_to_1000 * sFrequencyInfo.FrequencyNormalizedFactorTimes1000) / 1000); } + /* * SINE: clip to minimum 8 samples per period => 128 us / 7812.5 Hz * SAWTOOTH: clip to minimum 16 samples per period => 256 us / 3906.25 Hz diff --git a/Waveforms.h b/Waveforms.h index 38761a8..d16361f 100644 --- a/Waveforms.h +++ b/Waveforms.h @@ -1,26 +1,38 @@ /* * Waveforms.h * - * Copyright (C) 2017 Armin Joachimsmeyer + * Copyright (C) 2017-2023 Armin Joachimsmeyer * Email: armin.joachimsmeyer@gmail.com - * License: GPL v3 (http://www.gnu.org/licenses/gpl.html) * + * This file is part of Arduino-Simple-DSO https://github.com/ArminJo/Arduino-Simple-DSO. + * + * Arduino-Simple-DSO is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ #ifndef _WAVEFORMS_H #define _WAVEFORMS_H -#define WAVEFORM_SQUARE 0 -#define WAVEFORM_SINE 1 -#define WAVEFORM_TRIANGLE 2 -#define WAVEFORM_SAWTOOTH 3 -#define WAVEFORM_MAX WAVEFORM_MODE_SAWTOOTH -#define WAVEFORM_MASK 0x03 +#define WAVEFORM_SQUARE 0 +#define WAVEFORM_SINE 1 +#define WAVEFORM_TRIANGLE 2 +#define WAVEFORM_SAWTOOTH 3 +#define WAVEFORM_MASK 0x03 -#define FREQUENCY_FACTOR_INDEX_MILLI_HERTZ 0 -#define FREQUENCY_FACTOR_INDEX_HERTZ 1 -#define FREQUENCY_FACTOR_INDEX_KILO_HERTZ 2 -#define FREQUENCY_FACTOR_INDEX_MEGA_HERTZ 3 +#define FREQUENCY_RANGE_INDEX_MILLI_HERTZ 0 +#define FREQUENCY_RANGE_INDEX_HERTZ 1 +#define FREQUENCY_RANGE_INDEX_KILO_HERTZ 2 +#define FREQUENCY_RANGE_INDEX_MEGA_HERTZ 3 struct FrequencyInfoStruct { union { @@ -35,10 +47,11 @@ struct FrequencyInfoStruct { /* * Normalized frequency variables for display + * The effective frequency is FrequencyNormalizedTo_1_to_1000 * (FrequencyNormalizedFactorTimes1000 / 1000) */ - float FrequencyNormalized; // values from 1 to 1000 for display and slider - effective frequency is sFrequencyNormalized * (sFrequencyFactorTimes1000 / 1000) - uint32_t FrequencyFactorTimes1000; // factor for mHz/Hz/kHz/MHz - times 1000 because of mHz handling - 1 -> 1 mHz, 1000 -> 1 Hz, 1000000 -> 1 kHz - uint8_t FrequencyFactorIndex; // index for FrequencyFactorChars[]. 0->mHz, 1->Hz, 2->kHz, 3->MHz + float FrequencyNormalizedTo_1_to_1000; // Frequency values from 1 to 1000 for slider + uint32_t FrequencyNormalizedFactorTimes1000; // factor for mHz/Hz/kHz/MHz - times 1000 because of mHz handling - 1 -> 1 mHz, 1000 -> 1 Hz, 1000000 -> 1 kHz + uint8_t FrequencyRangeIndex; // index for FrequencyRangeChars[]. 0->mHz, 1->Hz, 2->kHz, 3->MHz /* * Internal (private) values @@ -49,19 +62,19 @@ struct FrequencyInfoStruct { }; extern struct FrequencyInfoStruct sFrequencyInfo; -extern const char FrequencyFactorChars[4]; // see FrequencyFactorIndex above +extern const char FrequencyRangeChars[4]; // see FrequencyRangeIndex above void setWaveformMode(uint8_t aNewMode); void cycleWaveformMode(); -const char * cycleWaveformModePGMString(); -const char * getWaveformModePGMString(); +const __FlashStringHelper* cycleWaveformModePGMString(); +const __FlashStringHelper* getWaveformModePGMString(); float getPeriodMicros(); -void setNormalizedFrequencyAndFactor(float aValue); -void setNormalizedFrequencyFactor(int aIndexValue); +void setNormalizedFrequencyAndFactor(float aFrequency); +void setNormalizedFrequencyFactorFromRangeIndex(uint8_t aFrequencyRangeIndex); void initTimer1For8BitPWM(); -bool setWaveformFrequency(); +bool setWaveformFrequencyFromNormalizedValues(); bool setWaveformFrequency(float aFrequency); bool setSquareWaveFrequency(float aFrequency);