Merge pull request #736 from Smoothieware/development/test-framework
[clinton/Smoothieware.git] / src / libs / ConfigSources / FirmConfigSource.cpp
1 /*
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/>.
6 */
7
8 #include "libs/Kernel.h"
9 #include "ConfigValue.h"
10 #include "FirmConfigSource.h"
11 #include "ConfigCache.h"
12 #include <malloc.h>
13 #include "utils.h"
14
15 using namespace std;
16 #include <string>
17
18 // we use objdump in the Makefile to import your config.default file into the compiled code
19 // Since the two symbols below are derived from the filename, we need to change them if the filename changes
20 extern char _binary_config_default_start;
21 extern char _binary_config_default_end;
22
23 FirmConfigSource::FirmConfigSource(const char* name){
24 this->name_checksum = get_checksum(name);
25 this->start= &_binary_config_default_start;
26 this->end= &_binary_config_default_end;
27 }
28
29 FirmConfigSource::FirmConfigSource(const char* name, const char *start, const char *end){
30 this->name_checksum = get_checksum(name);
31 this->start= start;
32 this->end= end;
33 }
34
35 // Transfer all values found in the file to the passed cache
36 void FirmConfigSource::transfer_values_to_cache( ConfigCache* cache ){
37
38 const char* p = this->start;
39 // For each line
40 while( p < this->end ){
41 // find eol
42 const char *eol= p;
43 while(eol < this->end) {
44 if(*eol++ == '\n') break;
45 }
46 string line(p, eol-p);
47 //printf("firm: processing %s\n", line.c_str());
48 p= eol;
49 process_line_from_ascii_config(line, cache);
50 }
51 }
52
53 // Return true if the check_sums match
54 bool FirmConfigSource::is_named( uint16_t check_sum ){
55 return check_sum == this->name_checksum;
56 }
57
58 // Write a config setting to the file *** FirmConfigSource is read only ***
59 bool FirmConfigSource::write( string setting, string value ){
60 //THEKERNEL->streams->printf("ERROR: FirmConfigSource is read only\r\n");
61 return false;
62 }
63
64 // Return the value for a specific checksum
65 string FirmConfigSource::read( uint16_t check_sums[3] ){
66
67 string value = "";
68
69 const char* p = this->start;
70 // For each line
71 while( p < this->end ){
72 // find eol
73 const char *eol= p;
74 while(eol < this->end) {
75 if(*eol++ == '\n') break;
76 }
77 string line(p, eol-p);
78 p= eol;
79 value = process_line_from_ascii_config(line, check_sums);
80 if(!value.empty()) return value;
81 }
82
83 return value;
84 }
85