//use only 4 char titles (should be changed soon) void generic_dual_display (char title1[ ], long high1, long cur_value1, long peak1, long warn1, char title2[ ], long high2, long cur_value2, long peak2, long warn2){ LCDSerial.print(0xFE, BYTE); LCDSerial.print(128, BYTE); LCDSerial.print(title1); LCDSerial.print(" "); LCDSerial.print(cur_value1/10); LCDSerial.print("."); LCDSerial.print(cur_value1%10); int ndigits = numberofdigits(cur_value1) + 1; if (ndigits <= 2){ ndigits = ndigits + 1;} for (int i = 0; i < 5 - ndigits; i++) { LCDSerial.print(" "); } LCDSerial.print("/"); ndigits = numberofdigits(peak1) + 1; if (ndigits <= 2){ ndigits = ndigits + 1;} for (int i = 0; i < 6 - ndigits; i++){ LCDSerial.print(" "); } LCDSerial.print(peak1/10); LCDSerial.print("."); LCDSerial.print(peak1%10); if (cur_value1 > warn1){ //blink if warning threshold is met warn_flash(); } LCDSerial.print(0xFE, BYTE); LCDSerial.print(192, BYTE); LCDSerial.print(title2); LCDSerial.print(" "); LCDSerial.print(cur_value2/10); LCDSerial.print("."); LCDSerial.print(cur_value2%10); ndigits = numberofdigits(cur_value2) + 1; if (ndigits <= 2){ ndigits = ndigits + 1;} for (int i = 0; i < 5 - ndigits; i++) { LCDSerial.print(" "); } LCDSerial.print("/"); ndigits = numberofdigits(peak2) + 1; if (ndigits <= 2){ ndigits = ndigits + 1;} for (int i = 0; i < 6 - ndigits; i++){ LCDSerial.print(" "); } LCDSerial.print(peak2/10); LCDSerial.print("."); LCDSerial.print(peak2%10); if (cur_value2 > warn2){ //blink if warning threshold is met warn_flash(); } delay(60); }
//positive only value 0 to X //only 4 char titles (should be changed soon) //1234567890123456 //TMP 134.5/ 314.5 //psi 14.5 / 14.5 //oil 1.0 / 1.4 //oil 0.3 / 0.4 void generic_bar_display(char title[ ], long high, long cur_value, long peak, long hiWarn, long loWarn, boolean hiloswitch){ int ndigits = 0; Serial.print(0xFE, BYTE); Serial.print(128, BYTE); Serial.print(title); if( (hiloswitch == true) && (cur_value == 0) ){ Serial.print("LOW "); } if ( (hiloswitch == true) && (cur_value == 9999) ){ Serial.print("HIGH "); } else { Serial.print(" "); Serial.print(cur_value/10); Serial.print("."); Serial.print(cur_value%10); ndigits = numberofdigits(cur_value) + 1; if (ndigits <= 2){ ndigits = ndigits + 1;} for (int i = 0; i < 5 - ndigits; i++) { Serial.print(" "); } } Serial.print("/"); ndigits = numberofdigits(peak) + 1; if (ndigits <= 2){ ndigits = ndigits + 1;} for (int i = 0; i < 6 - ndigits; i++){ Serial.print(" "); } Serial.print(peak/10); Serial.print("."); Serial.print(peak%10); if ( (cur_value > hiWarn) || (cur_value < loWarn) ){ //blink if warning threshold is met warn_flash(); } Serial.print(0xFE, BYTE); Serial.print(192, BYTE); unsigned long abar = high/16; unsigned long n_bars = cur_value/abar; if (cur_value <= 0){n_bars=0;} for(int i=1; i< n_bars; i++){ Serial.print(0xFF, BYTE); } for (int i=1; i < (16 - n_bars); i++){ Serial.print(" "); } delay(100); //gauge refresh rate in ms }
//positive only value 0 to X //only 4 char titles (should be changed soon) //1234567890123456 //TMP 134.5/ 314.5 //psi 14.5 / 14.5 //oil 1.0 / 1.4 //oil 0.3 / 0.4 void generic_bar_display(char title[ ], long high, long cur_value, long peak, long warn){ LCDSerial.print(0xFE, BYTE); LCDSerial.print(128, BYTE); LCDSerial.print(title); LCDSerial.print(" "); LCDSerial.print(cur_value/10); LCDSerial.print("."); LCDSerial.print(cur_value%10); int ndigits = numberofdigits(cur_value) + 1; if (ndigits <= 2){ ndigits = ndigits + 1;} for (int i = 0; i < 5 - ndigits; i++) { LCDSerial.print(" "); } LCDSerial.print("/"); ndigits = numberofdigits(peak) + 1; if (ndigits <= 2){ ndigits = ndigits + 1;} for (int i = 0; i < 6 - ndigits; i++){ LCDSerial.print(" "); } LCDSerial.print(peak/10); LCDSerial.print("."); LCDSerial.print(peak%10); if (cur_value > warn){ //blink if warning threshold is met warn_flash(); } LCDSerial.print(0xFE, BYTE); LCDSerial.print(192, BYTE); unsigned long abar = high/16; unsigned long n_bars = cur_value/abar; if (cur_value <= 0){n_bars=0;} for(int i=1; i< n_bars; i++){ LCDSerial.print(0xFF, BYTE); } for (int i=1; i < (16 - n_bars); i++){ LCDSerial.print(" "); } delay(60); }
// determine whether Amex, Visa, or Mastercard const char* cardtype(long long cardnumber) { int digits = numberofdigits(cardnumber); int check = (cardnumber / (long long int ) pow(10, digits - 1)); int check2 = (cardnumber / (long long int ) pow(10, digits - 2)); const char* valid_card = validate(cardnumber); if (strcmp(valid_card, "VALID") == 0) { // Visa verification if (check == 4 && (digits == 16 || digits == 13)) { return "VISA"; } // American Express verification else if (check == 3 && digits == 15) { if ((check2 == 37) || (check2 == 34)) { return "AMEX"; } else { return "INVALID"; } } // Mastercard verification else if (check == 5 && digits == 16) { if ((check2 == 51) || (check2 == 52) || (check2 == 53) || (check2 == 54) || (check2 == 55)) { return "MASTERCARD"; } else { return "INVALID"; } } else { return "INVALID"; } } return "INVALID"; }
// based on Luhn's checksum algorithm const char* validate(long long cardnumber) { int even_sum = 0, odd_sum = 0, total = 0; int digits = numberofdigits(cardnumber); for (int i = 0; i < digits; i++,cardnumber /= 10) { // get last digit of card number int thisdigit = cardnumber % 10; if (i % 2 == 1) { int prod_dig_sum = 0; thisdigit *= 2; prod_dig_sum += (thisdigit % 10) + (thisdigit / 10); even_sum += prod_dig_sum; } else { odd_sum += thisdigit; } } total = odd_sum + even_sum; if (total % 10 == 0) { return "VALID"; } else { return "INVALID"; } return "INVALID"; }
void usb_logger(){ while (digitalRead(buttonApin) == LOW){} Serial.print(0xFE, BYTE); Serial.print(0x01, BYTE); Serial.print(0xFE, BYTE); Serial.print(128, BYTE); Serial.print("USB Logging"); Serial.print(0xFE, BYTE); Serial.print(192, BYTE); Serial.print("Press B"); while (digitalRead(buttonBpin) == HIGH){ if (digitalRead(buttonApin)==LOW){ return; } } delay(500); Serial.print(0xFE, BYTE); Serial.print(0x01, BYTE); Serial.print("Logging"); //command flag //Serial.print(0x08, BYTE); //turn off visual display //Serial.print("Data logger: \n"); //open a new file based on a millis timestamp, give it a header and start writting //Serial.print("OPW log"); // Serial.print(logfilecount); //Serial.print(".txt"); //Serial.print(13, BYTE); //Serial.print("WRF "); //Serial.print(42); Serial.print("T1, T2, Oil Temp, Boost, x accel, y accel\n"); Serial.print(13, BYTE); while (digitalRead(buttonBpin) == LOW){} while ( (digitalRead(buttonApin) == HIGH) && (digitalRead(buttonBpin) == HIGH) ){ //logging output Serial.print("WRF "); long t1 = ( (lookup_temp(analogRead(t1pin))) ); long t2 = ( (lookup_temp(analogRead(t2pin))) ); long oil = ( lookup_oil_temp(analogRead(tempPin))); long press = lookup_boost(analogRead(boostPin)); long ax = getAccelerometerData (xval); long ay = getAccelerometerData (yval); //calc the number of characters int linelen = 5 + numberofdigits(t1) + numberofdigits(t2) + numberofdigits(oil) + numberofdigits(press) + numberofdigits(ax) + numberofdigits(ay); //print the number of characters for this line Serial.print(linelen); Serial.print(13, BYTE); Serial.print(t1); Serial.print(","); //get T2 and convert //Serial.print( lookup_temp(analogRead(t2pin)) ); Serial.print(t2); Serial.print(","); //get oil temp and convert //Serial.print( analogRead(tempPin) ); Serial.print(oil); Serial.print(","); //get boost and convert Serial.print(press); //Serial.print("###"); Serial.print(","); //get x accel Serial.print(ax); Serial.print(","); //get y accel Serial.print(ay); //Serial.print("\n"); Serial.print(13, BYTE); } while ( (digitalRead(buttonApin) == LOW) && (digitalRead(buttonBpin) == LOW) ){} //close the file //Serial.print("CLF log%"); //Serial.print(logfilecount); //Serial.print(".txt"); //Serial.print(13, BYTE); //logfilecount++; //Serial.print(0xFE, BYTE); //command flag //Serial.print(0x0C, BYTE); //turn on visual display return; }
//use only 4 char titles (should be changed soon) void generic_dual_display (char title1[ ], long high1, long cur_value1, long peak1, long hiWarn1, long loWarn1, boolean hilo1, char title2[ ], long high2, long cur_value2, long peak2, long hiWarn2, long loWarn2, boolean hilo2){ int ndigits = 0; Serial.print(0xFE, BYTE); Serial.print(128, BYTE); Serial.print(title1); Serial.print(" "); if ( (hilo1 == true) && (cur_value1 == 0) ){ Serial.print("LOW "); } else if ( (hilo1 == true) && (cur_value1 == 9999) ){ Serial.print("HIGH "); } else { Serial.print(cur_value1/10); Serial.print("."); Serial.print(cur_value1%10); ndigits = numberofdigits(cur_value1) + 1; if (ndigits <= 2){ ndigits = ndigits + 1;} for (int i = 0; i < 5 - ndigits; i++) { Serial.print(" "); } } Serial.print("/"); ndigits = numberofdigits(peak1) + 1; if (ndigits <= 2){ ndigits = ndigits + 1;} for (int i = 0; i < 6 - ndigits; i++){ Serial.print(" "); } Serial.print(peak1/10); Serial.print("."); Serial.print(peak1%10); if ( (cur_value1 > hiWarn1) || (cur_value1 < loWarn1) ){ //blink if warning threshold is met warn_flash(); } Serial.print(0xFE, BYTE); //select the second line Serial.print(192, BYTE); Serial.print(title2); Serial.print(" "); if ( (hilo2 == true) && (cur_value2 == 0) ){ Serial.print("LOW "); } else if ( (hilo2 == true) && (cur_value2 == 9999) ){ Serial.print("HIGH "); } else { Serial.print(cur_value2/10); Serial.print("."); Serial.print(cur_value2%10); ndigits = numberofdigits(cur_value2) + 1; if (ndigits <= 2){ ndigits = ndigits + 1;} for (int i = 0; i < 5 - ndigits; i++) { Serial.print(" "); } } Serial.print("/"); ndigits = numberofdigits(peak2) + 1; if (ndigits <= 2){ ndigits = ndigits + 1;} for (int i = 0; i < 6 - ndigits; i++){ Serial.print(" "); } Serial.print(peak2/10); Serial.print("."); Serial.print(peak2%10); if ( (cur_value2 > hiWarn2) || (cur_value2 < loWarn2) ){ //blink if warning threshold is met warn_flash(); } delay(100); }