gnunet-svn
[Top][All Lists]
Advanced

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

[taler-taler-mdb] branch master updated: fixtodos


From: gnunet
Subject: [taler-taler-mdb] branch master updated: fixtodos
Date: Fri, 06 Dec 2019 16:01:12 +0100

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

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

The following commit(s) were added to refs/heads/master by this push:
     new f75c128  fixtodos
f75c128 is described below

commit f75c128255bfae841066440d5763ef176beddc79
Author: Dominik Hofer <address@hidden>
AuthorDate: Fri Dec 6 15:51:15 2019 +0100

    fixtodos
---
 src/main.c | 167 ++++++++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 121 insertions(+), 46 deletions(-)

diff --git a/src/main.c b/src/main.c
index 862a6bc..ddd103f 100644
--- a/src/main.c
+++ b/src/main.c
@@ -21,10 +21,10 @@ along with
 * @brief main functionality of the application
 * @author Boss Marco
 * @author Christian Grothoff
+* @author Dominik Hofer
 *
 * TODO:
 * - comment code (Boss)
-* - replace remaining MDB magic constants with #defines (Hofer)
 */
 #include "config.h"
 #include <stdio.h>
@@ -123,6 +123,9 @@ along with
 
 /* Commands for communication via MDB/ICP */
 /* VMC commands */
+#define VMC_CMD_START 0x02
+#define VMC_CMD_END 0x03
+
 /**
  * Acknowledgement
  */
@@ -163,11 +166,30 @@ along with
 #define VMC_RETR 0xAA
 
 /* Reader commands */
+
+/* Config Data */
+/* Refer to the mdb interface specifications v4.2 p.288 */
 #define READER_CONFIG "01"
+#define READER_FEATURE_LEVEL "01"
+#define READER_COUNTRYCODE "1978"
+#define READER_SCALE_FACTOR "0A"
+#define READER_DECIMAL_PLACES "02"
+#define READER_MAX_RESPONSE_TIME "FF"
+#define READER_MISC_OPTIONS "0C"
+
+/* Session Commands */
+/* Refer to the mdb interface specifications v4.2 p.131 */
 #define READER_BEGIN_SESSION "03"
+#define READER_FUNDS_AVAILABLE "FFFF"
+#define READER_END_SESSION "07"
+
+/* Vend Commands */
+/* Refer to the mdb interface specifications v4.2 p.134 */
 #define READER_VEND_APPROVE "05"
+#define READER_VEND_AMOUNT "0001"
 #define READER_VEND_DENIED "06"
-#define READER_END_SESSION "07"
+
+/* Cancelled Command */
 #define READER_CANCELLED "08"
 
 /* Unused reader commands */
@@ -176,7 +198,9 @@ along with
 #define READER_REVALUE_APPROVED "0D"
 #define READER_REVALUE_DENIED "0E"
 
-
+/**
+ * Datatype for mdb subcommands and data
+ */
 struct MdbBlock
 {
   uint8_t *bin;
@@ -562,7 +586,7 @@ static struct Display qrDisplay;
 #include <qrencode.h>
 
 /**
- * Create the QR code to pay and display it on screen
+ * @brief Create the QR code to pay and display it on screen
  *
  * @param uri what text to show in the QR code
  */
@@ -689,7 +713,7 @@ run_mdb_event_loop (void);
 
 
 /**
- * Cleanup all the data when a order has succeeded or got cancelled
+ * @brief Cleanup all the data when a order has succeeded or got cancelled
  * @param pa the payment activity to clean up
  */
 static void
@@ -728,7 +752,9 @@ cleanup_payment (struct PaymentActivity *pa)
   GNUNET_free (pa);
 }
 
-
+/**
+ * @brief Shutdown the mdb communication tasks
+ */
 static void
 mdb_shutdown ()
 {
@@ -763,7 +789,8 @@ mdb_shutdown ()
 
 
 /**
- * Shutdown the application.
+ * @brief Shutdown the application.
+ *
  * @param cls closure
  */
 static void
@@ -863,7 +890,8 @@ wallet_select_aid (void *cls);
 
 
 /**
- * Transmit the pay uri from taler to the wallet application via NFC
+ * @brief Transmit the pay uri from taler to the wallet application via NFC
+ *
  * @param cls closure
  */
 static void
@@ -888,7 +916,7 @@ wallet_transmit_uri (void *cls)
                                           NFC_TIMEOUT))
   {
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
-                "Failed to send command\n");
+                "Failed to send command via NFC\n");
     pa->task = GNUNET_SCHEDULER_add_now (&connect_target,
                                          pa);
     return;
@@ -916,7 +944,8 @@ wallet_transmit_uri (void *cls)
 
 
 /**
- * Select the taler wallet app via NFC
+ * @brief Select the taler wallet app via NFC
+ *
  * @param cls closure
  */
 static void
@@ -976,7 +1005,7 @@ wallet_select_aid (void *cls)
 
 
 /**
- * Connect the NFC reader with a compatible NFC target
+ * @brief Connect the NFC reader with a compatible NFC target
  *
  * @param cls closure
  */
@@ -1024,7 +1053,7 @@ connect_target (void *cls)
 
 
 /**
- * Open the NFC reader.
+ * @brief Open the NFC reader.
  *
  * @param cls closure
  */
@@ -1040,7 +1069,7 @@ open_nfc_reader (void *cls)
   if (NULL == pa->pnd)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Payment inititation: Unable to open nfc device\n");
+                "Payment inititation: Unable to open NFC device\n");
     pa->task = GNUNET_SCHEDULER_add_delayed (NFC_FAILURE_RETRY_FREQ,
                                              &open_nfc_reader,
                                              pa);
@@ -1070,7 +1099,7 @@ start_read_keyboard (void);
 
 
 /**
- * Callback to process a GET /check-payment request
+ * @brief Callback to process a GET /check-payment request
  *
  * @param cls closure
  * @param http_status HTTP status code for this request
@@ -1106,7 +1135,7 @@ check_payment_cb (void *cls,
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                 "Backend request to /check-payment failed: %u\n",
                 http_status);
-    mdb.cmd = &denyVend;
+               mdb.cmd = &denyVend;
     run_mdb_event_loop ();
     cleanup_payment (pa);
     GNUNET_assert (payment_activity == pa);
@@ -1158,7 +1187,7 @@ check_payment_cb (void *cls,
 
 
 /**
- * Check the payment status again
+ * @brief Check the payment status again
  *
  * @param cls closure
  */
@@ -1180,7 +1209,7 @@ check_payment_again (void *cls)
 
 
 /**
- * Callback for a PUT /order request
+ * @brief Callback for a PUT /order request
  *
  * @param cls closure
  * @param http_status HTTP status code for this request
@@ -1227,7 +1256,7 @@ proposal_cb (void *cls,
 
 
 /**
- * Launch a new order
+ * @brief Launch a new order
  *
  * @param product information for product to sell
  * @return payment activity for the order, NULL on failure
@@ -1291,7 +1320,7 @@ launch_payment (const struct Product *product)
 
 
 /**
- * Vending successful, conclude payment activity.
+ * @brief Vending successful, conclude payment activity.
  */
 static void
 vend_success ()
@@ -1308,7 +1337,7 @@ vend_success ()
 
 
 /**
- * Callback to process a POST /refund request
+ * @brief Callback to process a POST /refund request
  *
  * @param cls closure
  * @param http_status HTTP status code for this request
@@ -1339,7 +1368,7 @@ refund_complete_cb (void *cls,
 
 
 /**
- * Vending failed, provide refund.
+ * @brief Vending failed, provide refund.
  */
 static void
 vend_failure ()
@@ -1380,7 +1409,7 @@ vend_failure ()
 
 
 /**
- * Read the character from stdin and activate the selected task
+ * @brief Read the character from stdin and activate the selected task
  *
  * @param cls closure
  */
@@ -1474,7 +1503,7 @@ read_keyboard_command (void *cls)
 
 
 /**
- * Wait for a keyboard input
+ * @brief Wait for a keyboard input
  */
 static void
 start_read_keyboard ()
@@ -1511,7 +1540,11 @@ start_read_keyboard ()
                                                   NULL);
 }
 
-
+/**
+ * @brief Send data to the vmc via the uart bus
+ *
+ * @param cls closure
+ */
 static void
 write_mdb_command (void *cls)
 {
@@ -1519,8 +1552,10 @@ write_mdb_command (void *cls)
 
   (void) cls;
   mdb.wtask = NULL;
+
   if (disable_mdb)
   {
+    /* check if there is a cmd to send and overwrite last command */
     if (NULL == mdb.cmd)
       return;
     mdb.last_cmd = mdb.cmd;
@@ -1528,6 +1563,7 @@ write_mdb_command (void *cls)
     run_mdb_event_loop ();
     return;
   }
+       /* if command was sent completely send the rest */
   if (mdb.tx_off < mdb.tx_len)
   {
     ssize_t ret = write (mdb.uartfd,
@@ -1541,13 +1577,14 @@ write_mdb_command (void *cls)
                                 "write",
                                 uart_device_filename);
       if (in_shutdown)
-       mdb_shutdown ();
+         mdb_shutdown ();
       else
-       GNUNET_SCHEDULER_shutdown ();
+                   GNUNET_SCHEDULER_shutdown ();
       return;
     }
     mdb.tx_off += ret;
-    if ( (ret > 0) &&
+      /* if command was sent sucessfully start the timer for ACK timeout */ 
+      if ( (ret > 0) &&
          (mdb.tx_off == mdb.tx_len) )
       mdb.ack_timeout = GNUNET_TIME_relative_to_absolute (MAX_ACK_LATENCY);
   }
@@ -1561,7 +1598,7 @@ write_mdb_command (void *cls)
   {
     struct GNUNET_TIME_Relative del;
 
-    /* Still waiting for ACK! */
+    /* Still waiting for ACK! -> delay write task  */
     del = GNUNET_TIME_absolute_get_remaining (mdb.ack_timeout);
     if (0 != del.rel_value_us)
     {
@@ -1585,6 +1622,7 @@ write_mdb_command (void *cls)
   }
   if (NULL == mdb.cmd)
     return;
+  /* if there is a command to send calculate length and checksum */
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               "Sending command `%s'\n",
               mdb.cmd->name);
@@ -1592,6 +1630,7 @@ write_mdb_command (void *cls)
   mdb.tx_len = mdb.cmd->cmd.bin_size + mdb.cmd->data.bin_size + 1;
   GNUNET_assert (mdb.tx_len <= sizeof (mdb.txBuffer));
   {
+    /* calculate checksum: sum up command and data, take just the LSB of the 
result */
     uint32_t chkSum = 0;
 
     for (size_t idx = 0; idx < mdb.cmd->cmd.bin_size; idx++)
@@ -1609,7 +1648,7 @@ write_mdb_command (void *cls)
 
 
 /**
- * MDB acknowledged the last command, proceed.
+ * @brief MDB acknowledged the last command, proceed.
  */
 static void
 handle_ack ()
@@ -1632,7 +1671,9 @@ handle_ack ()
 
 
 /**
+ * @brief Parse received command from the VMC
  *
+ * @param hex received command from VMC
  * @param hex_len number of characters in @a hex
  */
 static void
@@ -1641,6 +1682,7 @@ handle_command (const char *hex,
 {
   unsigned int cmd;
 
+       /* if the received command is 0 or not a multiple of 2 we cannot parse 
it */
   if (0 == hex_len)
     return;
   if (0 != (hex_len % 2))
@@ -1652,6 +1694,7 @@ handle_command (const char *hex,
     GNUNET_break_op (0);
     return;
   }
+       /* convert the received 2 bytes from ASCII to hex */
   if (1 != sscanf (hex,
                    "%2X",
                    &cmd))
@@ -1663,6 +1706,7 @@ handle_command (const char *hex,
     GNUNET_break_op (0);
     return;
   }
+       /* parse the first byte (cmd) and the second byte (subcmd) */
   switch (cmd)
   {
   case VMC_VEND:
@@ -1710,6 +1754,7 @@ handle_command (const char *hex,
             GNUNET_break_op (0);
             return;
           }
+          /* compare the received product number with the defined product 
numbers */
           for (unsigned int i = 0; i < products_length; i++)
             if (product == products[i].number)
             {
@@ -1787,8 +1832,8 @@ handle_command (const char *hex,
         mdb.session_running = GNUNET_NO;
         break;
       case VMC_READER_CANCEL:
-       mdb.cmd = &readerCancelled;
-       mdb.session_running = GNUNET_NO;
+            mdb.cmd = &readerCancelled;
+            mdb.session_running = GNUNET_NO;
        break;
       default:
         GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
@@ -1836,7 +1881,11 @@ handle_command (const char *hex,
   }
 }
 
-
+/**
+ * @brief Read in the sent commands of the VMC controller
+ *
+ * @param cls closure 
+ */
 static void
 read_mdb_command (void *cls)
 {
@@ -1845,6 +1894,7 @@ read_mdb_command (void *cls)
   size_t cmdEndIdx;
 
   (void) cls;
+       /* don't read if the mdb bus is disabled (only for testing) */
   GNUNET_assert (! disable_mdb);
   mdb.rtask = NULL;
   ret = read (mdb.uartfd,
@@ -1864,7 +1914,7 @@ read_mdb_command (void *cls)
   {
     /* find begining of command */
     for (cmdStartIdx = 0; cmdStartIdx < mdb.rx_off; cmdStartIdx++)
-      if (0x02 == mdb.rxBuffer[cmdStartIdx])
+      if (VMC_CMD_START == mdb.rxBuffer[cmdStartIdx])
         break;
     if (cmdStartIdx == mdb.rx_off)
     {
@@ -1873,7 +1923,7 @@ read_mdb_command (void *cls)
     }
     /* find end of command */
     for (cmdEndIdx = cmdStartIdx; cmdEndIdx < mdb.rx_off; cmdEndIdx++)
-      if (0x03 == mdb.rxBuffer[cmdEndIdx])
+      if (VMC_CMD_END == mdb.rxBuffer[cmdEndIdx])
         break;
     if (cmdEndIdx == mdb.rx_off)
     {
@@ -1886,14 +1936,17 @@ read_mdb_command (void *cls)
         GNUNET_SCHEDULER_shutdown ();
         return;
       }
+                       /* move cmd in buffer to the beginning of the buffer */
       memmove (mdb.rxBuffer,
                &mdb.rxBuffer[cmdStartIdx],
                mdb.rx_off - cmdStartIdx);
       mdb.rx_off -= cmdStartIdx;
       break;
     }
+               /* if the full command was received parse it */
     handle_command ((const char *) &mdb.rxBuffer[cmdStartIdx + 1],
                     cmdEndIdx - cmdStartIdx - 1);
+    /* move the data after the processed command to the left */
     memmove (mdb.rxBuffer,
              &mdb.rxBuffer[cmdEndIdx + 1],
              mdb.rx_off - cmdEndIdx + 1);
@@ -1907,12 +1960,15 @@ read_mdb_command (void *cls)
   run_mdb_event_loop ();
 }
 
-
+/**
+ * @brief Mdb event loop to start read and write tasks
+ */
 static void
 run_mdb_event_loop ()
 {
   struct GNUNET_DISK_FileHandle fh = { mdb.uartfd };
 
+       /* begin session if no cmd waits for sending and no cmd is received 
from the VMC */
   if ( (GNUNET_NO == mdb.session_running) &&
        (NULL == mdb.cmd) &&
        (NULL == mdb.last_cmd) )
@@ -1921,9 +1977,10 @@ run_mdb_event_loop ()
                "Begining MDB session\n");
     mdb.cmd = &beginSession;
   }
+       /* start write task if he doesn't exist and if there is a cmd waiting 
to get sent */
   if ( (NULL == mdb.wtask) &&
        ( (NULL != mdb.cmd) ||
-        (in_shutdown) ||
+              (in_shutdown) ||
          (mdb.tx_len > mdb.tx_off) ) )
   {
     if (disable_mdb)
@@ -1943,6 +2000,7 @@ run_mdb_event_loop ()
                 mdb.last_cmd->name);
     handle_ack ();
   }
+       /* start read task if he doesn't exist and the mdb communication is not 
disabled (only for testing) */
   if ( (NULL == mdb.rtask) &&
        (! disable_mdb) )
     mdb.rtask = GNUNET_SCHEDULER_add_read_file (GNUNET_TIME_UNIT_FOREVER_REL,
@@ -1953,7 +2011,8 @@ run_mdb_event_loop ()
 
 
 /**
- * Read the products from the configuration file
+ * @brief Read the products from the configuration file
+ *
  * @param cls closure
  * @param section section of the config file to read from
  */
@@ -2032,7 +2091,9 @@ read_products (void *cls,
                        tmpProduct);
 }
 
-
+/**
+ * @brief Initialise the uart device to send mdb commands
+ */
 static int
 mdb_init ()
 {
@@ -2094,13 +2155,14 @@ mdb_init ()
                          "tcsetattr");
     return GNUNET_SYSERR;
   }
+  /* if the configuration of the uart was sucessfull start the mdb write and 
read tasks */
   run_mdb_event_loop ();
   return GNUNET_OK;
 }
 
 
 /**
- * Start the application
+ * @brief Start the application
  *
  * @param cls closure
  * @param args arguments left
@@ -2242,7 +2304,7 @@ run (void *cls,
   if (NULL == context)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                "Unable to initialize nfc (nfc_init() failed)\n");
+                "Unable to initialize NFC (nfc_init() failed)\n");
     global_ret = EXIT_FAILURE;
     GNUNET_SCHEDULER_shutdown ();
     return;
@@ -2338,7 +2400,12 @@ run (void *cls,
   start_read_keyboard ();
 }
 
-
+/**
+ * @brief Convert the ASCII cmd in @hex to hex and store it in the mdb data 
struct @blk
+ *
+ * @param *blk pointer with reference to the mdb datablock
+ * @param *hex pointer to the string containing the cmd data
+ */
 static void
 parse_block (struct MdbBlock *blk,
              const char *hex)
@@ -2363,7 +2430,14 @@ parse_block (struct MdbBlock *blk,
   }
 }
 
-
+/**
+ * @brief Create a new mdb command
+ *
+ * @param *name pointer to the string containing the command name 
+ * @param *cmd pointer to the string containing the command
+ * @param *data pointer to the string containing the command data
+ * @return structure of type MdbCommand holding the given information by the 
parameters 
+ */
 static struct MdbCommand
 setup_mdb_cmd (const char *name,
                const char *cmd,
@@ -2409,15 +2483,16 @@ main (int argc,
                "Failed to set terminal discipline\n");
   }
 
+  /* make the needed commands for the communication with the vending machine 
controller */
   readerConfigData = setup_mdb_cmd ("Reader Config",
                                     READER_CONFIG,
-                                    "0119780A02FF0C");
+                                    READER_FEATURE_LEVEL READER_COUNTRYCODE 
READER_SCALE_FACTOR READER_DECIMAL_PLACES READER_MAX_RESPONSE_TIME 
READER_MISC_OPTIONS);
   beginSession = setup_mdb_cmd ("Begin Session",
                                 READER_BEGIN_SESSION,
-                                "FFFF");
+                                READER_FUNDS_AVAILABLE);
   approveVend = setup_mdb_cmd ("Approve Vend",
                                READER_VEND_APPROVE,
-                               "0001");
+                               READER_VEND_AMOUNT);
   readerCancelled = setup_mdb_cmd ("Confirm cancellation",
                                   READER_CANCELLED,
                                   NULL);
@@ -2431,7 +2506,7 @@ main (int argc,
   ret = GNUNET_PROGRAM_run (argc,
                             argv,
                             "taler-mdb",
-                            "This is an application for snack machines to pay 
with GNU Taler via nfc.\n",
+                            "This is an application for snack machines to pay 
with GNU Taler via NFC.\n",
                             options,
                             &run,
                             NULL);

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



reply via email to

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