Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <spi4teensy3.h>
- #include <Arduino.h>
- #include <vector>
- #include "Adafruit_Thermal.h"
- #include "key1.h"
- #include "key2.h"
- #include "key3.h"
- #include "key4.h"
- #define SerialDebug true
- #define latchPin 16
- #define keyswitch_pinA 14
- #define keyswitch_pinB 15
- #define bell_pin 5
- #define printerDTR_pin 6
- #define print_pin 19
- #define ESP8266_GPIO2_pin 4
- #define bell_timeout 300
- #define bell_hightime 50
- #define switch_timeout 300
- const uint8_t switch_pins[]{0,1,2,3};
- static const uint16_t numSelections=sizeof(switch_pins)/sizeof(switch_pins[0]);
- boolean swtich_states[numSelections];
- uint32_t switch_timers[numSelections];
- uint16_t selection_counts[numSelections];
- float selection_prices[numSelections];
- String selection_names[numSelections];
- double taxRate=8.5;
- boolean bell_ding=false;
- uint32_t bell_timer=0;
- boolean keyswitch=false;
- boolean keyswitch_timer=0;
- uint32_t serialTxTimer=0;
- String inputLine="";
- boolean printButton=false;
- uint32_t printButtonTimeout=0;
- class discountClass{
- public:
- static uint32_t ids;
- uint32_t id;
- uint16_t quantity;
- float discount;
- discountClass(uint16_t quant,float disc){
- id=ids++;
- quantity=quant;
- discount=disc;
- }
- };
- uint32_t discountClass::ids=0;
- std::vector<discountClass> discounts[numSelections];
- Adafruit_Thermal printer(&Serial2,printerDTR_pin);
- void setup() {
- Serial.begin(115200);
- Serial2.begin(19200);
- printer.begin();
- printer.setDefault();
- pinMode(latchPin, OUTPUT);
- spi4teensy3::init(0,0,0);
- for(int i=0;i<numSelections;i++){
- swtich_states[i]=false;
- switch_timers[i]=0;
- selection_counts[i]=0;
- selection_prices[i]=0;
- selection_names[i]="";
- pinMode(switch_pins[i], INPUT);
- digitalWrite(switch_pins[i], HIGH);
- }
- pinMode(bell_pin, OUTPUT);
- digitalWrite(bell_pin, LOW);
- pinMode(keyswitch_pinA, OUTPUT);
- digitalWrite(keyswitch_pinA, LOW);
- pinMode(keyswitch_pinB, INPUT);
- digitalWrite(keyswitch_pinB, HIGH);
- selection_names[0]="Cylinder";
- selection_prices[0]=2.75;
- selection_names[1]="Double cut cylinder";
- selection_prices[1]=3.25;
- selection_names[2]="Mortice";
- selection_prices[2]=3.95;
- selection_names[3]="Car";
- selection_prices[3]=4.95;
- discounts[0].push_back(discountClass(3,15));
- discounts[0].push_back(discountClass(25,20));
- discounts[2].push_back(discountClass(3,10));
- discounts[2].push_back(discountClass(25,20));
- pinMode(18, OUTPUT);
- digitalWrite(18, LOW);
- pinMode(print_pin, INPUT);
- digitalWrite(print_pin, HIGH);
- }
- void loop() {
- processSerial();
- getSwitches();
- getKeyswitch();
- writeNixies();
- processBell();
- processPrintButton();
- delay(1);
- }
- void writeNixies(){
- uint8_t tens=selection_counts[0]/10;
- uint8_t ones=selection_counts[0]%10;
- uint8_t num=ones<<4;
- num|=tens;
- writeRegister(num);
- }
- void processPrintButton(){
- if(millis()>printButtonTimeout){
- boolean pre=printButton;
- boolean printButton=!digitalRead(print_pin);
- if(printButton){
- printButtonTimeout=millis()+1000;
- }
- if(printButton&&!pre){
- printReceipt();
- }
- }
- }
- void printReceipt(){
- boolean willPrint=false;
- for(int i=0;i<numSelections;i++){
- if(selection_counts[i]>0){
- willPrint=true;
- }
- }
- if(willPrint){
- printer.justify('C');
- printer.setSize('M');
- printer.println(F("Key Cutting Docket\n"));
- printer.setDefault();
- for(int i=0;i<numSelections;i++){
- if(selection_counts[i]>0){
- String s="";
- int disc=findBestDiscount(i);
- if(disc>0){
- s+="(-";
- s+=disc;
- s+="%)";
- }
- s+="x";
- s+=selection_counts[i];
- String cost="";
- cost+=calcSubTotalWithDisc(i);
- if(cost.length()<5)
- s+=" ";
- s+=" $";
- s+=cost;
- printLine(selection_names[i],s);
- }
- }
- float total=0;
- for(int i=0;i<numSelections;i++){
- total+=calcSubTotalWithDisc(i);
- }
- printLine("",F("-------"));
- String t="$";
- t+=total;
- printLine(F("Total: "),t);
- t="";
- t+=total;
- char tt[t.length()];
- strcpy(tt,t.c_str());
- printer.justify('C');
- printer.printBarcode(tt, CODE128);
- printer.println(F("\nPlease take this docket to the till to pay.\n"));
- printer.boldOn();
- printer.justify('C');
- printer.underlineOn();
- printer.setSize('M');
- printer.println(F("THIS IS NOT A RECEIPT"));
- printer.setDefault();
- printer.feed(3);
- }
- for(int i=0;i<numSelections;i++){
- selection_counts[i]=0;
- }
- }
- void processSerial(){
- while(Serial.available()){
- char c=Serial.read();
- if(c==10||c==13){
- if(inputLine.startsWith("print")){
- printReceipt();
- }
- //setTax(tax %) ie. setTax(8.5)
- else if(inputLine.startsWith("setTax(")&&inputLine.endsWith(")")){
- String s=inputLine.substring(sizeof("setTax(")-1);
- s=s.substring(0,s.length()-1);
- taxRate=atof(s.c_str());
- Serial.print("Tax rate set to: ");
- Serial.print(taxRate);
- Serial.println("%");
- }
- //setPrice(selection,price) ie. setPrice(0,3.25)
- else if(inputLine.startsWith("setPrice(")&&inputLine.endsWith(")")){
- String s=inputLine.substring(sizeof("setPrice(")-1);
- s=s.substring(0,s.length()-1);
- uint16_t idx1=s.indexOf(",");
- uint16_t sel=atoi(s.substring(0,idx1).c_str());
- selection_prices[sel]=atof(s.substring(idx1+1).c_str());
- printSelection(sel);
- }
- //addDiscount(selection, quantity, discount %) ie: addDiscount(0,3,15.0)
- else if(inputLine.startsWith("addDiscount(")&&inputLine.endsWith(")")){
- String s=inputLine.substring(sizeof("addDiscount(")-1);
- s=s.substring(0,s.length()-1);
- uint16_t idx1=s.indexOf(",");
- uint16_t idx2=s.lastIndexOf(",");
- if(idx1!=idx2){
- uint16_t sel=atoi(s.substring(0,idx1).c_str());
- discounts[sel].push_back(discountClass(atoi(s.substring(idx1+1,idx2).c_str()), atof(s.substring(idx2+1,s.length()).c_str())));
- Serial.print("Added Discount: ");
- Serial.print("Selection ");
- Serial.print(sel);
- Serial.print("(");
- Serial.print(selection_names[sel]);
- Serial.print(")");
- Serial.print(": ");
- Serial.print(discounts[sel][discounts[sel].size()-1].quantity);
- Serial.print(" keys @ ");
- Serial.print(discounts[sel][discounts[sel].size()-1].discount);
- Serial.print("%");
- Serial.println();
- }
- }
- //removeDiscount(discount id); ie: removeDiscount(2);
- else if(inputLine.startsWith("removeDiscount(")&&inputLine.endsWith(")")){
- String s=inputLine.substring(sizeof("removeDiscount(")-1);
- s=s.substring(0,s.length()-1);
- uint16_t id=atoi(s.c_str());
- for(uint16_t o=0;o<numSelections;o++){
- for(uint16_t i=0;i<discounts[o].size();i++){
- if(discounts[o][i].id==id){
- Serial.print("Removed Discount: ");
- Serial.println(id);
- discounts[o].erase(discounts[o].begin()+i);
- }
- }
- }
- }
- else if(inputLine.equals("?")){
- Serial.println("----------------------------------------------");
- Serial.print("Tax rate: ");
- Serial.print(taxRate);
- Serial.println("%");
- Serial.println();
- Serial.println("Prices: ");
- for(int i=0;i<numSelections;i++){
- Serial.print("Selection ");
- Serial.print(i);
- Serial.print("(");
- Serial.print(selection_names[i]);
- Serial.print(")");
- Serial.print(": $");
- Serial.print(selection_prices[i]);
- Serial.println();
- }
- Serial.println();
- Serial.println("Discounts: ");
- for(uint16_t o=0;o<numSelections;o++){
- for(uint16_t i=0;i<discounts[o].size();i++){
- Serial.print("ID ");
- Serial.print(discounts[o][i].id);
- Serial.print(": Selection ");
- Serial.print(o);
- Serial.print("(");
- Serial.print(selection_names[o]);
- Serial.print(") ");
- Serial.print(": ");
- Serial.print(discounts[o][i].quantity);
- Serial.print(" keys @ ");
- Serial.print(discounts[o][i].discount);
- Serial.print("%");
- Serial.println();
- }
- }
- Serial.println();
- Serial.println("Tally:");
- for(int i=0;i<numSelections;i++){
- printSelection(i);
- }
- double subtotal=0;
- for(int i=0;i<numSelections;i++){
- subtotal+=calcSubTotalWithDisc(i);
- }
- double tax=subtotal*taxRate/100.0;
- Serial.print("Subtotal: $");
- Serial.println(subtotal);
- Serial.print("Tax(");
- Serial.print(taxRate);
- Serial.print("%): $");
- Serial.println(tax);
- Serial.print("Total: $");
- Serial.println(subtotal+tax);
- Serial.println();
- Serial.println("Hardware:");
- Serial.print("Keyswitch: ");
- Serial.println(((keyswitch)? "On":"Off"));
- Serial.println("----------------------------------------------");
- }
- inputLine="";
- }
- else{
- inputLine+=c;
- }
- }
- }
- double calcSubTotalWithDisc(uint16_t sel){
- double subtotal=selection_counts[sel]*selection_prices[sel];
- subtotal=subtotal-(subtotal*(findBestDiscount(sel)/100.0));
- return subtotal;
- }
- float findBestDiscount(uint16_t sel){
- float bestDiscount=0;
- for(uint16_t i=0;i<discounts[sel].size();i++){
- if(selection_counts[sel]>=discounts[sel][i].quantity){
- if(discounts[sel][i].discount>bestDiscount){
- bestDiscount=discounts[sel][i].discount;
- }
- }
- }
- return bestDiscount;
- }
- void printSelection(uint16_t sel){
- Serial.print("Selection ");
- Serial.print(sel);
- Serial.print("(");
- Serial.print(selection_names[sel]);
- Serial.print(")");
- Serial.print(": ");
- Serial.print(selection_counts[sel]);
- Serial.print(" @ $");
- Serial.print(selection_prices[sel]);
- Serial.print(" = $");
- double subtotal=selection_counts[sel]*selection_prices[sel];
- Serial.print(subtotal);
- float bestDiscount=findBestDiscount(sel);
- if(bestDiscount!=0){
- Serial.print(" Discount: ");
- Serial.print(bestDiscount);
- Serial.print("% = $");
- Serial.print(calcSubTotalWithDisc(sel));
- }
- Serial.println();
- }
- void getSwitches(){
- for(int i=0;i<numSelections;i++){
- boolean tmp=digitalRead(switch_pins[i]);
- if(!tmp){
- if(millis()>switch_timers[i]){
- swtich_states[i]=true;
- switch_timers[i]=millis()+switch_timeout;
- selection_counts[i]++;
- bell_ding=true;
- printSelection(i);
- }
- }else{
- if(swtich_states[i]){
- if(millis()>switch_timers[i]-switch_timeout+100){
- swtich_states[i]=false;
- }
- }
- }
- }
- }
- void getKeyswitch(){
- boolean tmp=!digitalRead(keyswitch_pinB);
- if(tmp!=keyswitch){
- Serial.print("Keyswitch: ");
- Serial.println(((tmp)? "On":"Off"));
- keyswitch=tmp;
- }
- }
- void processBell(){
- if(millis()>bell_timer){
- if(bell_ding){
- bell_ding=false;
- if(keyswitch){
- digitalWrite(bell_pin,HIGH);
- Serial.println("Bell Ding");
- }
- bell_timer=millis()+bell_timeout;
- }
- }
- else if(millis()>(bell_timer-bell_timeout+bell_hightime)){
- digitalWrite(bell_pin,LOW);
- }
- }
- void printLine(String left,String right){
- String s=" ";
- for(uint16_t i=0;i<right.length();i++){
- s[s.length()-1-i]=right[right.length()-1-i];
- }
- for(uint16_t i=0;i<left.length();i++){
- if(i<s.length()-right.length()){
- s[i]=left[i];
- }
- else{
- s[i-1]=' ';
- s[i-2]='.';
- break;
- }
- }
- printer.println(s);
- }
- void writeRegister(byte val) {
- digitalWrite(latchPin, LOW);
- spi4teensy3::send(val);
- digitalWrite(latchPin, HIGH);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement