| 
							- // Copyright 2015 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.
 - //
 - // -----------------------------------------------------------------------------
 - //
 - // Settings storage.
 - 
 - #include "marbles/settings.h"
 - 
 - #include <algorithm>
 - 
 - #include "stmlib/system/storage.h"
 - 
 - namespace marbles {
 - 
 - using namespace std;
 - 
 - const Scale preset_scales[6] = {
 -   // C major
 -   {
 -     1.0f,
 -     12,
 -     {
 -       { 0.0000f, 255 },  // C
 -       { 0.0833f, 16 },   // C#
 -       { 0.1667f, 96 },   // D
 -       { 0.2500f, 24 },   // D#
 -       { 0.3333f, 128 },  // E
 -       { 0.4167f, 64 },   // F
 -       { 0.5000f, 8 },    // F#
 -       { 0.5833f, 192 },  // G
 -       { 0.6667f, 16 },   // G#
 -       { 0.7500f, 96 },   // A
 -       { 0.8333f, 24 },   // A#
 -       { 0.9167f, 128 },  // B
 -     }
 -   },
 -   
 -   // C minor
 -   {
 -     1.0f,
 -     12,
 -     {
 -       { 0.0000f, 255 },  // C
 -       { 0.0833f, 16 },   // C#
 -       { 0.1667f, 96 },   // D
 -       { 0.2500f, 128 },  // Eb
 -       { 0.3333f, 8 },    // E
 -       { 0.4167f, 64 },   // F
 -       { 0.5000f, 4 },    // F#
 -       { 0.5833f, 192 },  // G
 -       { 0.6667f, 96 },   // G#
 -       { 0.7500f, 16 },   // A
 -       { 0.8333f, 128 },  // Bb
 -       { 0.9167f, 16 },   // B
 -     }
 -   },
 -   
 -   // Pentatonic
 -   {
 -     1.0f,
 -     12,
 -     {
 -       { 0.0000f, 255 },  // C
 -       { 0.0833f, 4 },    // C#
 -       { 0.1667f, 96 },   // D
 -       { 0.2500f, 4 },    // Eb
 -       { 0.3333f, 4 },    // E
 -       { 0.4167f, 140 },  // F
 -       { 0.5000f, 4 },    // F#
 -       { 0.5833f, 192 },  // G
 -       { 0.6667f, 4 },    // G#
 -       { 0.7500f, 96 },   // A
 -       { 0.8333f, 4 },    // Bb
 -       { 0.9167f, 4 },    // B
 -     }
 -   },
 -   
 -   // Pelog
 -   {
 -     1.0f,
 -     7,
 -     {
 -       { 0.0000f, 255 },  // C
 -       { 0.1275f, 128 },  // Db+
 -       { 0.2625f, 32 },  // Eb-
 -       { 0.4600f, 8 },    // F#-
 -       { 0.5883f, 192 },  // G
 -       { 0.7067f, 64 },  // Ab
 -       { 0.8817f, 16 },    // Bb+
 -     }
 -   },
 -   
 -   // Raag Bhairav That
 -   {
 -     1.0f,
 -     12,
 -     {
 -       { 0.0000f, 255 }, // ** Sa
 -       { 0.0752f, 128 }, // ** Komal Re
 -       { 0.1699f, 4 },   //    Re
 -       { 0.2630f, 4 },   //    Komal Ga
 -       { 0.3219f, 128 }, // ** Ga
 -       { 0.4150f, 64 },  // ** Ma
 -       { 0.4918f, 4 },   //    Tivre Ma
 -       { 0.5850f, 192 }, // ** Pa
 -       { 0.6601f, 64 },  // ** Komal Dha
 -       { 0.7549f, 4 },   //    Dha
 -       { 0.8479f, 4 },   //    Komal Ni
 -       { 0.9069f, 64 },  // ** Ni
 -     }
 -   },
 -   
 -   // Raag Shri
 -   {
 -     1.0f,
 -     12,
 -     {
 -       { 0.0000f, 255 }, // ** Sa
 -       { 0.0752f, 4 },   //    Komal Re
 -       { 0.1699f, 128 }, // ** Re
 -       { 0.2630f, 64 },  // ** Komal Ga
 -       { 0.3219f, 4 },   //    Ga
 -       { 0.4150f, 128 }, // ** Ma
 -       { 0.4918f, 4 },   //    Tivre Ma
 -       { 0.5850f, 192 }, // ** Pa
 -       { 0.6601f, 4 },   //    Komal Dha
 -       { 0.7549f, 64 },  // ** Dha
 -       { 0.8479f, 128 }, // ** Komal Ni
 -       { 0.9069f, 4 },   //    Ni
 -     }
 -   },
 - };
 - 
 - #define FIX_OUTLIER(destination, expected_value) if (fabsf(destination / expected_value - 1.0f) > 0.1f) { destination = expected_value; }
 - 
 - void Settings::ResetScale(int i) {
 -   persistent_data_.scale[i] = preset_scales[i];
 - }
 - 
 - 
 - void Settings::Init() {
 -   freshly_baked_ = false;
 -   
 -   // Set default values for all calibration and state settings.
 -   // This settings will be written to flash memory the first time the module
 -   // is powered on, or if corrupted data is found in the flash sector,
 -   // following a major firmware upgrade.
 -   CalibrationData& c = persistent_data_.calibration_data;
 -   fill(&c.adc_scale[0], &c.adc_scale[ADC_CHANNEL_LAST], -2.0f);
 -   fill(&c.adc_offset[0], &c.adc_offset[ADC_CHANNEL_LAST], +1.0f);
 -   fill(&c.dac_scale[0], &c.dac_scale[DAC_CHANNEL_LAST], -6212.8f);
 -   fill(&c.dac_offset[0], &c.dac_offset[DAC_CHANNEL_LAST], 32768.0f);
 -   c.adc_offset[ADC_CHANNEL_T_RATE] = 60.0f;
 -   c.adc_scale[ADC_CHANNEL_T_RATE] = -120.0f;
 -   
 -   for (size_t i = 0; i < kNumScales; ++i) {
 -     ResetScale(i);
 -   }
 - 
 -   state_.t_deja_vu = 0;
 -   state_.t_model = 0;
 -   state_.t_range = 1;
 -   state_.t_pulse_width_mean = 128;
 -   state_.t_pulse_width_std = 0;
 - 
 -   state_.x_deja_vu = 0;
 -   state_.x_control_mode = 0;
 -   state_.x_register_mode = 0;
 -   state_.x_range = 2;
 -   state_.x_scale = 0;
 -   
 -   state_.y_spread = 128;
 -   state_.y_bias = 128;
 -   state_.y_steps = 0;
 -   state_.y_divider = 128;
 -   state_.y_range = 2;
 -   
 -   state_.color_blind = 0;
 -   
 -   freshly_baked_ = !chunk_storage_.Init(&persistent_data_, &state_);
 -   
 -   if (!freshly_baked_) {
 -     CONSTRAIN(state_.t_model, 0, 5);
 -     CONSTRAIN(state_.t_range, 0, 2);
 -     CONSTRAIN(state_.x_control_mode, 0, 2);
 -     CONSTRAIN(state_.x_range, 0, 2);
 -     CONSTRAIN(state_.x_scale, 0, 5);
 -     CONSTRAIN(state_.y_range, 0, 2);
 -     
 -     CalibrationData& c = persistent_data_.calibration_data;
 -     for (size_t i = 0; i < ADC_CHANNEL_LAST; ++i) {
 -       if (i == ADC_CHANNEL_T_RATE) {
 -         FIX_OUTLIER(c.adc_scale[i], -120.0f);
 -         FIX_OUTLIER(c.adc_offset[i], 60.0f);
 -       } else {
 -         FIX_OUTLIER(c.adc_scale[i], -2.0f);
 -         FIX_OUTLIER(c.adc_offset[i], +1.0f);
 -       }
 -     }
 -     for (size_t i = 0; i < DAC_CHANNEL_LAST; ++i) {
 -       FIX_OUTLIER(c.dac_scale[i], -6212.8f);
 -       FIX_OUTLIER(c.dac_offset[i], 32768.0f);
 -     }
 -   }
 - }
 - 
 - void Settings::SavePersistentData() {
 -   chunk_storage_.SavePersistentData();
 - }
 - 
 - void Settings::SaveState() {
 -   chunk_storage_.SaveState();
 - }
 - 
 - /* static */
 - void Settings::ProgramOptionBytes() {
 -   FLASH_Unlock();
 -   FLASH_OB_Unlock();
 -   FLASH_OB_BORConfig(OB_BOR_OFF);
 -   FLASH_OB_Launch();
 -   FLASH_OB_Lock();
 - }
 - 
 - }  // namespace marbles
 
 
  |