![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
smoothie port to mbed online compiler (smoothieware.org)
For documentation, license, ..., please check http://smoothieware.org/
This version has been tested with a 3 axis machine
Diff: libs/Config.cpp
- Revision:
- 0:31e91bb0ef3c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libs/Config.cpp Tue Jul 31 21:11:18 2012 +0000 @@ -0,0 +1,150 @@ +/* + This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl). + Smoothie 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. + Smoothie 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 Smoothie. If not, see <http://www.gnu.org/licenses/>. +*/ + + +using namespace std; +#include <vector> +#include <string> + +#include "libs/Kernel.h" +#include "Config.h" +#include "ConfigValue.h" +#include "ConfigSource.h" +#include "ConfigCache.h" +#include "libs/nuts_bolts.h" +#include "libs/utils.h" +#include "libs/SerialMessage.h" +#include "libs/ConfigSources/FileConfigSource.h" + + +Config::Config(){ + + this->config_cache_loaded = false; + + // Config source for */config files + this->config_sources.push_back( new FileConfigSource("/local/config", LOCAL_CONFIGSOURCE_CHECKSUM) ); + //this->config_sources.push_back( new FileConfigSource("/sd/config", SD_CONFIGSOURCE_CHECKSUM ) ); + + // Pre-load the config cache + this->config_cache_load(); + +} + +void Config::on_module_loaded(){} + +void Config::on_console_line_received( void* argument ){} + +void Config::set_string( string setting, string value ){ + ConfigValue* cv = new ConfigValue; + cv->found = true; + cv->check_sums = get_checksums(setting); + cv->value = value; + + this->config_cache.replace_or_push_back(cv); + + this->kernel->call_event(ON_CONFIG_RELOAD); +} + +void Config::get_module_list(vector<uint16_t>* list, uint16_t family){ + for( int i=1; i<this->config_cache.size(); i++){ + ConfigValue* value = this->config_cache.at(i); + if( value->check_sums.size() == 3 && value->check_sums.at(2) == 29545 && value->check_sums.at(0) == family ){ + // We found a module enable for this family, add it's number + list->push_back(value->check_sums.at(1)); + } + } +} + + +// Command to load config cache into buffer for multiple reads during init +void Config::config_cache_load(){ + + this->config_cache_clear(); + + // First element is a special empty ConfigValue for values not found + ConfigValue* result = new ConfigValue; + this->config_cache.push_back(result); + // For each ConfigSource in our stack + for( unsigned int i = 0; i < this->config_sources.size(); i++ ){ + ConfigSource* source = this->config_sources[i]; + source->transfer_values_to_cache(&this->config_cache); + } + + this->config_cache_loaded = true; +} + +// Command to clear the config cache after init +void Config::config_cache_clear(){ + while( ! this->config_cache.empty() ){ + delete this->config_cache.back(); + this->config_cache.pop_back(); + } + this->config_cache_loaded = false; +} + + +ConfigValue* Config::value(uint16_t check_sum_a, uint16_t check_sum_b, uint16_t check_sum_c ){ + vector<uint16_t> check_sums; + check_sums.push_back(check_sum_a); + check_sums.push_back(check_sum_b); + check_sums.push_back(check_sum_c); + return this->value(check_sums); +} + +ConfigValue* Config::value(uint16_t check_sum_a, uint16_t check_sum_b){ + vector<uint16_t> check_sums; + check_sums.push_back(check_sum_a); + check_sums.push_back(check_sum_b); + return this->value(check_sums); +} + +ConfigValue* Config::value(uint16_t check_sum){ + vector<uint16_t> check_sums; + check_sums.push_back(check_sum); + return this->value(check_sums); +} + +// Get a value from the configuration as a string +// Because we don't like to waste space in Flash with lengthy config parameter names, we take a checksum instead so that the name does not have to be stored +// See get_checksum +ConfigValue* Config::value(vector<uint16_t> check_sums){ + ConfigValue* result = this->config_cache[0]; + //if( this->has_config_file() == false ){ + // return result; + //} + // Check if the config is cached, and load it temporarily if it isn't + bool cache_preloaded = this->config_cache_loaded; + if( !cache_preloaded ){ this->config_cache_load(); } + + for( int i=1; i<this->config_cache.size(); i++){ + // If this line matches the checksum + bool match = true; + for( unsigned int j = 0; j < check_sums.size(); j++ ){ + uint16_t checksum_node = check_sums[j]; + + //printf("%u(%s) against %u\r\n", get_checksum(key_node), key_node.c_str(), checksum_node); + if(this->config_cache[i]->check_sums[j] != checksum_node ){ + match = false; + break; + } + } + if( match == false ){ + //printf("continue\r\n"); + continue; + } + result = this->config_cache[i]; + break; + } + + if( !cache_preloaded ){ + this->config_cache_clear(); + } + return result; +} + + +