smoothie port to mbed online compiler (smoothieware.org)

Dependencies:   mbed

For documentation, license, ..., please check http://smoothieware.org/

This version has been tested with a 3 axis machine

Committer:
scachat
Date:
Tue Jul 31 21:11:18 2012 +0000
Revision:
0:31e91bb0ef3c
smoothie port to mbed online compiler

Who changed what in which revision?

UserRevisionLine numberNew contents of line
scachat 0:31e91bb0ef3c 1 /*
scachat 0:31e91bb0ef3c 2 This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
scachat 0:31e91bb0ef3c 3 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.
scachat 0:31e91bb0ef3c 4 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.
scachat 0:31e91bb0ef3c 5 You should have received a copy of the GNU General Public License along with Smoothie. If not, see <http://www.gnu.org/licenses/>.
scachat 0:31e91bb0ef3c 6 */
scachat 0:31e91bb0ef3c 7
scachat 0:31e91bb0ef3c 8
scachat 0:31e91bb0ef3c 9 using namespace std;
scachat 0:31e91bb0ef3c 10 #include <vector>
scachat 0:31e91bb0ef3c 11 #include <string>
scachat 0:31e91bb0ef3c 12
scachat 0:31e91bb0ef3c 13 #include "libs/Kernel.h"
scachat 0:31e91bb0ef3c 14 #include "Config.h"
scachat 0:31e91bb0ef3c 15 #include "ConfigValue.h"
scachat 0:31e91bb0ef3c 16 #include "ConfigSource.h"
scachat 0:31e91bb0ef3c 17 #include "ConfigCache.h"
scachat 0:31e91bb0ef3c 18 #include "libs/nuts_bolts.h"
scachat 0:31e91bb0ef3c 19 #include "libs/utils.h"
scachat 0:31e91bb0ef3c 20 #include "libs/SerialMessage.h"
scachat 0:31e91bb0ef3c 21 #include "libs/ConfigSources/FileConfigSource.h"
scachat 0:31e91bb0ef3c 22
scachat 0:31e91bb0ef3c 23
scachat 0:31e91bb0ef3c 24 Config::Config(){
scachat 0:31e91bb0ef3c 25
scachat 0:31e91bb0ef3c 26 this->config_cache_loaded = false;
scachat 0:31e91bb0ef3c 27
scachat 0:31e91bb0ef3c 28 // Config source for */config files
scachat 0:31e91bb0ef3c 29 this->config_sources.push_back( new FileConfigSource("/local/config", LOCAL_CONFIGSOURCE_CHECKSUM) );
scachat 0:31e91bb0ef3c 30 //this->config_sources.push_back( new FileConfigSource("/sd/config", SD_CONFIGSOURCE_CHECKSUM ) );
scachat 0:31e91bb0ef3c 31
scachat 0:31e91bb0ef3c 32 // Pre-load the config cache
scachat 0:31e91bb0ef3c 33 this->config_cache_load();
scachat 0:31e91bb0ef3c 34
scachat 0:31e91bb0ef3c 35 }
scachat 0:31e91bb0ef3c 36
scachat 0:31e91bb0ef3c 37 void Config::on_module_loaded(){}
scachat 0:31e91bb0ef3c 38
scachat 0:31e91bb0ef3c 39 void Config::on_console_line_received( void* argument ){}
scachat 0:31e91bb0ef3c 40
scachat 0:31e91bb0ef3c 41 void Config::set_string( string setting, string value ){
scachat 0:31e91bb0ef3c 42 ConfigValue* cv = new ConfigValue;
scachat 0:31e91bb0ef3c 43 cv->found = true;
scachat 0:31e91bb0ef3c 44 cv->check_sums = get_checksums(setting);
scachat 0:31e91bb0ef3c 45 cv->value = value;
scachat 0:31e91bb0ef3c 46
scachat 0:31e91bb0ef3c 47 this->config_cache.replace_or_push_back(cv);
scachat 0:31e91bb0ef3c 48
scachat 0:31e91bb0ef3c 49 this->kernel->call_event(ON_CONFIG_RELOAD);
scachat 0:31e91bb0ef3c 50 }
scachat 0:31e91bb0ef3c 51
scachat 0:31e91bb0ef3c 52 void Config::get_module_list(vector<uint16_t>* list, uint16_t family){
scachat 0:31e91bb0ef3c 53 for( int i=1; i<this->config_cache.size(); i++){
scachat 0:31e91bb0ef3c 54 ConfigValue* value = this->config_cache.at(i);
scachat 0:31e91bb0ef3c 55 if( value->check_sums.size() == 3 && value->check_sums.at(2) == 29545 && value->check_sums.at(0) == family ){
scachat 0:31e91bb0ef3c 56 // We found a module enable for this family, add it's number
scachat 0:31e91bb0ef3c 57 list->push_back(value->check_sums.at(1));
scachat 0:31e91bb0ef3c 58 }
scachat 0:31e91bb0ef3c 59 }
scachat 0:31e91bb0ef3c 60 }
scachat 0:31e91bb0ef3c 61
scachat 0:31e91bb0ef3c 62
scachat 0:31e91bb0ef3c 63 // Command to load config cache into buffer for multiple reads during init
scachat 0:31e91bb0ef3c 64 void Config::config_cache_load(){
scachat 0:31e91bb0ef3c 65
scachat 0:31e91bb0ef3c 66 this->config_cache_clear();
scachat 0:31e91bb0ef3c 67
scachat 0:31e91bb0ef3c 68 // First element is a special empty ConfigValue for values not found
scachat 0:31e91bb0ef3c 69 ConfigValue* result = new ConfigValue;
scachat 0:31e91bb0ef3c 70 this->config_cache.push_back(result);
scachat 0:31e91bb0ef3c 71 // For each ConfigSource in our stack
scachat 0:31e91bb0ef3c 72 for( unsigned int i = 0; i < this->config_sources.size(); i++ ){
scachat 0:31e91bb0ef3c 73 ConfigSource* source = this->config_sources[i];
scachat 0:31e91bb0ef3c 74 source->transfer_values_to_cache(&this->config_cache);
scachat 0:31e91bb0ef3c 75 }
scachat 0:31e91bb0ef3c 76
scachat 0:31e91bb0ef3c 77 this->config_cache_loaded = true;
scachat 0:31e91bb0ef3c 78 }
scachat 0:31e91bb0ef3c 79
scachat 0:31e91bb0ef3c 80 // Command to clear the config cache after init
scachat 0:31e91bb0ef3c 81 void Config::config_cache_clear(){
scachat 0:31e91bb0ef3c 82 while( ! this->config_cache.empty() ){
scachat 0:31e91bb0ef3c 83 delete this->config_cache.back();
scachat 0:31e91bb0ef3c 84 this->config_cache.pop_back();
scachat 0:31e91bb0ef3c 85 }
scachat 0:31e91bb0ef3c 86 this->config_cache_loaded = false;
scachat 0:31e91bb0ef3c 87 }
scachat 0:31e91bb0ef3c 88
scachat 0:31e91bb0ef3c 89
scachat 0:31e91bb0ef3c 90 ConfigValue* Config::value(uint16_t check_sum_a, uint16_t check_sum_b, uint16_t check_sum_c ){
scachat 0:31e91bb0ef3c 91 vector<uint16_t> check_sums;
scachat 0:31e91bb0ef3c 92 check_sums.push_back(check_sum_a);
scachat 0:31e91bb0ef3c 93 check_sums.push_back(check_sum_b);
scachat 0:31e91bb0ef3c 94 check_sums.push_back(check_sum_c);
scachat 0:31e91bb0ef3c 95 return this->value(check_sums);
scachat 0:31e91bb0ef3c 96 }
scachat 0:31e91bb0ef3c 97
scachat 0:31e91bb0ef3c 98 ConfigValue* Config::value(uint16_t check_sum_a, uint16_t check_sum_b){
scachat 0:31e91bb0ef3c 99 vector<uint16_t> check_sums;
scachat 0:31e91bb0ef3c 100 check_sums.push_back(check_sum_a);
scachat 0:31e91bb0ef3c 101 check_sums.push_back(check_sum_b);
scachat 0:31e91bb0ef3c 102 return this->value(check_sums);
scachat 0:31e91bb0ef3c 103 }
scachat 0:31e91bb0ef3c 104
scachat 0:31e91bb0ef3c 105 ConfigValue* Config::value(uint16_t check_sum){
scachat 0:31e91bb0ef3c 106 vector<uint16_t> check_sums;
scachat 0:31e91bb0ef3c 107 check_sums.push_back(check_sum);
scachat 0:31e91bb0ef3c 108 return this->value(check_sums);
scachat 0:31e91bb0ef3c 109 }
scachat 0:31e91bb0ef3c 110
scachat 0:31e91bb0ef3c 111 // Get a value from the configuration as a string
scachat 0:31e91bb0ef3c 112 // 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
scachat 0:31e91bb0ef3c 113 // See get_checksum
scachat 0:31e91bb0ef3c 114 ConfigValue* Config::value(vector<uint16_t> check_sums){
scachat 0:31e91bb0ef3c 115 ConfigValue* result = this->config_cache[0];
scachat 0:31e91bb0ef3c 116 //if( this->has_config_file() == false ){
scachat 0:31e91bb0ef3c 117 // return result;
scachat 0:31e91bb0ef3c 118 //}
scachat 0:31e91bb0ef3c 119 // Check if the config is cached, and load it temporarily if it isn't
scachat 0:31e91bb0ef3c 120 bool cache_preloaded = this->config_cache_loaded;
scachat 0:31e91bb0ef3c 121 if( !cache_preloaded ){ this->config_cache_load(); }
scachat 0:31e91bb0ef3c 122
scachat 0:31e91bb0ef3c 123 for( int i=1; i<this->config_cache.size(); i++){
scachat 0:31e91bb0ef3c 124 // If this line matches the checksum
scachat 0:31e91bb0ef3c 125 bool match = true;
scachat 0:31e91bb0ef3c 126 for( unsigned int j = 0; j < check_sums.size(); j++ ){
scachat 0:31e91bb0ef3c 127 uint16_t checksum_node = check_sums[j];
scachat 0:31e91bb0ef3c 128
scachat 0:31e91bb0ef3c 129 //printf("%u(%s) against %u\r\n", get_checksum(key_node), key_node.c_str(), checksum_node);
scachat 0:31e91bb0ef3c 130 if(this->config_cache[i]->check_sums[j] != checksum_node ){
scachat 0:31e91bb0ef3c 131 match = false;
scachat 0:31e91bb0ef3c 132 break;
scachat 0:31e91bb0ef3c 133 }
scachat 0:31e91bb0ef3c 134 }
scachat 0:31e91bb0ef3c 135 if( match == false ){
scachat 0:31e91bb0ef3c 136 //printf("continue\r\n");
scachat 0:31e91bb0ef3c 137 continue;
scachat 0:31e91bb0ef3c 138 }
scachat 0:31e91bb0ef3c 139 result = this->config_cache[i];
scachat 0:31e91bb0ef3c 140 break;
scachat 0:31e91bb0ef3c 141 }
scachat 0:31e91bb0ef3c 142
scachat 0:31e91bb0ef3c 143 if( !cache_preloaded ){
scachat 0:31e91bb0ef3c 144 this->config_cache_clear();
scachat 0:31e91bb0ef3c 145 }
scachat 0:31e91bb0ef3c 146 return result;
scachat 0:31e91bb0ef3c 147 }
scachat 0:31e91bb0ef3c 148
scachat 0:31e91bb0ef3c 149
scachat 0:31e91bb0ef3c 150