cash2ecash

cash2ecash: cash acceptor that issues digital cash (experimental)
Log | Files | Refs | Submodules | README | LICENSE

commit 45e33f9f036797726853e9726d226ae54584366b
parent bc316afeb115c535895ea50a6197915d8aceb12a
Author: Manuel Geissbühler <manuel@debian>
Date:   Thu,  2 Jan 2025 19:18:42 +0100

debugging

Diffstat:
Asrc/#cash2ecash.cpp# | 250+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/.#cash2ecash.cpp | 2++
Msrc/bank/bankCommunication.hpp | 12++++++------
3 files changed, 258 insertions(+), 6 deletions(-)

diff --git a/src/#cash2ecash.cpp# b/src/#cash2ecash.cpp# @@ -0,0 +1,250 @@ +// This is the main function for the cash2ecash program +#include <cstdio> +#include <iostream> +#include <ostream> +#include <vector> +#include <mutex> +#include "utils.hpp" +#include "gui.hpp" +#include "global.hpp" +#include "bank.hpp" + +// Global Definitions +enum state_e { + INIT, + SLEEP, + IDLE, + CONNECTION, + ACCEPTCASH, + DONE, + IDENTIFICATION, + ENUM_STATE_END +}; +#define NUMBER_OF_STATES 7 + +enum state_e state = INIT; + +const char *withdrawal_id; +const char *taler_withdraw_uri; + +std::vector<event_e> eventFIFO; +std::mutex eventFIFOMutex; + + +char hello[] = "hello"; +char world[] = "wold"; +char *string = hello; +Gui gui; +Timer withdrawalStatusTimer; + +ScreenWelcome *screenWelcome = new ScreenWelcome; +ScreenIdentification *screenIdentification = new ScreenIdentification; +ScreenConnection *screenConnection = new ScreenConnection; +ScreenAcceptCash *screenAcceptCash = new ScreenAcceptCash(string); +void guiDriver(); +BankCommunication bankCommunication; + +typedef void(*action_t)(); + +typedef struct { + action_t action; + state_e nextState; +} stateEventPair; + +stateEventPair stateEventTable[NUMBER_OF_STATES][NUMBER_OF_EVENTS]; +//std::vector< std::vector<stateEventPair> >stateEvent2dVector(6, std::vector<stateEventPair>(4)); + + +void actionEventInitialize() { + std::cout << "Event action initialze called" << std::endl; + gui.setActiveScreen(screenWelcome); +} + +void actionEventUnexpected(){ + std::cerr << "Event not expected in this state: " << state << std::endl; +} + +void actionEventStart(){ + std::cout << "Action Event Start called" << std::endl; + //gui.setActiveScreen(screenIdentification); + gui.setActiveScreen(screenIdentification); +} + +void actionEventAbortIdent(){ + std::cout << "Action Event Abort Ident called" << std::endl; + gui.setActiveScreen(screenWelcome); +} + +void actionEventAbortConnection(){ + std::cout << "Action Abort Connection called" << std::endl; + gui.setActiveScreen(screenWelcome); +} + +void actionEventFinishCashin(){ + std::cout << "Action Event Finish Cashin called" << std::endl; + gui.setActiveScreen(screenWelcome); +} + +void actionEventSleep() { std::cout << "Action Event xx called" << std::endl; } + +void actionEventWakeup() { std::cout << "Action Event xx called" << std::endl; } + +void actionEventIdentificationSuccess(){ + std::cout << "Action Event Identification Success called" << std::endl; + gui.setActiveScreen(screenConnection); + bankCommunication.init(); +} + +void actionEventBankTokenDone(){ + std::cout << "Action Event Bank Token Done called" << std::endl; + static struct TALER_Amount amountZero; + TALER_amount_set_zero("KUDOS", &amountZero); + bankCommunication.withdrawalRequest(NULL, &amountZero, &withdrawal_id, &taler_withdraw_uri); +} + +void actionEventBankWithdrawalDone(){ + std::cout << "Action Event Bank Withdrawal Done called" << std::endl; + screenConnection->generateQR(taler_withdraw_uri); + bankCommunication.withrawalStatusRequest(withdrawal_id); +} + +void actionEventBankWStatusSelected(){ + std::cout << "Action Event Bank Withdrawal Status Confirmed called" << std::endl; + gui.setActiveScreen(screenAcceptCash); +} + +void actionEventBankWStatusPending(){ + std::cout << "Action Event Bank Withdrawal Status Pending called" << std::endl; + bankCommunication.withrawalStatusRequest(withdrawal_id); +} + +void actionEventWConfirmationDone(){ + std::cout << "Action Event Bank Confirmation Done called" << std::endl; + gui.setActiveScreen(screenWelcome); +} + +void actionEventIdentificationTimeout(){ + std::cout << "Action Event Identification Timeout called" << std::endl; + gui.setActiveScreen(screenWelcome); +} + +void actionEventAcceptCashTimeout(){ + std::cout << "Action Event Acceptcash Timeout called" << std::endl; + static struct TALER_Amount confirmedAmount; + TALER_string_to_amount("KUDOS:2.0", &confirmedAmount); + bankCommunication.withdrawalConfirmReques(withdrawal_id, &confirmedAmount); +} + +void actionEventConnectionTimeout(){ + std::cout << "Action Event Connection Timeout called" << std::endl; + gui.setActiveScreen(screenWelcome); +} + +void actionEventDoneTimeout() { + std::cout << "Action Event Done Timeout called" << std::endl; + gui.setActiveScreen(screenWelcome); +} + + + + +void initStateEvent(){ + //Runtime initialzation is used due to convienient array indexing. + //Initzialize all state-event pairs to handleuUnexpectedEvent + int state, event; + for (state = 0; state < ENUM_STATE_END; state++) { + for (event = 0; event < ENUM_EVENT_END; event++) { + stateEventTable[state][event].action = &actionEventUnexpected; + stateEventTable[state][event].nextState = (state_e)state; + } + } + + //Overwrite desired state-event pairs to provide actual functionality + stateEventTable[INIT][EVENT_INITIALIZE].action = actionEventInitialize; + stateEventTable[INIT][EVENT_INITIALIZE].nextState = IDLE; + stateEventTable[IDLE][EVENT_BUTTON_START].action = actionEventStart; + stateEventTable[IDLE][EVENT_BUTTON_START].nextState = IDENTIFICATION; //needs to be changed to initialization later + stateEventTable[IDLE][EVENT_SLEEP].action = actionEventSleep; + stateEventTable[IDLE][EVENT_SLEEP].nextState = SLEEP; + + stateEventTable[SLEEP][EVENT_WAKEUP].action = actionEventWakeup; + stateEventTable[SLEEP][EVENT_WAKEUP].nextState = IDLE; + + stateEventTable[IDENTIFICATION][EVENT_BUTTON_ABORT].action = actionEventAbortIdent; + stateEventTable[IDENTIFICATION][EVENT_BUTTON_ABORT].nextState = IDLE; + stateEventTable[IDENTIFICATION][EVENT_IDENTIFICATION_SUCCESS].action = actionEventIdentificationSuccess; + stateEventTable[IDENTIFICATION][EVENT_IDENTIFICATION_SUCCESS].nextState = CONNECTION; + stateEventTable[IDENTIFICATION][EVENT_TIMEOUT].action = actionEventIdentificationTimeout; + stateEventTable[IDENTIFICATION][EVENT_TIMEOUT].nextState = IDLE; + + stateEventTable[CONNECTION][EVENT_BUTTON_ABORT].action = actionEventAbortConnection; + stateEventTable[CONNECTION][EVENT_BUTTON_ABORT].nextState = IDLE; + stateEventTable[CONNECTION][EVENT_BANK_TOKEN_DONE].action = actionEventBankTokenDone; + stateEventTable[CONNECTION][EVENT_BANK_TOKEN_DONE].nextState = CONNECTION; + stateEventTable[CONNECTION][EVENT_BANK_WITHDRAWAL_DONE].action = actionEventBankWithdrawalDone; + stateEventTable[CONNECTION][EVENT_BANK_WITHDRAWAL_DONE].nextState = CONNECTION; + stateEventTable[CONNECTION][EVENT_BANK_W_STATUS_PENDING].action = actionEventBankWStatusPending; + stateEventTable[CONNECTION][EVENT_BANK_W_STATUS_PENDING].nextState = CONNECTION; + stateEventTable[CONNECTION][EVENT_BANK_W_STATUS_SELECTED].action = actionEventBankWStatusSelected; + stateEventTable[CONNECTION][EVENT_BANK_W_STATUS_SELECTED].nextState = ACCEPTCASH; + stateEventTable[CONNECTION][EVENT_TIMEOUT].action = actionEventConnectionTimeout; + stateEventTable[CONNECTION][EVENT_TIMEOUT].nextState = IDLE; + + stateEventTable[ACCEPTCASH][EVENT_BUTTON_FINISH_CASHIN].action = actionEventFinishCashin; + stateEventTable[ACCEPTCASH][EVENT_BUTTON_FINISH_CASHIN].nextState = DONE; + stateEventTable[ACCEPTCASH][EVENT_TIMEOUT].action = actionEventAcceptCashTimeout; + stateEventTable[ACCEPTCASH][EVENT_TIMEOUT].nextState = DONE; + stateEventTable[DONE][EVENT_TIMEOUT].action = actionEventDoneTimeout; + stateEventTable[DONE][EVENT_TIMEOUT].nextState = IDLE; +} + + +void event(event_e event){ + eventFIFOMutex.lock(); + eventFIFO.push_back(event); + eventFIFOMutex.unlock(); +} + +void eventHandler(){ + state_e oldstate; + event_e event; + eventFIFOMutex.lock(); + while (0 < eventFIFO.size()) { + oldstate = state; + event = eventFIFO.front(); + eventFIFOMutex.unlock(); + state = stateEventTable[state][event].nextState; + stateEventTable[oldstate][event].action(); + eventFIFOMutex.lock(); + eventFIFO.erase(eventFIFO.begin()); + } + eventFIFOMutex.unlock(); +} + +int main(int argc, char *argv[]){ + char serialpath[] = "/dev/ttyAMA3"; + std::cout << "The Program is running" <<std::endl; + Timer timer1; + timer1.setTimeMillis(10000); + TALER_Amount testamount; + + //Initialize State Machine + initStateEvent(); + + //Trigger Initialzation Event + event(EVENT_INITIALIZE); + + while (true) { + eventHandler(); + guiDriver(); + } +} + + +void guiDriver(){ + static Timer guiSleep; + if (guiSleep.over()){ + guiSleep.setTimeMillis(gui.timerHandler()); + guiSleep.start(); + } +} diff --git a/src/.#cash2ecash.cpp b/src/.#cash2ecash.cpp @@ -0,0 +1 @@ +manuel@debian.5156:1735820266 +\ No newline at end of file diff --git a/src/bank/bankCommunication.hpp b/src/bank/bankCommunication.hpp @@ -11,7 +11,7 @@ class BankCommunication{ private: - static const char **status; + static const char *status; static void initCallback(){ event(EVENT_BANK_TOKEN_DONE); @@ -26,14 +26,14 @@ class BankCommunication{ } static void withdrawalIDInfoRequestCallback(){ - if (0 == std::strcmp(*status, "pending")){ + if (0 == std::strcmp(status, "pending")){ event(EVENT_BANK_W_STATUS_PENDING); - }else if (0 == std::strcmp(*status, "selected")) { + }else if (0 == std::strcmp(status, "selected")) { event(EVENT_BANK_W_STATUS_SELECTED); - }else if (0 == std::strcmp(*status, "aborted")) { + }else if (0 == std::strcmp(status, "aborted")) { event(EVENT_BUTTON_ABORT); }else{ - std::cerr << "Unexpected Withdrawal Staus: " << *status << std::endl; + std::cerr << "Unexpected Withdrawal Staus: " << status << std::endl; exit(EXIT_FAILURE); } } @@ -53,7 +53,7 @@ class BankCommunication{ } void withrawalStatusRequest(const char *withdrawal_id){ - bankCommunicationWithdrawalIDInfoRequest(withdrawal_id, status, withdrawalIDInfoRequestCallback); + bankCommunicationWithdrawalIDInfoRequest(withdrawal_id, &status, withdrawalIDInfoRequestCallback); } };