Fork of Smoothie to port to mbed non-LPC targets.

Dependencies:   mbed

Fork of Smoothie by Stéphane Cachat

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?

UserRevisionLine numberNew 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 &parameters ){
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 }