| 
							- // Copyright 2013 Olivier Gillet.
 - //
 - // Author: Olivier Gillet (ol.gillet@gmail.com)
 - //
 - // Permission is hereby granted, free of charge, to any person obtaining a copy
 - // of this software and associated documentation files (the "Software"), to deal
 - // in the Software without restriction, including without limitation the rights
 - // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 - // copies of the Software, and to permit persons to whom the Software is
 - // furnished to do so, subject to the following conditions:
 - // 
 - // The above copyright notice and this permission notice shall be included in
 - // all copies or substantial portions of the Software.
 - // 
 - // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 - // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 - // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 - // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 - // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 - // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 - // THE SOFTWARE.
 - // 
 - // See http://creativecommons.org/licenses/MIT/ for more information.
 - //
 - // -----------------------------------------------------------------------------
 - //
 - // User interface.
 - 
 - #ifndef YARNS_UI_H_
 - #define YARNS_UI_H_
 - 
 - #include "stmlib/stmlib.h"
 - 
 - #include "stmlib/ui/event_queue.h"
 - 
 - #include "yarns/drivers/channel_leds.h"
 - #include "yarns/drivers/display.h"
 - #include "yarns/drivers/encoder.h"
 - #include "yarns/drivers/switches.h"
 - 
 - #include "yarns/settings.h"
 - #include "yarns/storage_manager.h"
 - 
 - namespace yarns {
 -   
 - const uint8_t kNumPrograms = 8;
 - 
 - enum UiMode {
 -   UI_MODE_PARAMETER_SELECT,
 -   UI_MODE_PARAMETER_EDIT,
 -   UI_MODE_MAIN_MENU,
 -   UI_MODE_LOAD_SELECT_PROGRAM,
 -   UI_MODE_SAVE_SELECT_PROGRAM,
 -   UI_MODE_CALIBRATION_SELECT_VOICE,
 -   UI_MODE_CALIBRATION_SELECT_NOTE,
 -   UI_MODE_CALIBRATION_ADJUST_LEVEL,
 -   UI_MODE_SELECT_RECORDING_PART,
 -   UI_MODE_RECORDING,
 -   UI_MODE_OVERDUBBING,
 -   UI_MODE_PUSH_IT_SELECT_NOTE,
 -   UI_MODE_LEARNING,
 -   UI_MODE_FACTORY_TESTING,
 -   UI_MODE_SPLASH,
 -   UI_MODE_LAST
 - };
 - 
 - enum MainMenuEntry {
 -   MAIN_MENU_LOAD,
 -   MAIN_MENU_SAVE,
 -   MAIN_MENU_INIT,
 -   MAIN_MENU_LEARN,
 -   MAIN_MENU_DUMP,
 -   MAIN_MENU_CALIBRATE,
 -   MAIN_MENU_EXIT,
 -   MAIN_MENU_LAST
 - };
 - 
 - enum UiSwitch {
 -   UI_SWITCH_REC,
 -   UI_SWITCH_START_STOP,
 -   UI_SWITCH_TIE = UI_SWITCH_START_STOP,
 -   UI_SWITCH_TAP_TEMPO,
 -   UI_SWITCH_REST = UI_SWITCH_TAP_TEMPO,
 - };
 - 
 - enum UiFactoryTestingDisplay {
 -   UI_FACTORY_TESTING_DISPLAY_EMPTY,
 -   UI_FACTORY_TESTING_DISPLAY_NUMBER,
 -   UI_FACTORY_TESTING_DISPLAY_CLICK,
 -   UI_FACTORY_TESTING_DISPLAY_SW_1,
 -   UI_FACTORY_TESTING_DISPLAY_SW_2,
 -   UI_FACTORY_TESTING_DISPLAY_SW_3,
 - };
 - 
 - class Ui {
 -  public:
 -   typedef void (Ui::*CommandFn)();
 -   typedef void (Ui::*HandlerFn)(const stmlib::Event& event);
 -   typedef void (Ui::*PrintFn)();
 -   
 -   Ui() { }
 -   ~Ui() { }
 -   
 -   void Init();
 -   void Poll();
 -   void PollFast() {
 -     display_.RefreshFast();
 -   }
 -   void DoEvents();
 -   void FlushEvents();
 - 
 -   void Print(const char* text) {
 -     display_.Print(text, text);
 -   }
 - 
 -   void PrintDebugByte(uint8_t byte) {
 -     char buffer[3];
 -     char hexadecimal[] = ";";
 -     buffer[2] = '\0';
 -     buffer[0] = hexadecimal[byte >> 4];
 -     buffer[1] = hexadecimal[byte & 0xf];
 -     Print(buffer);
 -   }
 -   
 -   inline const Setting& setting() {
 -     return settings.setting(settings.menu()[setting_index_]);
 -   }
 -   inline bool calibrating() const {
 -     return mode_ == UI_MODE_CALIBRATION_SELECT_NOTE ||
 -         mode_ == UI_MODE_CALIBRATION_ADJUST_LEVEL;
 -   }
 -   inline bool factory_testing() const {
 -     return mode_ == UI_MODE_FACTORY_TESTING;
 -   }
 -   inline uint8_t calibration_voice() const { return calibration_voice_; }
 -   inline uint8_t calibration_note() const { return calibration_note_; }
 -   
 -   void StartFactoryTesting() {
 -     mode_ = UI_MODE_FACTORY_TESTING;
 -   }
 -   
 -  private:
 -   void RefreshDisplay();
 -   void TapTempo();
 -   inline Part* mutable_recording_part() {
 -     return multi.mutable_part(recording_part_);
 -   }
 -   inline const Part& recording_part() const {
 -     return multi.part(recording_part_);
 -   }
 -   
 -   // Generic Handler.
 -   void OnClick(const stmlib::Event& event);
 -   void OnLongClick(const stmlib::Event& e);
 -   void OnIncrement(const stmlib::Event& event);
 -   void OnSwitchPress(const stmlib::Event& event);
 -   void OnSwitchHeld(const stmlib::Event& event);
 -   
 -   // Specialized Handler.
 -   void OnClickMainMenu(const stmlib::Event& e);
 -   void OnClickLoadSave(const stmlib::Event& e);
 -   void OnClickCalibrationSelectVoice(const stmlib::Event& e);
 -   void OnClickCalibrationSelectNote(const stmlib::Event& e);
 -   void OnClickSelectRecordingPart(const stmlib::Event& e);
 -   void OnClickRecording(const stmlib::Event& e);
 -   void OnClickOverdubbing(const stmlib::Event& e);
 -   void OnClickLearning(const stmlib::Event& event);
 -   void OnClickFactoryTesting(const stmlib::Event& event);
 - 
 -   void OnIncrementParameterSelect(const stmlib::Event& e);
 -   void OnIncrementParameterEdit(const stmlib::Event& e);
 -   void OnIncrementCalibrationAdjustment(const stmlib::Event& e);
 -   void OnIncrementRecording(const stmlib::Event& e);
 -   void OnIncrementOverdubbing(const stmlib::Event& e);
 -   void OnIncrementPushItNote(const stmlib::Event& e);
 -   void OnIncrementFactoryTesting(const stmlib::Event& event);
 -   
 -   // Print functions.
 -   void PrintParameterName();
 -   void PrintParameterValue();
 -   void PrintMenuName();
 -   void PrintProgramNumber();
 -   void PrintCalibrationVoiceNumber();
 -   void PrintCalibrationNote();
 -   void PrintRecordingPart();
 -   void PrintRecordingStatus();
 -   void PrintPushItNote();
 -   void PrintLearning();
 -   void PrintFactoryTesting();
 -   void PrintVersionNumber();
 -   
 -   void DoInitCommand();
 -   void DoDumpCommand();
 -   void DoLearnCommand();
 - 
 -   struct Command {
 -     const char* name;
 -     UiMode next_mode;
 -     CommandFn function;
 -   };
 -   
 -   struct Mode {
 -     HandlerFn on_increment;
 -     HandlerFn on_click;
 -     PrintFn refresh_display;
 -     UiMode next_mode;
 -     int8_t* incremented_variable;
 -     int8_t min_value;
 -     int8_t max_value;
 -   };
 -   
 -   static const Command commands_[MAIN_MENU_LAST];
 -   static Mode modes_[UI_MODE_LAST];
 -   
 -   stmlib::EventQueue<32> queue_;
 -   
 -   ChannelLeds leds_;
 -   Display display_;
 -   Encoder encoder_;
 -   Switches switches_;
 -   char buffer_[32];
 -   
 -   bool long_press_event_sent_;
 -   uint32_t start_stop_press_time_;
 -   bool encoder_long_press_event_sent_;
 -   uint32_t encoder_press_time_;
 -   
 -   UiMode mode_;
 -   UiMode previous_mode_;
 -   
 -   int8_t setting_index_;
 -   int8_t command_index_;
 -   int8_t calibration_voice_;
 -   int8_t calibration_note_;
 -   int8_t program_index_;
 -   int8_t active_program_;
 -   int8_t recording_part_;
 -   bool push_it_;
 -   int16_t push_it_note_;
 -   
 -   UiFactoryTestingDisplay factory_testing_display_;
 -   int8_t factory_testing_number_;
 -   uint16_t factory_testing_leds_counter_;
 -   
 -   uint32_t tap_tempo_sum_;
 -   uint32_t tap_tempo_count_;
 -   uint32_t previous_tap_time_;
 -   
 -   DISALLOW_COPY_AND_ASSIGN(Ui);
 - };
 - 
 - }  // namespace yarns
 - 
 - #endif // YARNS_UI_H_
 
 
  |