Merge Network code with webserver etc
[clinton/Smoothieware.git] / src / libs / utils.cpp
index 3111e93..72a862e 100644 (file)
@@ -1,8 +1,8 @@
-/*  
+/*
       This file is part of Smoothie (http://smoothieware.org/). The motion control part is heavily based on Grbl (https://github.com/simen/grbl).
       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.
       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.
-      You should have received a copy of the GNU General Public License along with Smoothie. If not, see <http://www.gnu.org/licenses/>. 
+      You should have received a copy of the GNU General Public License along with Smoothie. If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "libs/Kernel.h"
@@ -13,34 +13,74 @@ using namespace std;
 using std::string;
 #include <cstring>
 
+volatile bool _isr_context = false;
 
-uint16_t get_checksum(string to_check){
-   // From: http://en.wikipedia.org/wiki/Fletcher%27s_checksum 
+uint16_t get_checksum(const string& to_check){
+    return get_checksum(to_check.c_str());
+}
+
+uint16_t get_checksum(const char* to_check){
+   // From: http://en.wikipedia.org/wiki/Fletcher%27s_checksum
    uint16_t sum1 = 0;
    uint16_t sum2 = 0;
-   for( unsigned int index = 0; index < to_check.length(); ++index ){
-      sum1 = (sum1 + to_check[index]) % 255;
+   const char* p= to_check;
+   char c;
+   while((c= *p++) != 0) {
+      sum1 = (sum1 + c) % 255;
       sum2 = (sum2 + sum1) % 255;
    }
    return (sum2 << 8) | sum1;
 }
 
-void get_checksums(uint16_t check_sums[],string key){
-    key = key.append(" ");
+void get_checksums(uint16_t check_sums[], const string key){
+    const string k = key+" ";
     check_sums[0] = 0x0000;
     check_sums[1] = 0x0000;
     check_sums[2] = 0x0000;
     size_t begin_key = 0;
-    unsigned int counter = 0; 
+    unsigned int counter = 0;
     while( begin_key < key.size()-1 ){
-        size_t end_key =  key.find_first_of(" .", begin_key);
-        string key_node = key.substr(begin_key, end_key - begin_key);
+        const size_t end_key =  k.find_first_of(" .", begin_key);
+        const string key_node = k.substr(begin_key, end_key - begin_key);
         check_sums[counter] = get_checksum(key_node);
         begin_key = end_key + 1;
         counter++;
     }
 }
 
+bool is_alpha(int c)
+{
+    if ((c >= 'a') && (c <= 'z')) return true;
+    if ((c >= 'A') && (c <= 'Z')) return true;
+    if ((c == '_')) return true;
+    return false;
+}
+
+bool is_digit(int c)
+{
+    if ((c >= '0') && (c <= '9')) return true;
+    return false;
+}
+
+bool is_numeric(int c)
+{
+    if (is_digit(c)) return true;
+    if ((c == '.') || (c == '-')) return true;
+    if ((c == 'e')) return true;
+    return false;
+}
+
+bool is_alphanum(int c)
+{
+    return is_alpha(c) || is_numeric(c);
+}
+
+bool is_whitespace(int c)
+{
+    if ((c == ' ') || (c == '\t')) return true;
+    return false;
+}
+
 // Convert to lowercase
 string lc(string str){
     for (unsigned int i=0; i<strlen(str.c_str()); i++)
@@ -55,7 +95,7 @@ string remove_non_number( string str ){
     size_t found=str.find_first_not_of(number_mask);
     while (found!=string::npos){
         //str[found]='*';
-        str.replace(found,1,""); 
+        str.replace(found,1,"");
         found=str.find_first_not_of(number_mask);
     }
     return str;
@@ -64,7 +104,7 @@ string remove_non_number( string str ){
 // Get the first parameter, and remove it from the original string
 string shift_parameter( string &parameters ){
     size_t beginning = parameters.find_first_of(" ");
-    if( beginning == string::npos ){ string temp = parameters; parameters = ""; return temp; } 
+    if( beginning == string::npos ){ string temp = parameters; parameters = ""; return temp; }
     string temp = parameters.substr( 0, beginning );
     parameters = parameters.substr(beginning+1, parameters.size());
     return temp;
@@ -73,12 +113,12 @@ string shift_parameter( string &parameters ){
 // Separate command from arguments
 string get_arguments( string possible_command ){
     size_t beginning = possible_command.find_first_of(" ");
-    if( beginning == string::npos ){ return ""; } 
-    return possible_command.substr( beginning+1, possible_command.size() - beginning);
+    if( beginning == string::npos ){ return ""; }
+    return possible_command.substr( beginning + 1, possible_command.size() - beginning + 1);
 }
 
 // Returns true if the file exists
-bool file_exists( string file_name ){
+bool file_exists( const string file_name ){
     bool exists = false;
     FILE *lp = fopen(file_name.c_str(), "r");
     if(lp){ exists = true; }
@@ -86,13 +126,17 @@ bool file_exists( string file_name ){
     return exists;
 }
 
-// Prepares and executes a watchdog reset
-void system_reset( void ){
-    LPC_WDT->WDCLKSEL = 0x1;                // Set CLK src to PCLK
-    uint32_t clk = SystemCoreClock / 16;    // WD has a fixed /4 prescaler, PCLK default is /4
-    LPC_WDT->WDTC = 1 * (float)clk;         // Reset in 1 second
-    LPC_WDT->WDMOD = 0x3;                   // Enabled and Reset
-    LPC_WDT->WDFEED = 0xAA;                 // Kick the dog!
-    LPC_WDT->WDFEED = 0x55;
+// Prepares and executes a watchdog reset for dfu or reboot
+void system_reset( bool dfu ){
+    if(dfu) {
+        LPC_WDT->WDCLKSEL = 0x1;                // Set CLK src to PCLK
+        uint32_t clk = SystemCoreClock / 16;    // WD has a fixed /4 prescaler, PCLK default is /4
+        LPC_WDT->WDTC = 1 * (float)clk;         // Reset in 1 second
+        LPC_WDT->WDMOD = 0x3;                   // Enabled and Reset
+        LPC_WDT->WDFEED = 0xAA;                 // Kick the dog!
+        LPC_WDT->WDFEED = 0x55;
+    }else{
+        NVIC_SystemReset();
+    }
 }