diff options
author | Christian Grothoff <grothoff@gnunet.org> | 2022-07-22 12:54:25 +0200 |
---|---|---|
committer | Christian Grothoff <grothoff@gnunet.org> | 2022-07-22 12:54:25 +0200 |
commit | 3c5d8d40c75700cd96c14cb2f93b12d4bb2e7aa3 (patch) | |
tree | 13c1a07ee556c347e9b4af37efa4eebebc783378 | |
parent | 7327096801588a0ed19b680ba1b3f0a0d6a6d42d (diff) | |
download | taler-mdb-3c5d8d40c75700cd96c14cb2f93b12d4bb2e7aa3.tar.gz taler-mdb-3c5d8d40c75700cd96c14cb2f93b12d4bb2e7aa3.tar.bz2 taler-mdb-3c5d8d40c75700cd96c14cb2f93b12d4bb2e7aa3.zip |
-ca draft
-rw-r--r-- | README | 22 | ||||
-rw-r--r-- | configure.ac | 8 | ||||
-rw-r--r-- | src/Makefile.am | 11 | ||||
-rw-r--r-- | src/taler-coin-acceptor.c | 222 | ||||
-rw-r--r-- | src/taler-mdb.c (renamed from src/main.c) | 0 |
5 files changed, 251 insertions, 12 deletions
@@ -1,14 +1,14 @@ -# GNU Taler snack machine +# GNU Taler hardware integrations -#### Author(s) - * BOSS Marco - * HOFER Dominik - * GROTHOFF Christian +* snack machine (taler-mdb) +* coin acceptor (taler-coin-acceptor) +* cash acceptor (TBD) #### Prerequisites * GNU gcc tool-chain * C standard libraries * libnfc + * libusb * libcurl/libgnurl * libjansson * GNU make @@ -27,10 +27,13 @@ * Adafruit PiTFT 3.5" display #### Description -This is a app to run a snack machine as Taler merchant with NFC payment interface. -Optionally there can a QRCode be shown on a display to get the payment link. + +taler-mdb is a app to run a snack machine as Taler merchant with NFC +payment interface. Optionally there can a QRCode be shown on a +display to get the payment link. #### Remarks + * When using an ACR122 device there may be problems with libnfc. [see here](https://github.com/nfc-tools/libnfc) for further information * At the moment there is no option to cross compile @@ -45,5 +48,6 @@ Building should be easily done with the following three commands: ``` #### Configuration -To configure the merchants backend and the product numbers of the snack machine edit -taler.conf file. + +To configure the merchants backend and the product numbers of the +snack machine edit taler.conf file. diff --git a/configure.ac b/configure.ac index 7c9c084..1b9d517 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ([2.69]) AC_INIT([taler-mdb], [0.8.2], [taler@gnu.org]) -AC_CONFIG_SRCDIR([src/main.c]) +AC_CONFIG_SRCDIR([src/taler-mdb.c]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. @@ -13,9 +13,15 @@ AC_PROG_CC # Checks for libraries. AC_CHECK_LIB([nfc], [nfc_open]) +# Checks for libraries. +AC_CHECK_LIB([usb], [libusb_init]) + # Checks for header files. AC_CHECK_HEADERS([stdlib.h string.h unistd.h sys/un.h netinet/in.h netinet/ip.h]) +# Checks for header files. +AC_CHECK_HEADERS([libusb-1.0/libusb.h]) + # Checks for typedefs, structures, and compiler characteristics. AC_CHECK_HEADER_STDBOOL AC_TYPE_SIZE_T diff --git a/src/Makefile.am b/src/Makefile.am index f018f6d..86ddd3b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,5 +1,7 @@ # This Makefile.am is in the public domain -bin_PROGRAMS = taler-mdb +bin_PROGRAMS = \ + taler-coin-acceptor \ + taler-mdb if HAVE_QR bin_PROGRAMS += qr-show @@ -10,8 +12,13 @@ if USE_COVERAGE XLIB = -lgcov endif +taler_coin_acceptor_SOURCES = \ + taler-coin-acceptor.c +taler_coin_acceptor_LDADD = \ + -lusb-1.0 + taler_mdb_SOURCES = \ - main.c + taler-mdb.c taler_mdb_LDADD = \ -ltalermerchant \ -ltalerjson \ diff --git a/src/taler-coin-acceptor.c b/src/taler-coin-acceptor.c new file mode 100644 index 0000000..fde4a8a --- /dev/null +++ b/src/taler-coin-acceptor.c @@ -0,0 +1,222 @@ +/* + This file is part of TALER + Copyright (C) 2022 Taler Systems SA + + TALER is free software; you can redistribute it and/or modify it under the + terms of the GNU General Public License as published by the Free Software + Foundation; either version 3, or (at your option) any later version. + + TALER is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more +details. + + You should have received a copy of the GNU General Public License +along with + TALER; see the file COPYING. If not, see <http://www.gnu.org/licenses/> +*/ + +/** + * @brief Program to talk to the coin acceptor via USB-RS232. + * + * @author Christian Grothoff + */ +#include "config.h" +#include <stdlib.h> +#include <stdio.h> +#include <errno.h> +#include <unistd.h> +#include <arpa/inet.h> +#include <libusb-1.0/libusb.h> + +// FIXME: make this configurable later... +/* future technology devices international */ +#define VENDOR_ID 0x0403 +/* FT232 Serial UART IC */ +#define PRODUCT_ID 0x6001 + +#define USB_CTL_REQ_SET_LINE_CODING 0x20 + +#define LEO_ONE_STOP_BIT 0x00 +#define LEO_ONEHALF_STOP_BIT 0x01 +#define LEO_TWO_STOP_BIT 0x02 + +#define LEO_PARITY_NONE 0x00 +#define LEO_PARITY_ODD 0x01 +#define LEO_PARITY_EVEN 0x02 +#define LEO_PARITY_MARK 0x03 +#define LEO_PARITY_SPACE 0x04 + + +#define ACM_CTRL_DTR 0x01 +#define ACM_CTRL_RTS 0x02 + +/** + * Handle to USB device. + */ +static struct libusb_device_handle *device_handle; + +/* The Endpoint address are hard coded. You should use lsusb -v to find + * the values corresponding to your device. + */ +static int ep_in_addr = 0x83; +static int ep_out_addr = 0x02; + + +static int +read_char (void) +{ + int actual_length; + unsigned char data; + int rc; + + rc = libusb_bulk_transfer (device_handle, + ep_in_addr, + &data, + sizeof (data), + &actual_length, + 1000 /* timeout? */); + if (rc == LIBUSB_ERROR_TIMEOUT) + { + fprintf (stderr, + "TIMEOUT\n"); + return EOF; + } + if (rc < 0) + { + fprintf (stderr, + "Error %s while waiting for char\n", + libusb_error_name (rc)); + return EOF; + } + return data; +} + + +int +main (int argc, + char **argv) +{ + int rc; + + rc = libusb_init (NULL); + if (rc < 0) + { + fprintf (stderr, + "Error initializing usb: %s\n", + libusb_error_name (rc)); + return 1; + } + + libusb_set_debug (NULL, + 3); + device_handle = libusb_open_device_with_vid_pid (NULL, + VENDOR_ID, + PRODUCT_ID); + if (NULL == device_handle) + { + fprintf (stderr, + "Error finding USB device\n"); + libusb_exit (NULL); + return 1; + } + + /* Maybe there is someone else attached, detach other drivers from + all the USB interfaces. NOTE: not sure if there are *2*! */ + for (int if_num = 0; if_num < 2; if_num++) + { + if (libusb_kernel_driver_active (device_handle, + if_num)) + { + libusb_detach_kernel_driver (device_handle, + if_num); + } + rc = libusb_claim_interface (device_handle, + if_num); + if (rc < 0) + { + fprintf (stderr, + "Error claiming interface: %s\n", + libusb_error_name (rc)); + libusb_close (device_handle); + libusb_exit (NULL); + return 1; + } + } +#if 1 + rc = libusb_control_transfer (device_handle, + 0x21, + 0x22, + ACM_CTRL_DTR | ACM_CTRL_RTS, + 0, + NULL, + 0, + 0); + if (rc < 0) + { + fprintf (stderr, + "Error during control transfer: %s\n", + libusb_error_name (rc)); + libusb_close (device_handle); + libusb_exit (NULL); + return 1; + } +#endif + + /* - set line encoding: here 9600 8N1 + * 9600 = 0x2580 ~> 0x80, 0x25 in little endian + */ + { + struct LineEncodingOptions + { + /** + * In *little* endian. + */ + uint32_t baud_rate; + uint8_t b_char_format; + uint8_t b_parity_type; + uint8_t b_data_bits; + } leo = { + .baud_rate = __builtin_bswap32 (htonl (4800)), + .b_char_format = LEO_ONE_STOP_BIT, + .b_parity_type = LEO_PARITY_ODD, + .b_data_bits = 0x08 + }; + + rc = libusb_control_transfer (device_handle, + 0x21, + USB_CTL_REQ_SET_LINE_CODING, + 0, + 0, + (unsigned char *) &leo, + sizeof(leo), + 0); + if (rc < 0) + { + fprintf (stderr, + "Error during control transfer: %s\n", + libusb_error_name (rc)); + libusb_close (device_handle); + libusb_exit (NULL); + return 1; + } + } + + /* FIXME: proper event loop... */ + while (1) + { + int in = read_char (); + + if (-1 != in) + fprintf (stdout, + "Received: %d\n", + in); + } + + libusb_release_interface (device_handle, + 0); + libusb_close (device_handle); + libusb_exit (NULL); + return 0; +} diff --git a/src/main.c b/src/taler-mdb.c index f0b1529..f0b1529 100644 --- a/src/main.c +++ b/src/taler-mdb.c |