Advertisement
sanelss

Untitled

Jun 18th, 2015
316
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.33 KB | None | 0 0
  1. #include <spi4teensy3.h>
  2. #include <Arduino.h>
  3. #include <vector>
  4.  
  5. #include "Adafruit_Thermal.h"
  6. #include "key1.h"
  7. #include "key2.h"
  8. #include "key3.h"
  9. #include "key4.h"
  10.  
  11.  
  12. #define SerialDebug true
  13.  
  14. #define latchPin 16
  15. #define keyswitch_pinA 14
  16. #define keyswitch_pinB 15
  17. #define bell_pin 5
  18. #define printerDTR_pin 6
  19. #define print_pin 19
  20. #define ESP8266_GPIO2_pin 4
  21.  
  22. #define bell_timeout 300
  23. #define bell_hightime 50
  24. #define switch_timeout 300
  25.  
  26. const uint8_t switch_pins[]{0,1,2,3};
  27. static const uint16_t numSelections=sizeof(switch_pins)/sizeof(switch_pins[0]);
  28. boolean swtich_states[numSelections];
  29. uint32_t switch_timers[numSelections];
  30. uint16_t selection_counts[numSelections];
  31. float selection_prices[numSelections];
  32. String selection_names[numSelections];
  33.  
  34. double taxRate=8.5;
  35.  
  36. boolean bell_ding=false;
  37. uint32_t bell_timer=0;
  38.  
  39. boolean keyswitch=false;
  40. boolean keyswitch_timer=0;
  41.  
  42. uint32_t serialTxTimer=0;
  43.  
  44. String inputLine="";
  45.  
  46. boolean printButton=false;
  47. uint32_t printButtonTimeout=0;
  48.  
  49. class discountClass{  
  50.   public:
  51.     static uint32_t ids;
  52.     uint32_t id;
  53.     uint16_t quantity;
  54.     float discount;
  55.     discountClass(uint16_t quant,float disc){
  56.       id=ids++;
  57.       quantity=quant;
  58.       discount=disc;
  59.     }
  60. };
  61.  
  62. uint32_t discountClass::ids=0;
  63.  
  64. std::vector<discountClass> discounts[numSelections];
  65.  
  66. Adafruit_Thermal printer(&Serial2,printerDTR_pin);
  67.  
  68. void setup() {
  69.   Serial.begin(115200);
  70.   Serial2.begin(19200);
  71.  
  72.   printer.begin();
  73.   printer.setDefault();
  74.  
  75.   pinMode(latchPin, OUTPUT);
  76.   spi4teensy3::init(0,0,0);
  77.  
  78.   for(int i=0;i<numSelections;i++){
  79.     swtich_states[i]=false;
  80.     switch_timers[i]=0;
  81.     selection_counts[i]=0;
  82.     selection_prices[i]=0;
  83.     selection_names[i]="";
  84.     pinMode(switch_pins[i], INPUT);
  85.     digitalWrite(switch_pins[i], HIGH);
  86.   }
  87.   pinMode(bell_pin, OUTPUT);
  88.   digitalWrite(bell_pin, LOW);
  89.  
  90.   pinMode(keyswitch_pinA, OUTPUT);
  91.   digitalWrite(keyswitch_pinA, LOW);
  92.   pinMode(keyswitch_pinB, INPUT);
  93.   digitalWrite(keyswitch_pinB, HIGH);
  94.  
  95.   selection_names[0]="Cylinder";
  96.   selection_prices[0]=2.75;
  97.   selection_names[1]="Double cut cylinder";
  98.   selection_prices[1]=3.25;
  99.   selection_names[2]="Mortice";
  100.   selection_prices[2]=3.95;
  101.   selection_names[3]="Car";
  102.   selection_prices[3]=4.95;
  103.  
  104.   discounts[0].push_back(discountClass(3,15));
  105.   discounts[0].push_back(discountClass(25,20));
  106.   discounts[2].push_back(discountClass(3,10));
  107.   discounts[2].push_back(discountClass(25,20));
  108.  
  109.   pinMode(18, OUTPUT);
  110.   digitalWrite(18, LOW);
  111.   pinMode(print_pin, INPUT);
  112.   digitalWrite(print_pin, HIGH);
  113. }
  114.  
  115. void loop() {
  116.   processSerial();
  117.   getSwitches();
  118.   getKeyswitch();
  119.   writeNixies();
  120.   processBell();
  121.   processPrintButton();
  122.   delay(1);
  123. }
  124.  
  125. void writeNixies(){
  126.   uint8_t tens=selection_counts[0]/10;
  127.   uint8_t ones=selection_counts[0]%10;
  128.   uint8_t num=ones<<4;
  129.   num|=tens;
  130.   writeRegister(num);  
  131. }
  132.  
  133. void processPrintButton(){
  134.  if(millis()>printButtonTimeout){
  135.    boolean pre=printButton;
  136.    boolean printButton=!digitalRead(print_pin);
  137.    if(printButton){
  138.      printButtonTimeout=millis()+1000;
  139.    }
  140.    if(printButton&&!pre){
  141.      printReceipt();
  142.    }
  143.  }
  144. }
  145.  
  146. void printReceipt(){
  147.   boolean willPrint=false;
  148.   for(int i=0;i<numSelections;i++){
  149.     if(selection_counts[i]>0){
  150.       willPrint=true;
  151.     }
  152.   }
  153.  
  154.   if(willPrint){
  155.     printer.justify('C');
  156.     printer.setSize('M');
  157.     printer.println(F("Key Cutting Docket\n"));
  158.     printer.setDefault();
  159.    
  160.     for(int i=0;i<numSelections;i++){
  161.       if(selection_counts[i]>0){
  162.         String s="";
  163.         int disc=findBestDiscount(i);
  164.         if(disc>0){
  165.           s+="(-";
  166.           s+=disc;
  167.           s+="%)";
  168.         }
  169.         s+="x";
  170.         s+=selection_counts[i];
  171.         String cost="";
  172.         cost+=calcSubTotalWithDisc(i);
  173.         if(cost.length()<5)
  174.           s+=" ";
  175.         s+=" $";
  176.         s+=cost;
  177.         printLine(selection_names[i],s);
  178.       }
  179.     }
  180.     float total=0;
  181.     for(int i=0;i<numSelections;i++){
  182.       total+=calcSubTotalWithDisc(i);
  183.     }
  184.     printLine("",F("-------"));
  185.     String t="$";
  186.     t+=total;
  187.     printLine(F("Total: "),t);
  188.     t="";
  189.     t+=total;
  190.     char tt[t.length()];
  191.     strcpy(tt,t.c_str());
  192.     printer.justify('C');
  193.     printer.printBarcode(tt, CODE128);
  194.     printer.println(F("\nPlease take this docket to the  till to pay.\n"));
  195.    
  196.     printer.boldOn();
  197.     printer.justify('C');
  198.     printer.underlineOn();
  199.     printer.setSize('M');
  200.     printer.println(F("THIS IS NOT A RECEIPT"));
  201.     printer.setDefault();
  202.     printer.feed(3);
  203.   }
  204.  
  205.   for(int i=0;i<numSelections;i++){
  206.     selection_counts[i]=0;
  207.   }
  208. }
  209.  
  210. void processSerial(){
  211.   while(Serial.available()){
  212.     char c=Serial.read();
  213.     if(c==10||c==13){
  214.       if(inputLine.startsWith("print")){
  215.         printReceipt();
  216.       }
  217.       //setTax(tax %) ie. setTax(8.5)
  218.       else if(inputLine.startsWith("setTax(")&&inputLine.endsWith(")")){
  219.         String s=inputLine.substring(sizeof("setTax(")-1);
  220.         s=s.substring(0,s.length()-1);
  221.         taxRate=atof(s.c_str());
  222.         Serial.print("Tax rate set to: ");
  223.         Serial.print(taxRate);
  224.         Serial.println("%");
  225.       }
  226.       //setPrice(selection,price) ie. setPrice(0,3.25)
  227.       else if(inputLine.startsWith("setPrice(")&&inputLine.endsWith(")")){
  228.         String s=inputLine.substring(sizeof("setPrice(")-1);
  229.         s=s.substring(0,s.length()-1);
  230.         uint16_t idx1=s.indexOf(",");
  231.         uint16_t sel=atoi(s.substring(0,idx1).c_str());
  232.         selection_prices[sel]=atof(s.substring(idx1+1).c_str());
  233.         printSelection(sel);
  234.       }
  235.       //addDiscount(selection, quantity, discount %) ie: addDiscount(0,3,15.0)
  236.       else if(inputLine.startsWith("addDiscount(")&&inputLine.endsWith(")")){
  237.         String s=inputLine.substring(sizeof("addDiscount(")-1);
  238.         s=s.substring(0,s.length()-1);
  239.         uint16_t idx1=s.indexOf(",");
  240.         uint16_t idx2=s.lastIndexOf(",");
  241.         if(idx1!=idx2){
  242.           uint16_t sel=atoi(s.substring(0,idx1).c_str());
  243.           discounts[sel].push_back(discountClass(atoi(s.substring(idx1+1,idx2).c_str()), atof(s.substring(idx2+1,s.length()).c_str())));
  244.           Serial.print("Added Discount: ");
  245.           Serial.print("Selection ");
  246.           Serial.print(sel);
  247.           Serial.print("(");
  248.           Serial.print(selection_names[sel]);
  249.           Serial.print(")");
  250.           Serial.print(": ");
  251.           Serial.print(discounts[sel][discounts[sel].size()-1].quantity);
  252.           Serial.print(" keys @ ");
  253.           Serial.print(discounts[sel][discounts[sel].size()-1].discount);
  254.           Serial.print("%");
  255.           Serial.println();
  256.         }
  257.       }
  258.       //removeDiscount(discount id); ie: removeDiscount(2);
  259.       else if(inputLine.startsWith("removeDiscount(")&&inputLine.endsWith(")")){
  260.         String s=inputLine.substring(sizeof("removeDiscount(")-1);
  261.         s=s.substring(0,s.length()-1);
  262.         uint16_t id=atoi(s.c_str());
  263.  
  264.         for(uint16_t o=0;o<numSelections;o++){
  265.           for(uint16_t i=0;i<discounts[o].size();i++){
  266.             if(discounts[o][i].id==id){
  267.               Serial.print("Removed Discount: ");
  268.               Serial.println(id);
  269.               discounts[o].erase(discounts[o].begin()+i);
  270.             }
  271.           }
  272.         }
  273.        
  274.        
  275.       }
  276.       else if(inputLine.equals("?")){
  277.           Serial.println("----------------------------------------------");
  278.           Serial.print("Tax rate: ");
  279.           Serial.print(taxRate);
  280.           Serial.println("%");
  281.           Serial.println();
  282.           Serial.println("Prices: ");
  283.           for(int i=0;i<numSelections;i++){
  284.             Serial.print("Selection ");
  285.             Serial.print(i);
  286.             Serial.print("(");
  287.             Serial.print(selection_names[i]);
  288.             Serial.print(")");
  289.             Serial.print(": $");
  290.             Serial.print(selection_prices[i]);
  291.             Serial.println();
  292.           }
  293.           Serial.println();
  294.          
  295.           Serial.println("Discounts: ");
  296.           for(uint16_t o=0;o<numSelections;o++){
  297.             for(uint16_t i=0;i<discounts[o].size();i++){
  298.               Serial.print("ID ");
  299.               Serial.print(discounts[o][i].id);
  300.               Serial.print(": Selection ");
  301.               Serial.print(o);
  302.               Serial.print("(");
  303.               Serial.print(selection_names[o]);
  304.               Serial.print(") ");
  305.               Serial.print(": ");
  306.               Serial.print(discounts[o][i].quantity);
  307.               Serial.print(" keys @ ");
  308.               Serial.print(discounts[o][i].discount);
  309.               Serial.print("%");
  310.               Serial.println();
  311.             }
  312.           }
  313.           Serial.println();
  314.          
  315.           Serial.println("Tally:");
  316.           for(int i=0;i<numSelections;i++){
  317.             printSelection(i);
  318.           }
  319.           double subtotal=0;
  320.           for(int i=0;i<numSelections;i++){
  321.             subtotal+=calcSubTotalWithDisc(i);
  322.           }
  323.           double tax=subtotal*taxRate/100.0;
  324.           Serial.print("Subtotal: $");
  325.           Serial.println(subtotal);
  326.           Serial.print("Tax(");
  327.           Serial.print(taxRate);
  328.           Serial.print("%): $");
  329.           Serial.println(tax);
  330.           Serial.print("Total: $");
  331.           Serial.println(subtotal+tax);
  332.           Serial.println();
  333.          
  334.           Serial.println("Hardware:");
  335.           Serial.print("Keyswitch: ");
  336.           Serial.println(((keyswitch)? "On":"Off"));
  337.           Serial.println("----------------------------------------------");
  338.       }
  339.       inputLine="";
  340.     }
  341.     else{
  342.       inputLine+=c;  
  343.     }
  344.   }
  345. }
  346.  
  347. double calcSubTotalWithDisc(uint16_t sel){
  348.   double subtotal=selection_counts[sel]*selection_prices[sel];
  349.   subtotal=subtotal-(subtotal*(findBestDiscount(sel)/100.0));
  350.   return subtotal;
  351. }
  352.  
  353. float findBestDiscount(uint16_t sel){
  354.   float bestDiscount=0;
  355.   for(uint16_t i=0;i<discounts[sel].size();i++){
  356.     if(selection_counts[sel]>=discounts[sel][i].quantity){
  357.       if(discounts[sel][i].discount>bestDiscount){
  358.         bestDiscount=discounts[sel][i].discount;
  359.       }
  360.     }
  361.   }
  362.   return bestDiscount;
  363. }
  364.  
  365. void printSelection(uint16_t sel){
  366.   Serial.print("Selection ");
  367.   Serial.print(sel);
  368.   Serial.print("(");
  369.   Serial.print(selection_names[sel]);
  370.   Serial.print(")");
  371.   Serial.print(": ");
  372.   Serial.print(selection_counts[sel]);
  373.   Serial.print(" @ $");
  374.   Serial.print(selection_prices[sel]);
  375.   Serial.print(" = $");
  376.   double subtotal=selection_counts[sel]*selection_prices[sel];
  377.   Serial.print(subtotal);
  378.   float bestDiscount=findBestDiscount(sel);
  379.   if(bestDiscount!=0){
  380.     Serial.print(" Discount: ");
  381.     Serial.print(bestDiscount);
  382.     Serial.print("% = $");
  383.     Serial.print(calcSubTotalWithDisc(sel));
  384.   }
  385.   Serial.println();
  386. }
  387.  
  388. void getSwitches(){
  389.   for(int i=0;i<numSelections;i++){
  390.     boolean tmp=digitalRead(switch_pins[i]);
  391.     if(!tmp){
  392.       if(millis()>switch_timers[i]){
  393.         swtich_states[i]=true;
  394.         switch_timers[i]=millis()+switch_timeout;
  395.         selection_counts[i]++;
  396.         bell_ding=true;
  397.         printSelection(i);
  398.       }
  399.     }else{
  400.       if(swtich_states[i]){
  401.         if(millis()>switch_timers[i]-switch_timeout+100){
  402.           swtich_states[i]=false;
  403.         }
  404.       }
  405.     }
  406.   }
  407. }
  408.  
  409. void getKeyswitch(){
  410.   boolean tmp=!digitalRead(keyswitch_pinB);
  411.   if(tmp!=keyswitch){
  412.     Serial.print("Keyswitch: ");
  413.     Serial.println(((tmp)? "On":"Off"));
  414.     keyswitch=tmp;
  415.   }
  416. }
  417.  
  418.  
  419. void processBell(){
  420.   if(millis()>bell_timer){
  421.     if(bell_ding){
  422.       bell_ding=false;
  423.       if(keyswitch){
  424.         digitalWrite(bell_pin,HIGH);
  425.         Serial.println("Bell Ding");
  426.       }
  427.       bell_timer=millis()+bell_timeout;
  428.     }
  429.   }
  430.   else if(millis()>(bell_timer-bell_timeout+bell_hightime)){
  431.       digitalWrite(bell_pin,LOW);
  432.   }
  433. }
  434.  
  435. void printLine(String left,String right){
  436.   String s="                                ";
  437.   for(uint16_t i=0;i<right.length();i++){
  438.     s[s.length()-1-i]=right[right.length()-1-i];  
  439.   }
  440.   for(uint16_t i=0;i<left.length();i++){
  441.     if(i<s.length()-right.length()){
  442.       s[i]=left[i];  
  443.     }
  444.     else{
  445.       s[i-1]=' ';
  446.       s[i-2]='.';
  447.       break;
  448.     }
  449.   }
  450.   printer.println(s);
  451. }
  452.  
  453. void writeRegister(byte val) {
  454.   digitalWrite(latchPin, LOW);
  455.   spi4teensy3::send(val);
  456.   digitalWrite(latchPin, HIGH);
  457. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement