gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-taler-mdb] branch master updated: fix my TODOs


From: gnunet
Subject: [taler-taler-mdb] branch master updated: fix my TODOs
Date: Wed, 04 Dec 2019 16:58:18 +0100

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository taler-mdb.

The following commit(s) were added to refs/heads/master by this push:
     new 01cc8d8  fix my TODOs
01cc8d8 is described below

commit 01cc8d8cdc9079d58ff5d0458809bb5caa2e4964
Author: Christian Grothoff <address@hidden>
AuthorDate: Wed Dec 4 16:58:15 2019 +0100

    fix my TODOs
---
 src/main.c | 286 +++++++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 194 insertions(+), 92 deletions(-)

diff --git a/src/main.c b/src/main.c
index af40fe6..47a4573 100644
--- a/src/main.c
+++ b/src/main.c
@@ -25,17 +25,6 @@ along with
 * TODO:
 * - comment code (Boss)
 * - replace remaining MDB magic constants with #defines (Hofer)
-* - support command line option to "disable_mdb" to run without
-*   connected MDB (instead of failing to launch); in this
-*   mode, print out what WOULD be done with MDB (Grothoff)
-* - in keyboard interaction, distinguish between
-*   payment pending and payment not pending, allow
-*   'c', only if pending (Grothoff)
-* - have new state for waiting for MDB to signal vend success/failure
-*   in keyboard interaction prompt for success y/n at that time (or c cancel) 
(Grothoff)
-* - add key strokes for "failure to vend" and "vend successful"
-*   (useful when faking MDB interaction), factor out function for
-    the respective operations! (Grothoff)
 * - implement refunds on failure to vend (TBD)
 */
 #include "config.h"
@@ -263,6 +252,12 @@ struct PaymentActivity
    * If yes, tunneling can be offered to the wallet
    */
   int wallet_has_uri;
+
+  /**
+   * Set to #GNUNET_YES once the product has been paid
+   * (and we are in the process of yielding the product).
+   */
+  int paid;
 };
 
 
@@ -577,6 +572,7 @@ show_qrcode (const char *uri)
     write (qrDisplay.backlightfd, "1", 1);
 }
 
+
 #endif
 
 
@@ -584,7 +580,6 @@ static void
 run_mdb_event_loop (void);
 
 
-
 /**
  * Cleanup all the data when a order has succeeded or got cancelled
  * @param pa the payment activity to clean up
@@ -601,6 +596,7 @@ cleanup_payment (struct PaymentActivity *pa)
     TALER_MERCHANT_proposal_cancel (pa->po);
   if (NULL != pa->cpo)
     TALER_MERCHANT_check_payment_cancel (pa->cpo);
+  GNUNET_CURL_gnunet_scheduler_reschedule (&rc);
   if (NULL != pa->task)
     GNUNET_SCHEDULER_cancel (pa->task);
   if (NULL != pa->delay_task)
@@ -636,7 +632,8 @@ mdb_shutdown ()
     GNUNET_SCHEDULER_cancel (mdb.wtask);
     mdb.wtask = NULL;
   }
-
+  if (disable_mdb)
+    return;
   /* restore UART */
   if (0 != tcsetattr (mdb.uartfd,
                       TCSAFLUSH,
@@ -946,6 +943,10 @@ open_nfc_reader (void *cls)
 }
 
 
+static void
+start_read_keyboard (void);
+
+
 /**
  * Callback to process a GET /check-payment request
  *
@@ -976,6 +977,7 @@ check_payment_cb (void *cls,
   (void) refunded;
   (void) refund_amount;
   (void) obj;
+  GNUNET_assert (payment_activity == pa);
   pa->cpo = NULL;
   if (MHD_HTTP_OK != http_status)
   {
@@ -993,9 +995,14 @@ check_payment_cb (void *cls,
   if (paid)
   {
     mdb.cmd = &approveVend;
-    cleanup_payment (pa);
-    GNUNET_assert (payment_activity == pa);
-    payment_activity = NULL;
+    payment_activity->paid = GNUNET_YES;
+    run_mdb_event_loop ();
+    if (disable_mdb)
+    {
+      GNUNET_SCHEDULER_cancel (keyboard_task);
+      keyboard_task = NULL;
+      start_read_keyboard ();
+    }
     return;
   }
   else
@@ -1158,8 +1165,41 @@ launch_payment (const struct Product *product)
 }
 
 
+/**
+ * Vending successful, conclude payment activity.
+ */
 static void
-start_read_keyboard (void);
+vend_success ()
+{
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "MDB vend success received\n");
+  GNUNET_break (NULL != payment_activity);
+  if (NULL != payment_activity)
+  {
+    cleanup_payment (payment_activity);
+    payment_activity = NULL;
+  }
+}
+
+
+/**
+ * Vending failed, provide refund.
+ */
+static void
+vend_failure ()
+{
+  GNUNET_break (NULL != payment_activity);
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "Received MDB vend failure, refunding customer (FIXME: not 
implemented)\n");
+  mdb.cmd = &endSession;
+  mdb.session_running = GNUNET_NO;
+  /* FIXME: refund logic here! */
+  if (NULL != payment_activity)
+  {
+    cleanup_payment (payment_activity);
+    payment_activity = NULL;
+  }
+}
 
 
 /**
@@ -1181,36 +1221,56 @@ read_keyboard_command (void *cls)
     GNUNET_SCHEDULER_shutdown ();
     return;
   }
-  if ((char) input == 'c')
+  if (NULL != payment_activity)
   {
-    if (NULL != payment_activity)
+    switch ((char) input)
     {
-      mdb.cmd = &denyVend;
+    case 'c':
+      if (GNUNET_NO == payment_activity->paid)
+      {
+        mdb.cmd = &denyVend;
+      }
+      else
+      {
+        mdb.cmd = &endSession;
+        mdb.session_running = GNUNET_NO;
+      }
       run_mdb_event_loop ();
       cleanup_payment (payment_activity);
       payment_activity = NULL;
-    }
-    else
-    {
-      fprintf (stderr,
-               "No purchase activity pending\n");
-    }
-    start_read_keyboard ();
-    return;
-  }
-  if ((char) input == 'a')
-  {
-    if (NULL != payment_activity)
-    {
+      break;
+    case 'a':
+      payment_activity->paid = GNUNET_YES;
       mdb.cmd = &approveVend;
       run_mdb_event_loop ();
-      cleanup_payment (payment_activity);
-      payment_activity = NULL;
-    }
-    else
-    {
+      break;
+    case 'n':
+      if (disable_mdb)
+      {
+        vend_failure ();
+      }
+      else
+      {
+        fprintf (stderr,
+                 "Cannot fail to vend at this time, waiting for payment\n");
+      }
+      break;
+    case 'y':
+      if (disable_mdb)
+      {
+        vend_success ();
+      }
+      else
+      {
+        fprintf (stderr,
+                 "Cannot succeed to vend at this time, waiting for payment\n");
+      }
+      break;
+    default:
       fprintf (stderr,
-               "No purchase activity pending\n");
+               "Unknown command `%c'\n",
+               input);
+      break;
     }
     start_read_keyboard ();
     return;
@@ -1245,13 +1305,28 @@ start_read_keyboard ()
   struct GNUNET_DISK_FileHandle fh = { STDIN_FILENO };
 
   GNUNET_assert (NULL == keyboard_task);
-  for (unsigned int i = 0; i < products_length; i++)
-    printf ("'%c' to buy %s\n",
-            products[i].key,
-            products[i].description);
-  printf ("'a' to fake payment for the last purchase\n"
-          "'c' to cancel last purchase\n"
-          "'x' to quit\n");
+  if (NULL == payment_activity)
+  {
+    for (unsigned int i = 0; i < products_length; i++)
+      printf ("'%c' to buy %s\n",
+              products[i].key,
+              products[i].description);
+  }
+  else
+  {
+    if (GNUNET_NO == payment_activity->paid)
+    {
+      printf ("'a' to fake payment for the last purchase\n"
+              "'c' to cancel last purchase\n");
+    }
+    else
+    {
+      if (disable_mdb)
+        printf ("'y' to simulate product successfully dispensed\n"
+                "'n' to simulate product failed to be dispensed\n");
+    }
+  }
+  printf ("'x' to quit\n");
   printf ("Waiting for keyboard input\n");
   keyboard_task = GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL,
                                                   &fh,
@@ -1267,6 +1342,15 @@ write_mdb_command (void *cls)
 
   (void) cls;
   mdb.wtask = NULL;
+  if (disable_mdb)
+  {
+    if (NULL == mdb.cmd)
+      return;
+    mdb.last_cmd = mdb.cmd;
+    mdb.cmd = NULL;
+    run_mdb_event_loop ();
+    return;
+  }
   if (mdb.tx_off < mdb.tx_len)
   {
     ssize_t ret = write (mdb.uartfd,
@@ -1344,6 +1428,29 @@ write_mdb_command (void *cls)
 }
 
 
+/**
+ * MDB acknowledged the last command, proceed.
+ */
+static void
+handle_ack ()
+{
+  if (&beginSession == mdb.last_cmd)
+    mdb.session_running = GNUNET_YES;
+  if (&denyVend == mdb.last_cmd)
+  {
+    mdb.session_running = GNUNET_NO;
+    mdb.cmd = &endSession;
+  }
+  mdb.last_cmd = NULL;
+  /* Cause the write-task to be re-scheduled now */
+  if (NULL != mdb.wtask)
+  {
+    GNUNET_SCHEDULER_cancel (mdb.wtask);
+    mdb.wtask = NULL;
+  }
+}
+
+
 /**
  *
  * @param hex_len number of characters in @a hex
@@ -1440,22 +1547,12 @@ handle_command (const char *hex,
         }
       case VMC_VEND_SUCCESS:
         GNUNET_break (GNUNET_YES == mdb.session_running);
-        GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-                    "Vend Success\n");
+        vend_success ();
         break;
       case VMC_VEND_FAILURE:
         {
           GNUNET_break (GNUNET_YES == mdb.session_running);
-          mdb.cmd = &endSession;
-          mdb.session_running = GNUNET_NO;
-          GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-                      "Received MDB vend failure, refunding customer (FIXME: 
not implemented)\n");
-          /* FIXME: refund logic here! */
-          if (NULL != payment_activity)
-          {
-            cleanup_payment (payment_activity);
-            payment_activity = NULL;
-          }
+          vend_failure ();
           break;
         }
       case VMC_VEND_SESSION_COMPLETE:
@@ -1522,19 +1619,7 @@ handle_command (const char *hex,
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                 "Received acknowledgement (for command `%s') from MDB\n",
                 (NULL != mdb.last_cmd) ? mdb.last_cmd->name : "?");
-    if (&beginSession == mdb.last_cmd)
-      mdb.session_running = GNUNET_YES;
-    if (&denyVend == mdb.last_cmd)
-    {
-      mdb.session_running = GNUNET_NO;
-      mdb.cmd = &endSession;
-    }
-    mdb.last_cmd = NULL;
-    if (NULL != mdb.wtask)
-    {
-      GNUNET_SCHEDULER_cancel (mdb.wtask);
-      mdb.wtask = NULL;
-    }
+    handle_ack ();
     break;
   case VMC_OOSQ:
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
@@ -1572,6 +1657,7 @@ read_mdb_command (void *cls)
   size_t cmdEndIdx;
 
   (void) cls;
+  GNUNET_assert (! disable_mdb);
   mdb.rtask = NULL;
   ret = read (mdb.uartfd,
               &mdb.rxBuffer[mdb.rx_off],
@@ -1639,8 +1725,7 @@ run_mdb_event_loop ()
 {
   struct GNUNET_DISK_FileHandle fh = { mdb.uartfd };
 
-  if (disable_mdb)
-    return;
+  return;
   if ( (GNUNET_NO == mdb.session_running) &&
        (NULL == mdb.cmd) &&
        (NULL == mdb.last_cmd) )
@@ -1649,11 +1734,26 @@ run_mdb_event_loop ()
   if ( (NULL == mdb.wtask) &&
        ( (NULL != mdb.cmd) ||
          (mdb.tx_len > mdb.tx_off) ) )
-    mdb.wtask = GNUNET_SCHEDULER_add_write_file (GNUNET_TIME_UNIT_FOREVER_REL,
-                                                 &fh,
-                                                 &write_mdb_command,
-                                                 NULL);
-  if (NULL == mdb.rtask)
+  {
+    if (disable_mdb)
+      mdb.wtask = GNUNET_SCHEDULER_add_now (&write_mdb_command,
+                                            NULL);
+    else
+      mdb.wtask = GNUNET_SCHEDULER_add_write_file 
(GNUNET_TIME_UNIT_FOREVER_REL,
+                                                   &fh,
+                                                   &write_mdb_command,
+                                                   NULL);
+  }
+  if ( (disable_mdb) &&
+       (NULL != mdb.last_cmd) )
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+                "Faking acknowledgement (for command `%s') from MDB\n",
+                mdb.last_cmd->name);
+    handle_ack ();
+  }
+  if ( (NULL == mdb.rtask) &&
+       (! disable_mdb) )
     mdb.rtask = GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL,
                                                 &fh,
                                                 &read_mdb_command,
@@ -1748,7 +1848,10 @@ mdb_init ()
   struct termios uart_opts_raw;
 
   if (disable_mdb)
+  {
+    run_mdb_event_loop ();
     return GNUNET_OK;
+  }
   /* open uart connection */
   if (0 > (mdb.uartfd = open (uart_device_filename,
                               O_RDWR | O_NOCTTY | O_NDELAY)))
@@ -1961,9 +2064,7 @@ run (void *cls,
            &qrDisplay.var_info);
 
     /* store current screeninfo for reset */
-    memcpy (&qrDisplay.orig_vinfo,
-            &qrDisplay.var_info,
-            sizeof(struct fb_var_screeninfo));
+    qrDisplay.orig_vinfo = qrDisplay.var_info;
 
     if (16 != qrDisplay.var_info.bits_per_pixel)
     {
@@ -1973,8 +2074,8 @@ run (void *cls,
                      FBIOPUT_VSCREENINFO,
                      &qrDisplay.var_info))
       {
-        GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                    "Error setting display bpp to 16\n");
+        GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
+                             "ioctl(FBIOPUT_VSCREENINFO)");
         return;
       }
     }
@@ -1984,8 +2085,8 @@ run (void *cls,
                    FBIOGET_FSCREENINFO,
                    &qrDisplay.fix_info))
     {
-      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                  "Error reading fixed display information\n");
+      GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
+                           "ioctl(FBIOGET_FSCREENINFO)");
       return;
     }
 
@@ -1999,8 +2100,8 @@ run (void *cls,
     /* open backlight file to turn display backlight on and off */
     if (0 > qrDisplay.devicefd)
     {
-      GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                  "failed to map display memory\n");
+      GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
+                           "mmap");
       return;
     }
 
@@ -2013,8 +2114,9 @@ run (void *cls,
       "/sys/class/backlight/soc:backlight/brightness", O_WRONLY);
     if (0 > qrDisplay.backlightfd)
     {
-      GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-                  "failed to load 
\"/sys/class/backlight/soc:backlight/brightness\", display backlight will not 
be changed\n");
+      GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
+                                "open",
+                                
"/sys/class/backlight/soc:backlight/brightness");
     }
     else
     {
@@ -2023,9 +2125,9 @@ run (void *cls,
   }
   else
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                "open(), could not open framebuffer device %s\n",
-                framebuffer_device_filename);
+    GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_WARNING,
+                              "open",
+                              framebuffer_device_filename);
   }
 #endif
   start_read_keyboard ();

-- 
To stop receiving notification emails like this one, please contact
address@hidden.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]