2 This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
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.
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.
5 You should have received a copy of the GNU General Public License along with Smoothie. If not, see <http://www.gnu.org/licenses/>.
12 #include "libs/Kernel.h"
14 #include "ConfigValue.h"
15 #include "ConfigSource.h"
16 #include "ConfigCache.h"
17 #include "libs/nuts_bolts.h"
18 #include "libs/utils.h"
19 #include "libs/SerialMessage.h"
20 #include "libs/ConfigSources/FileConfigSource.h"
21 #include "libs/ConfigSources/FirmConfigSource.h"
22 #include "StreamOutputPool.h"
24 // Add various config sources. Config can be fetched from several places.
25 // All values are read into a cache, that is then used by modules to read their configuration
28 this->config_cache
= NULL
;
30 // Config source for firm config found in src/config.default
31 this->config_sources
.push_back( new FirmConfigSource("firm") );
33 // Config source for */config files
34 FileConfigSource
*fcs
= NULL
;
35 if( file_exists("/local/config") )
36 fcs
= new FileConfigSource("/local/config", "local");
37 else if( file_exists("/local/config.txt") )
38 fcs
= new FileConfigSource("/local/config.txt", "local");
40 this->config_sources
.push_back( fcs
);
43 if( file_exists("/sd/config") )
44 fcs
= new FileConfigSource("/sd/config", "sd");
45 else if( file_exists("/sd/config.txt") )
46 fcs
= new FileConfigSource("/sd/config.txt", "sd");
48 this->config_sources
.push_back( fcs
);
51 void Config::on_module_loaded() {}
53 void Config::on_console_line_received( void *argument
) {}
55 // Get a list of modules, used by module "pools" that look for the "enable" keyboard to find things like "moduletype.modulename.enable" as the marker of a new instance of a module
56 void Config::get_module_list(vector
<uint16_t> *list
, uint16_t family
)
58 this->config_cache
->collect(family
, CHECKSUM("enable"), list
);
61 // Command to load config cache into buffer for multiple reads during init
62 void Config::config_cache_load(bool parse
)
64 // First clear the cache
65 this->config_cache_clear();
67 this->config_cache
= new ConfigCache
;
69 // For each ConfigSource in our stack
70 for( ConfigSource
*source
: this->config_sources
) {
71 source
->transfer_values_to_cache(this->config_cache
);
76 // Command to clear the config cache after init
77 void Config::config_cache_clear()
79 delete this->config_cache
;
80 this->config_cache
= NULL
;
83 // Three ways to read a value from the config, depending on adress length
84 ConfigValue
*Config::value(uint16_t check_sum_a
, uint16_t check_sum_b
, uint16_t check_sum_c
)
86 uint16_t check_sums
[3];
87 check_sums
[0] = check_sum_a
;
88 check_sums
[1] = check_sum_b
;
89 check_sums
[2] = check_sum_c
;
90 return this->value(check_sums
);
93 static ConfigValue dummyValue
;
95 // Get a value from the configuration as a string
96 // 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
98 ConfigValue
*Config::value(uint16_t check_sums
[])
100 if( !is_config_cache_loaded() ) {
101 THEKERNEL
->streams
->printf("ERROR: calling value after config cache has been cleared\n");
102 // note this will cause whatever called it to blow up!
106 ConfigValue
*result
= this->config_cache
->lookup(check_sums
);
109 // create a dummy value for this to play with, each call requires it's own value not a shared one
110 // result= new ConfigValue(check_sums);
111 // config_cache->add(result);
113 result
= &dummyValue
;