Commit | Line | Data |
---|---|---|
df27a6a3 | 1 | /* |
c295905f AW |
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. | |
df27a6a3 | 5 | You should have received a copy of the GNU General Public License along with Smoothie. If not, see <http://www.gnu.org/licenses/>. |
c295905f AW |
6 | */ |
7 | ||
8 | #ifndef CONFIGSOURCE_H | |
9 | #define CONFIGSOURCE_H | |
10 | ||
11 | using namespace std; | |
12 | #include <vector> | |
5efaa1b1 | 13 | #include <string> |
c295905f AW |
14 | #include "ConfigValue.h" |
15 | #include "ConfigCache.h" | |
16 | ||
17 | class ConfigValue; | |
18 | ||
19 | class ConfigSource { | |
20 | public: | |
21 | ConfigSource(){} | |
22 | ||
23 | // Read each value, and append it as a ConfigValue to the config_cache we were passed | |
2bec0c6b BG |
24 | virtual void transfer_values_to_cache( ConfigCache* ) = 0; |
25 | virtual bool is_named( uint16_t check_sum ) = 0; | |
26 | virtual void write( string setting, string value ) = 0; | |
27 | virtual string read( uint16_t check_sums[3] ) = 0; | |
c295905f | 28 | |
5efaa1b1 | 29 | uint16_t name_checksum; |
2b56b363 MM |
30 | protected: |
31 | virtual string process_char_from_ascii_config(int c, ConfigCache* cache) { | |
32 | static string buffer; | |
33 | if (c == '\n' || c == EOF) | |
34 | { | |
35 | // We have a new line | |
36 | if( buffer[0] == '#' ){ buffer.clear(); return ""; } // Ignore comments | |
37 | if( buffer.length() < 3 ){ buffer.clear(); return ""; } //Ignore empty lines | |
38 | size_t begin_key = buffer.find_first_not_of(" "); | |
39 | size_t begin_value = buffer.find_first_not_of(" ", buffer.find_first_of(" ", begin_key)); | |
40 | ||
41 | uint16_t check_sums[3]; | |
42 | get_checksums(check_sums, buffer.substr(begin_key, buffer.find_first_of(" ", begin_key) - begin_key).append(" ")); | |
43 | ||
44 | ConfigValue* result = new ConfigValue; | |
45 | ||
46 | result->found = true; | |
47 | result->check_sums[0] = check_sums[0]; | |
48 | result->check_sums[1] = check_sums[1]; | |
49 | result->check_sums[2] = check_sums[2]; | |
50 | ||
51 | result->value = buffer.substr(begin_value, buffer.find_first_of("\r\n# ", begin_value+1)-begin_value); | |
52 | // Append the newly found value to the cache we were passed | |
53 | cache->replace_or_push_back(result); | |
54 | ||
55 | buffer.clear(); | |
56 | ||
57 | return result->value; | |
58 | } | |
59 | else | |
60 | buffer += c; | |
61 | ||
62 | return ""; | |
63 | }; | |
64 | virtual string process_char_from_ascii_config(int c, uint16_t line_checksums[3]) { | |
65 | static string buffer; | |
66 | string value; | |
67 | if (c == '\n' || c == EOF) | |
68 | { | |
69 | // We have a new line | |
70 | if( buffer[0] == '#' ){ buffer.clear(); return ""; } // Ignore comments | |
71 | if( buffer.length() < 3 ){ buffer.clear(); return ""; } //Ignore empty lines | |
72 | size_t begin_key = buffer.find_first_not_of(" "); | |
73 | size_t begin_value = buffer.find_first_not_of(" ", buffer.find_first_of(" ", begin_key)); | |
74 | ||
75 | uint16_t check_sums[3]; | |
76 | get_checksums(check_sums, buffer.substr(begin_key, buffer.find_first_of(" ", begin_key) - begin_key).append(" ")); | |
77 | ||
78 | if(check_sums[0] == line_checksums[0] && check_sums[1] == line_checksums[1] && check_sums[2] == line_checksums[2] ){ | |
79 | value = buffer.substr(begin_value, buffer.find_first_of("\r\n# ", begin_value+1)-begin_value); | |
80 | buffer.clear(); | |
81 | return value; | |
82 | } | |
83 | ||
84 | buffer.clear(); | |
85 | } | |
86 | else | |
87 | buffer += c; | |
88 | return value; | |
89 | }; | |
c295905f AW |
90 | }; |
91 | ||
92 | ||
93 | ||
94 | #endif |