Fork of Smoothie to port to mbed non-LPC targets.
Fork of Smoothie by
libs/utils.cpp@3:f151d08d335c, 2014-03-02 (annotated)
- Committer:
- Bigcheese
- Date:
- Sun Mar 02 06:33:08 2014 +0000
- Revision:
- 3:f151d08d335c
- Parent:
- 2:1df0b61d3b5a
Bunch of stuff. Need to locally merge in updated USB changes.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Michael J. Spencer |
2:1df0b61d3b5a | 1 | /* |
Michael J. Spencer |
2:1df0b61d3b5a | 2 | This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl). |
Michael J. Spencer |
2:1df0b61d3b5a | 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. |
Michael J. Spencer |
2:1df0b61d3b5a | 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. |
Michael J. Spencer |
2:1df0b61d3b5a | 5 | You should have received a copy of the GNU General Public License along with Smoothie. If not, see <http://www.gnu.org/licenses/>. |
Michael J. Spencer |
2:1df0b61d3b5a | 6 | */ |
Michael J. Spencer |
2:1df0b61d3b5a | 7 | |
Michael J. Spencer |
2:1df0b61d3b5a | 8 | #include "libs/Kernel.h" |
Michael J. Spencer |
2:1df0b61d3b5a | 9 | #include "libs/utils.h" |
Michael J. Spencer |
2:1df0b61d3b5a | 10 | #include "system_LPC17xx.h" |
Michael J. Spencer |
2:1df0b61d3b5a | 11 | using namespace std; |
Michael J. Spencer |
2:1df0b61d3b5a | 12 | #include <string> |
Michael J. Spencer |
2:1df0b61d3b5a | 13 | using std::string; |
Michael J. Spencer |
2:1df0b61d3b5a | 14 | #include <cstring> |
Michael J. Spencer |
2:1df0b61d3b5a | 15 | |
Michael J. Spencer |
2:1df0b61d3b5a | 16 | volatile bool _isr_context = false; |
Michael J. Spencer |
2:1df0b61d3b5a | 17 | |
Michael J. Spencer |
2:1df0b61d3b5a | 18 | uint16_t get_checksum(const string& to_check){ |
Michael J. Spencer |
2:1df0b61d3b5a | 19 | return get_checksum(to_check.c_str()); |
Michael J. Spencer |
2:1df0b61d3b5a | 20 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 21 | |
Michael J. Spencer |
2:1df0b61d3b5a | 22 | uint16_t get_checksum(const char* to_check){ |
Michael J. Spencer |
2:1df0b61d3b5a | 23 | // From: http://en.wikipedia.org/wiki/Fletcher%27s_checksum |
Michael J. Spencer |
2:1df0b61d3b5a | 24 | uint16_t sum1 = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 25 | uint16_t sum2 = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 26 | const char* p= to_check; |
Michael J. Spencer |
2:1df0b61d3b5a | 27 | char c; |
Michael J. Spencer |
2:1df0b61d3b5a | 28 | while((c= *p++) != 0) { |
Michael J. Spencer |
2:1df0b61d3b5a | 29 | sum1 = (sum1 + c) % 255; |
Michael J. Spencer |
2:1df0b61d3b5a | 30 | sum2 = (sum2 + sum1) % 255; |
Michael J. Spencer |
2:1df0b61d3b5a | 31 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 32 | return (sum2 << 8) | sum1; |
Michael J. Spencer |
2:1df0b61d3b5a | 33 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 34 | |
Michael J. Spencer |
2:1df0b61d3b5a | 35 | void get_checksums(uint16_t check_sums[], const string key){ |
Michael J. Spencer |
2:1df0b61d3b5a | 36 | const string k = key+" "; |
Michael J. Spencer |
2:1df0b61d3b5a | 37 | check_sums[0] = 0x0000; |
Michael J. Spencer |
2:1df0b61d3b5a | 38 | check_sums[1] = 0x0000; |
Michael J. Spencer |
2:1df0b61d3b5a | 39 | check_sums[2] = 0x0000; |
Michael J. Spencer |
2:1df0b61d3b5a | 40 | size_t begin_key = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 41 | unsigned int counter = 0; |
Michael J. Spencer |
2:1df0b61d3b5a | 42 | while( begin_key < key.size()-1 ){ |
Michael J. Spencer |
2:1df0b61d3b5a | 43 | const size_t end_key = k.find_first_of(" .", begin_key); |
Michael J. Spencer |
2:1df0b61d3b5a | 44 | const string key_node = k.substr(begin_key, end_key - begin_key); |
Michael J. Spencer |
2:1df0b61d3b5a | 45 | check_sums[counter] = get_checksum(key_node); |
Michael J. Spencer |
2:1df0b61d3b5a | 46 | begin_key = end_key + 1; |
Michael J. Spencer |
2:1df0b61d3b5a | 47 | counter++; |
Michael J. Spencer |
2:1df0b61d3b5a | 48 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 49 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 50 | |
Michael J. Spencer |
2:1df0b61d3b5a | 51 | bool is_alpha(int c) |
Michael J. Spencer |
2:1df0b61d3b5a | 52 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 53 | if ((c >= 'a') && (c <= 'z')) return true; |
Michael J. Spencer |
2:1df0b61d3b5a | 54 | if ((c >= 'A') && (c <= 'Z')) return true; |
Michael J. Spencer |
2:1df0b61d3b5a | 55 | if ((c == '_')) return true; |
Michael J. Spencer |
2:1df0b61d3b5a | 56 | return false; |
Michael J. Spencer |
2:1df0b61d3b5a | 57 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 58 | |
Michael J. Spencer |
2:1df0b61d3b5a | 59 | bool is_digit(int c) |
Michael J. Spencer |
2:1df0b61d3b5a | 60 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 61 | if ((c >= '0') && (c <= '9')) return true; |
Michael J. Spencer |
2:1df0b61d3b5a | 62 | return false; |
Michael J. Spencer |
2:1df0b61d3b5a | 63 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 64 | |
Michael J. Spencer |
2:1df0b61d3b5a | 65 | bool is_numeric(int c) |
Michael J. Spencer |
2:1df0b61d3b5a | 66 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 67 | if (is_digit(c)) return true; |
Michael J. Spencer |
2:1df0b61d3b5a | 68 | if ((c == '.') || (c == '-')) return true; |
Michael J. Spencer |
2:1df0b61d3b5a | 69 | if ((c == 'e')) return true; |
Michael J. Spencer |
2:1df0b61d3b5a | 70 | return false; |
Michael J. Spencer |
2:1df0b61d3b5a | 71 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 72 | |
Michael J. Spencer |
2:1df0b61d3b5a | 73 | bool is_alphanum(int c) |
Michael J. Spencer |
2:1df0b61d3b5a | 74 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 75 | return is_alpha(c) || is_numeric(c); |
Michael J. Spencer |
2:1df0b61d3b5a | 76 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 77 | |
Michael J. Spencer |
2:1df0b61d3b5a | 78 | bool is_whitespace(int c) |
Michael J. Spencer |
2:1df0b61d3b5a | 79 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 80 | if ((c == ' ') || (c == '\t')) return true; |
Michael J. Spencer |
2:1df0b61d3b5a | 81 | return false; |
Michael J. Spencer |
2:1df0b61d3b5a | 82 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 83 | |
Michael J. Spencer |
2:1df0b61d3b5a | 84 | // Convert to lowercase |
Michael J. Spencer |
2:1df0b61d3b5a | 85 | string lc(string str){ |
Michael J. Spencer |
2:1df0b61d3b5a | 86 | for (unsigned int i=0; i<strlen(str.c_str()); i++) |
Michael J. Spencer |
2:1df0b61d3b5a | 87 | if (str[i] >= 0x41 && str[i] <= 0x5A) |
Michael J. Spencer |
2:1df0b61d3b5a | 88 | str[i] = str[i] + 0x20; |
Michael J. Spencer |
2:1df0b61d3b5a | 89 | return str; |
Michael J. Spencer |
2:1df0b61d3b5a | 90 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 91 | |
Michael J. Spencer |
2:1df0b61d3b5a | 92 | // Remove non-number characters |
Michael J. Spencer |
2:1df0b61d3b5a | 93 | string remove_non_number( string str ){ |
Michael J. Spencer |
2:1df0b61d3b5a | 94 | string number_mask = "0123456789-.abcdefpxABCDEFPX"; |
Michael J. Spencer |
2:1df0b61d3b5a | 95 | size_t found=str.find_first_not_of(number_mask); |
Michael J. Spencer |
2:1df0b61d3b5a | 96 | while (found!=string::npos){ |
Michael J. Spencer |
2:1df0b61d3b5a | 97 | //str[found]='*'; |
Michael J. Spencer |
2:1df0b61d3b5a | 98 | str.replace(found,1,""); |
Michael J. Spencer |
2:1df0b61d3b5a | 99 | found=str.find_first_not_of(number_mask); |
Michael J. Spencer |
2:1df0b61d3b5a | 100 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 101 | return str; |
Michael J. Spencer |
2:1df0b61d3b5a | 102 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 103 | |
Michael J. Spencer |
2:1df0b61d3b5a | 104 | // Get the first parameter, and remove it from the original string |
Michael J. Spencer |
2:1df0b61d3b5a | 105 | string shift_parameter( string ¶meters ){ |
Michael J. Spencer |
2:1df0b61d3b5a | 106 | size_t beginning = parameters.find_first_of(" "); |
Michael J. Spencer |
2:1df0b61d3b5a | 107 | if( beginning == string::npos ){ string temp = parameters; parameters = ""; return temp; } |
Michael J. Spencer |
2:1df0b61d3b5a | 108 | string temp = parameters.substr( 0, beginning ); |
Michael J. Spencer |
2:1df0b61d3b5a | 109 | parameters = parameters.substr(beginning+1, parameters.size()); |
Michael J. Spencer |
2:1df0b61d3b5a | 110 | return temp; |
Michael J. Spencer |
2:1df0b61d3b5a | 111 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 112 | |
Michael J. Spencer |
2:1df0b61d3b5a | 113 | // Separate command from arguments |
Michael J. Spencer |
2:1df0b61d3b5a | 114 | string get_arguments( string possible_command ){ |
Michael J. Spencer |
2:1df0b61d3b5a | 115 | size_t beginning = possible_command.find_first_of(" "); |
Michael J. Spencer |
2:1df0b61d3b5a | 116 | if( beginning == string::npos ){ return ""; } |
Michael J. Spencer |
2:1df0b61d3b5a | 117 | return possible_command.substr( beginning + 1, possible_command.size() - beginning + 1); |
Michael J. Spencer |
2:1df0b61d3b5a | 118 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 119 | |
Michael J. Spencer |
2:1df0b61d3b5a | 120 | // Returns true if the file exists |
Michael J. Spencer |
2:1df0b61d3b5a | 121 | bool file_exists( const string file_name ){ |
Michael J. Spencer |
2:1df0b61d3b5a | 122 | bool exists = false; |
Michael J. Spencer |
2:1df0b61d3b5a | 123 | FILE *lp = fopen(file_name.c_str(), "r"); |
Michael J. Spencer |
2:1df0b61d3b5a | 124 | if(lp){ exists = true; } |
Michael J. Spencer |
2:1df0b61d3b5a | 125 | fclose(lp); |
Michael J. Spencer |
2:1df0b61d3b5a | 126 | return exists; |
Michael J. Spencer |
2:1df0b61d3b5a | 127 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 128 | |
Michael J. Spencer |
2:1df0b61d3b5a | 129 | // Prepares and executes a watchdog reset for dfu or reboot |
Michael J. Spencer |
2:1df0b61d3b5a | 130 | void system_reset( bool dfu ){ |
Michael J. Spencer |
2:1df0b61d3b5a | 131 | if(dfu) { |
Michael J. Spencer |
2:1df0b61d3b5a | 132 | LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK |
Michael J. Spencer |
2:1df0b61d3b5a | 133 | uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4 |
Michael J. Spencer |
2:1df0b61d3b5a | 134 | LPC_WDT->WDTC = 1 * (float)clk; // Reset in 1 second |
Michael J. Spencer |
2:1df0b61d3b5a | 135 | LPC_WDT->WDMOD = 0x3; // Enabled and Reset |
Michael J. Spencer |
2:1df0b61d3b5a | 136 | LPC_WDT->WDFEED = 0xAA; // Kick the dog! |
Michael J. Spencer |
2:1df0b61d3b5a | 137 | LPC_WDT->WDFEED = 0x55; |
Michael J. Spencer |
2:1df0b61d3b5a | 138 | }else{ |
Michael J. Spencer |
2:1df0b61d3b5a | 139 | NVIC_SystemReset(); |
Michael J. Spencer |
2:1df0b61d3b5a | 140 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 141 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 142 | |
Michael J. Spencer |
2:1df0b61d3b5a | 143 | // Convert a path indication ( absolute or relative ) into a path ( absolute ) |
Michael J. Spencer |
2:1df0b61d3b5a | 144 | string absolute_from_relative( string path ) |
Michael J. Spencer |
2:1df0b61d3b5a | 145 | { |
Michael J. Spencer |
2:1df0b61d3b5a | 146 | string cwd = THEKERNEL->current_path; |
Michael J. Spencer |
2:1df0b61d3b5a | 147 | |
Michael J. Spencer |
2:1df0b61d3b5a | 148 | if ( path.empty() ) { |
Michael J. Spencer |
2:1df0b61d3b5a | 149 | return THEKERNEL->current_path; |
Michael J. Spencer |
2:1df0b61d3b5a | 150 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 151 | |
Michael J. Spencer |
2:1df0b61d3b5a | 152 | if ( path[0] == '/' ) { |
Michael J. Spencer |
2:1df0b61d3b5a | 153 | return path; |
Michael J. Spencer |
2:1df0b61d3b5a | 154 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 155 | |
Michael J. Spencer |
2:1df0b61d3b5a | 156 | string match = "../" ; |
Michael J. Spencer |
2:1df0b61d3b5a | 157 | while ( path.substr(0,3) == match ) { |
Michael J. Spencer |
2:1df0b61d3b5a | 158 | path = path.substr(3); |
Michael J. Spencer |
2:1df0b61d3b5a | 159 | unsigned found = cwd.find_last_of("/"); |
Michael J. Spencer |
2:1df0b61d3b5a | 160 | cwd = cwd.substr(0,found); |
Michael J. Spencer |
2:1df0b61d3b5a | 161 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 162 | |
Michael J. Spencer |
2:1df0b61d3b5a | 163 | match = ".." ; |
Michael J. Spencer |
2:1df0b61d3b5a | 164 | if ( path.substr(0,2) == match ) { |
Michael J. Spencer |
2:1df0b61d3b5a | 165 | path = path.substr(2); |
Michael J. Spencer |
2:1df0b61d3b5a | 166 | unsigned found = cwd.find_last_of("/"); |
Michael J. Spencer |
2:1df0b61d3b5a | 167 | cwd = cwd.substr(0,found); |
Michael J. Spencer |
2:1df0b61d3b5a | 168 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 169 | |
Michael J. Spencer |
2:1df0b61d3b5a | 170 | if ( cwd[cwd.length() - 1] == '/' ) { |
Michael J. Spencer |
2:1df0b61d3b5a | 171 | return cwd + path; |
Michael J. Spencer |
2:1df0b61d3b5a | 172 | } |
Michael J. Spencer |
2:1df0b61d3b5a | 173 | |
Michael J. Spencer |
2:1df0b61d3b5a | 174 | return cwd + '/' + path; |
Michael J. Spencer |
2:1df0b61d3b5a | 175 | } |