changeset 1207:db0534d5e264

build more of libfreefare Ignore-this: efb50f50a9cc9de6d8ce068cd391a6fc darcs-hash:a9f5f5687189fca481c18daccf81b5a2068c5d57
author drewp <drewp@bigasterisk.com>
date Sun, 10 Mar 2019 04:02:59 -0700
parents a9af0fa097d0
children 6ae4dd24f407
files service/rfid_pn532_py/Dockerfile.pi service/rfid_pn532_py/Dockerfile.pyfreefare.pi service/rfid_pn532_py/Dockerfile.pyfreefare.x86 service/rfid_pn532_py/build_ctypes_modules.sh service/rfid_pn532_py/makefile service/rfid_pn532_py/pyfreefare/freefare.h service/rfid_pn532_py/requirements.txt service/rfid_pn532_py/tags.py service/rfid_pn532_py/tags_test.py
diffstat 9 files changed, 156 insertions(+), 144 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/service/rfid_pn532_py/Dockerfile.pi	Sun Mar 10 04:02:59 2019 -0700
@@ -0,0 +1,18 @@
+FROM bang6:5000/base_pi
+
+
+
+
+WORKDIR /opt
+RUN apt-get install -y libnfc5 libfreefare0 libnfc-dev libfreefare-dev 
+RUN apt-get install -y python3-nose2
+COPY pyfreefare-build-pi ./pyfreefare-build
+
+COPY requirements.txt .
+RUN pip install -r requirements.txt
+
+COPY *.py *.html  ./
+
+ENV PYTHONPATH=/opt/pyfreefare-build
+EXPOSE 10012
+
--- a/service/rfid_pn532_py/Dockerfile.pyfreefare.pi	Mon Mar 04 15:18:46 2019 -0800
+++ b/service/rfid_pn532_py/Dockerfile.pyfreefare.pi	Sun Mar 10 04:02:59 2019 -0700
@@ -2,10 +2,9 @@
 
 WORKDIR /opt
 
-RUN apt-get install -y python-clang-5.0 libclang-5.0-dev
-RUN pip install ctypeslib2
+RUN apt-get install -y python-clang-5.0 libclang-5.0-dev libnfc5 libfreefare0 libnfc-dev libfreefare-dev 
+RUN pip install git+https://github.com/drewp/ctypeslib.git@enable-modules-flag
 
-RUN apt-get install -y libnfc5 libfreefare0 libnfc-dev libfreefare-dev 
 COPY build_ctypes_modules.sh ./
 
-CMD ["/opt/build_ctypes_modules.sh"]
\ No newline at end of file
+CMD ["/bin/sh", "/opt/build_ctypes_modules.sh"]
\ No newline at end of file
--- a/service/rfid_pn532_py/Dockerfile.pyfreefare.x86	Mon Mar 04 15:18:46 2019 -0800
+++ b/service/rfid_pn532_py/Dockerfile.pyfreefare.x86	Sun Mar 10 04:02:59 2019 -0700
@@ -2,11 +2,9 @@
 
 WORKDIR /opt
 
-RUN apt-get install -y python-clang-5.0 libclang-5.0-dev
-RUN pip install ctypeslib2
-
-RUN apt-get install -y libnfc5 libfreefare0 libnfc-dev libfreefare-dev 
+RUN apt-get install -y python-clang-5.0 libclang-5.0-dev libnfc5 libfreefare0 libnfc-dev libfreefare-dev 
+RUN pip install git+https://github.com/drewp/ctypeslib.git@enable-modules-flag
 
 COPY build_ctypes_modules.sh ./
 
-CMD ["/opt/build_ctypes_modules.sh"]
+CMD ["/bin/sh", "/opt/build_ctypes_modules.sh"]
--- a/service/rfid_pn532_py/build_ctypes_modules.sh	Mon Mar 04 15:18:46 2019 -0800
+++ b/service/rfid_pn532_py/build_ctypes_modules.sh	Sun Mar 10 04:02:59 2019 -0700
@@ -1,7 +1,14 @@
 #!/bin/sh
-TARGET=x86_64-Linux
-CARGS="-I/usr/include/x86_64-linux-gnu  -I/usr/lib/llvm-5.0/lib/clang/5.0.1/include -I/usr/lib/llvm-5.0/lib/"
+set -x
+proc=`uname --processor`
+if [ "$proc" = "armv7l" ]; then
+    ARCH=arm-linux-gnueabihf
+    TARGET=armv7l
+else
+    ARCH=x86_64-linux-gnu
+    TARGET=x86_64-Linux
+fi
+CARGS="-I/usr/include/${ARCH} -I/usr/lib/llvm-5.0/lib/clang/5.0.1/include -I/usr/lib/llvm-5.0/lib/"
+clang2py -o /opt/pyfreefare-build/nfc.py --target ${TARGET} --clang-args="${CARGS}" -l /usr/lib/${ARCH}/libnfc.so --comments /opt/pyfreefare/nfc.h
 
-clang2py -o /opt/pyfreefare-build/nfc.py --target ${TARGET} --clang-args="${CARGS}" -l /usr/lib/x86_64-linux-gnu/libnfc.so -c /opt/pyfreefare/nfc.h
-
-clang2py -o /opt/pyfreefare-build/freefare.py --target ${TARGET} --clang-args="${CARGS}" -l /usr/lib/x86_64-linux-gnu/libfreefare.so -c /opt/pyfreefare/freefare.h
+PYTHONPATH=/opt/pyfreefare-build clang2py -o /opt/pyfreefare-build/freefare.py --target ${TARGET} --clang-args="${CARGS}" -l /usr/lib/${ARCH}/libfreefare.so --comments --module nfc /opt/pyfreefare/freefare.h
--- a/service/rfid_pn532_py/makefile	Mon Mar 04 15:18:46 2019 -0800
+++ b/service/rfid_pn532_py/makefile	Sun Mar 10 04:02:59 2019 -0700
@@ -1,16 +1,25 @@
- 
-pyfreefare_build_image_x86: Dockerfile.pyfreefare.x86
+pyfreefare-build-x86/nfc.py: Dockerfile.pyfreefare.x86 pyfreefare/nfc.h pyfreefare/freefare.h build_ctypes_modules.sh
 	docker build --file Dockerfile.pyfreefare.x86 -t pyfreefare_build_x86:latest .
-
-pyfreefare_build_image_pi: Dockerfile.pyfreefare.pi
-	docker build --file Dockerfile.pyfreefare.pi -t pyfreefare_build_pi:latest .
-
-pyfreefare-build-x86/nfc.py: pyfreefare_build_image_x86 pyfreefare/nfc.h pyfreefare/freefare.h
 	docker run --rm --net=host \
           -v `pwd`/pyfreefare:/opt/pyfreefare \
           -v `pwd`/pyfreefare-build-x86:/opt/pyfreefare-build \
           --name pyfreefare_build pyfreefare_build_x86:latest
 
+pyfreefare-build-pi/nfc.py: Dockerfile.pyfreefare.pi pyfreefare/nfc.h pyfreefare/freefare.h build_ctypes_modules.sh
+	docker build --file Dockerfile.pyfreefare.pi -t pyfreefare_build_pi:latest .
+	docker run --rm --net=host \
+          -v `pwd`/pyfreefare:/opt/pyfreefare \
+          -v `pwd`/pyfreefare-build-pi:/opt/pyfreefare-build \
+          --name pyfreefare_build pyfreefare_build_pi:latest
+
 #pyfreefare/nfc.py pyfreefare/freefare.py
 test_tags: tags.py tags_test.py 
-	PYTHONPATH=pyfreefare nose2-3 tags_test
+	PYTHONPATH=pyfreefare-build-x86 nose2-3 tags_test
+
+
+rfid_build_image_pi: pyfreefare-build-pi/nfc.py pyfreefare-build-pi/freefare.py
+	docker build --file Dockerfile.pi -t bang6:5000/rfid_pn532_py_pi:latest .
+	docker push bang6:5000/rfid_pn532_py_pi:latest
+
+# test on pi:
+# docker pull bang6:5000/rfid_pn532_py_pi:latest && docker run -it --rm --privileged --name rfid_shell bang6:5000/rfid_pn532_py_pi:latest nose2-3 tags_test
--- a/service/rfid_pn532_py/pyfreefare/freefare.h	Mon Mar 04 15:18:46 2019 -0800
+++ b/service/rfid_pn532_py/pyfreefare/freefare.h	Sun Mar 10 04:02:59 2019 -0700
@@ -46,20 +46,20 @@
 FreefareTag	*freefare_get_tags(nfc_device *device);
 FreefareTag	 freefare_tag_new(nfc_device *device, nfc_target target);
 freefare_tag_type freefare_get_tag_type(FreefareTag tag);
-  // const char	*freefare_get_tag_friendly_name(FreefareTag tag);
-  // char		*freefare_get_tag_uid(FreefareTag tag);
-  // void		 freefare_free_tag(FreefareTag tag);
-  // void		 freefare_free_tags(FreefareTag *tags);
-  // bool		 freefare_selected_tag_is_present(nfc_device *device);
-  // 
-  // const char	*freefare_strerror(FreefareTag tag);
-  // int		 freefare_strerror_r(FreefareTag tag, char *buffer, size_t len);
-  // void		 freefare_perror(FreefareTag tag, const char *string);
-  // 
-  // 
-  // 
+const char	*freefare_get_tag_friendly_name(FreefareTag tag);
+char		*freefare_get_tag_uid(FreefareTag tag);
+void		 freefare_free_tag(FreefareTag tag);
+void		 freefare_free_tags(FreefareTag *tags);
+bool		 freefare_selected_tag_is_present(nfc_device *device);
+
+const char	*freefare_strerror(FreefareTag tag);
+int		 freefare_strerror_r(FreefareTag tag, char *buffer, size_t len);
+void		 freefare_perror(FreefareTag tag, const char *string);
+
+
+
   // bool		 felica_taste(nfc_device *device, nfc_target target);
-  // 
+
   // #define FELICA_SC_RW 0x0009
 // #define FELICA_SC_RO 0x000b
 // 
@@ -152,67 +152,67 @@
 // FreefareTag      mifare_mini_tag_new(nfc_device *device, nfc_target target);
 // FreefareTag	 mifare_classic1k_tag_new(nfc_device *device, nfc_target target);
 // FreefareTag	 mifare_classic4k_tag_new(nfc_device *device, nfc_target target);
-// void		 mifare_classic_tag_free(FreefareTag tag);
-// 
-// typedef unsigned char MifareClassicBlock[16];
-// 
-// typedef uint8_t MifareClassicSectorNumber;
-// typedef unsigned char MifareClassicBlockNumber;
-// 
-// typedef enum { MFC_KEY_A, MFC_KEY_B } MifareClassicKeyType;
-// typedef unsigned char MifareClassicKey[6];
-// 
-// /* NFC Forum public key */
-// extern const MifareClassicKey mifare_classic_nfcforum_public_key_a;
-// 
-// int		 mifare_classic_connect(FreefareTag tag);
-// int		 mifare_classic_disconnect(FreefareTag tag);
-// 
-// int		 mifare_classic_authenticate(FreefareTag tag, const MifareClassicBlockNumber block, const MifareClassicKey key, const MifareClassicKeyType key_type);
-// int		 mifare_classic_read(FreefareTag tag, const MifareClassicBlockNumber block, MifareClassicBlock *data);
-// int		 mifare_classic_init_value(FreefareTag tag, const MifareClassicBlockNumber block, const int32_t value, const MifareClassicBlockNumber adr);
-// int		 mifare_classic_read_value(FreefareTag tag, const MifareClassicBlockNumber block, int32_t *value, MifareClassicBlockNumber *adr);
-// int		 mifare_classic_write(FreefareTag tag, const MifareClassicBlockNumber block, const MifareClassicBlock data);
-// 
-// int		 mifare_classic_increment(FreefareTag tag, const MifareClassicBlockNumber block, const uint32_t amount);
-// int		 mifare_classic_decrement(FreefareTag tag, const MifareClassicBlockNumber block, const uint32_t amount);
-// int		 mifare_classic_restore(FreefareTag tag, const MifareClassicBlockNumber block);
-// int		 mifare_classic_transfer(FreefareTag tag, const MifareClassicBlockNumber block);
-// 
-// int		 mifare_classic_get_trailer_block_permission(FreefareTag tag, const MifareClassicBlockNumber block, const uint16_t permission, const MifareClassicKeyType key_type);
-// int		 mifare_classic_get_data_block_permission(FreefareTag tag, const MifareClassicBlockNumber block, const unsigned char permission, const MifareClassicKeyType key_type);
+void		 mifare_classic_tag_free(FreefareTag tag);
 // 
-// int		 mifare_classic_format_sector(FreefareTag tag, const MifareClassicSectorNumber sector);
-// 
-// void		 mifare_classic_trailer_block(MifareClassicBlock *block, const MifareClassicKey key_a, uint8_t ab_0, uint8_t ab_1, uint8_t ab_2, uint8_t ab_tb, const uint8_t gpb, const MifareClassicKey key_b);
-// 
-// MifareClassicSectorNumber mifare_classic_block_sector(MifareClassicBlockNumber block);
-// MifareClassicBlockNumber  mifare_classic_sector_first_block(MifareClassicSectorNumber sector);
-// size_t		 mifare_classic_sector_block_count(MifareClassicSectorNumber sector);
-// MifareClassicBlockNumber  mifare_classic_sector_last_block(MifareClassicSectorNumber sector);
-// 
-// #define C_000 0
-// #define C_001 1
-// #define C_010 2
-// #define C_011 3
-// #define C_100 4
-// #define C_101 5
-// #define C_110 6
-// #define C_111 7
-// #define C_DEFAULT 255
-// 
-// /* MIFARE Classic Access Bits */
-// #define MCAB_R 0x8
-// #define MCAB_W 0x4
-// #define MCAB_D 0x2
-// #define MCAB_I 0x1
-// 
-// #define MCAB_READ_KEYA         0x400
-// #define MCAB_WRITE_KEYA        0x100
-// #define MCAB_READ_ACCESS_BITS  0x040
-// #define MCAB_WRITE_ACCESS_BITS 0x010
-// #define MCAB_READ_KEYB         0x004
-// #define MCAB_WRITE_KEYB        0x001
+typedef unsigned char MifareClassicBlock[16];
+
+typedef uint8_t MifareClassicSectorNumber;
+typedef unsigned char MifareClassicBlockNumber;
+
+typedef enum { MFC_KEY_A, MFC_KEY_B } MifareClassicKeyType;
+typedef unsigned char MifareClassicKey[6];
+
+/* NFC Forum public key */
+extern const MifareClassicKey mifare_classic_nfcforum_public_key_a;
+
+int		 mifare_classic_connect(FreefareTag tag);
+int		 mifare_classic_disconnect(FreefareTag tag);
+
+int		 mifare_classic_authenticate(FreefareTag tag, const MifareClassicBlockNumber block, const MifareClassicKey key, const MifareClassicKeyType key_type);
+int		 mifare_classic_read(FreefareTag tag, const MifareClassicBlockNumber block, MifareClassicBlock *data);
+int		 mifare_classic_init_value(FreefareTag tag, const MifareClassicBlockNumber block, const int32_t value, const MifareClassicBlockNumber adr);
+int		 mifare_classic_read_value(FreefareTag tag, const MifareClassicBlockNumber block, int32_t *value, MifareClassicBlockNumber *adr);
+int		 mifare_classic_write(FreefareTag tag, const MifareClassicBlockNumber block, const MifareClassicBlock data);
+
+int		 mifare_classic_increment(FreefareTag tag, const MifareClassicBlockNumber block, const uint32_t amount);
+int		 mifare_classic_decrement(FreefareTag tag, const MifareClassicBlockNumber block, const uint32_t amount);
+int		 mifare_classic_restore(FreefareTag tag, const MifareClassicBlockNumber block);
+int		 mifare_classic_transfer(FreefareTag tag, const MifareClassicBlockNumber block);
+
+int		 mifare_classic_get_trailer_block_permission(FreefareTag tag, const MifareClassicBlockNumber block, const uint16_t permission, const MifareClassicKeyType key_type);
+int		 mifare_classic_get_data_block_permission(FreefareTag tag, const MifareClassicBlockNumber block, const unsigned char permission, const MifareClassicKeyType key_type);
+
+int		 mifare_classic_format_sector(FreefareTag tag, const MifareClassicSectorNumber sector);
+
+void		 mifare_classic_trailer_block(MifareClassicBlock *block, const MifareClassicKey key_a, uint8_t ab_0, uint8_t ab_1, uint8_t ab_2, uint8_t ab_tb, const uint8_t gpb, const MifareClassicKey key_b);
+
+MifareClassicSectorNumber mifare_classic_block_sector(MifareClassicBlockNumber block);
+MifareClassicBlockNumber  mifare_classic_sector_first_block(MifareClassicSectorNumber sector);
+size_t		 mifare_classic_sector_block_count(MifareClassicSectorNumber sector);
+MifareClassicBlockNumber  mifare_classic_sector_last_block(MifareClassicSectorNumber sector);
+
+#define C_000 0
+#define C_001 1
+#define C_010 2
+#define C_011 3
+#define C_100 4
+#define C_101 5
+#define C_110 6
+#define C_111 7
+#define C_DEFAULT 255
+
+/* MIFARE Classic Access Bits */
+#define MCAB_R 0x8
+#define MCAB_W 0x4
+#define MCAB_D 0x2
+#define MCAB_I 0x1
+
+#define MCAB_READ_KEYA         0x400
+#define MCAB_WRITE_KEYA        0x100
+#define MCAB_READ_ACCESS_BITS  0x040
+#define MCAB_WRITE_ACCESS_BITS 0x010
+#define MCAB_READ_KEYB         0x004
+#define MCAB_WRITE_KEYB        0x001
 // 
 // struct mad_aid {
 //     uint8_t application_code;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/service/rfid_pn532_py/requirements.txt	Sun Mar 10 04:02:59 2019 -0700
@@ -0,0 +1,1 @@
+
--- a/service/rfid_pn532_py/tags.py	Mon Mar 04 15:18:46 2019 -0800
+++ b/service/rfid_pn532_py/tags.py	Sun Mar 10 04:02:59 2019 -0700
@@ -1,3 +1,4 @@
+import time
 from ctypes import pointer, byref
 import nfc, freefare
 import logging
@@ -17,7 +18,9 @@
         print(f'{devices_found} connection strings')
         for i in range(devices_found):
             print(f'  dev {i}: {conn_strings[i]}')
-
+        if devices_found < 1:
+            raise IOError("no devices")
+            
         print("open dev")
         self.dev = nfc.nfc_open(self.context, conn_strings[0])
         if nfc.nfc_device_get_last_error(self.dev):
@@ -27,46 +30,19 @@
         if self.dev:
             nfc.nfc_close(self.dev)
         nfc.nfc_exit(self.context)
-'''
 
     def getTags(self):
         log.info("getting tags")
         t0 = time.time()
         ret = freefare.freefare_get_tags(self.dev)
-        if not ret: raise IOError("freefare_get_tags returned null")
-        log.info(f"found tags in {time.time() - t0}")
-        return ret
-
-    # freefare lib wants to free all the tag memory, so process them in a
-    # callback and don't keep them outside that.
-    def forAllTags(self, onTag: (NfcTag) -> None):
-        ret = self.getTags()
-        for tagp in ret:
-          if isNil(tagp):
-            break
-          if cast[int](tagp) < 10:
-            # pointer value looks wrong
-            break
-  
-          let tag: FreefareTag = tagp[]
-          if isNil(tag):
-            break
-          onTag(NfcTag(tag: tag))
-        freefare.freefare_free_tags(ret)
-
-def blockFromString(s: str):
-    result = MifareClassicBlock()
-    for i in 0..result.high:
-      if i < s.len:
-        result[i] = s[i]
-      else:
-        result[i] = '\x00'
-    return result
-  
-proc stringFromBlock(b: MifareClassicBlock) -> string
-  return ''.join(b)#cast[array[16,char]](b).join
-  
-type TagArray {.unchecked.} = array[999, ptr FreefareTag]
+        if not ret:
+            raise IOError("freefare_get_tags returned null")
+        try:
+            log.info(f"found tags in {time.time() - t0}")
+            for t in ret:
+                yield NfcTag(t)
+        finally:
+            freefare.freefare_free_tags(ret)
 
 pubkey = ['\xff', '\xff', '\xff', '\xff', '\xff', '\xff']
 
@@ -78,7 +54,7 @@
     def __init__(self, tag): #FreefareTag
         self.tag = tag
 
-    def tagType(self): freefare.freefare_tag_type =
+    def tagType(self) -> freefare.freefare_tag_type:
         return freefare.freefare_get_tag_type(self.tag)
 
     def uid(self):
@@ -90,27 +66,26 @@
     def disconnect(self):
         check(freefare.mifare_classic_disconnect(self.tag), "disconnect")
 
-    def readBlock(self, blockNumber: int) -> string:
-      blockNum = cast[freefare.MifareClassicBlockNumber](blockNumber)
+    def readBlock(self, blockNumber: int) -> str:
+      blockNum = freefare.MifareClassicBlockNumber(blockNumber)
       check(freefare.mifare_classic_authenticate(
         self.tag, blockNum, pubkey, freefare.MFC_KEY_A),
-            &"mifare_classic_authenticate() failed")
+            "mifare_classic_authenticate() failed")
 
-      var data: freefare.MifareClassicBlock
+      data = freefare.MifareClassicBlock()
 
-      check(mifare_classic_read(self.tag, blockNum, addr data),
+      check(freefare.mifare_classic_read(self.tag, blockNum, pointer(data)),
             "classic_read() failed")
-      return toString(data)
+      return data
 
     def writeBlock(self,
                     blockNumber: int,
-                    data: freefare.MifareClassicBlock) =
-      var blocknum = cast[freefare.MifareClassicBlockNumber](blockNumber)
+                    data: freefare.MifareClassicBlock):
+      blocknum = freefare.MifareClassicBlockNumber(blockNumber)
       check(freefare.mifare_classic_authenticate(
         self.tag, blocknum, pubkey, freefare.MFC_KEY_A),
-            &"mifare_classic_authenticate() failed")
+            "mifare_classic_authenticate() failed")
 
-      check(mifare_classic_write(self.tag, blocknum, data),
+      check(freefare.mifare_classic_write(self.tag, blocknum, data),
             "classic_write() failed")
-      log.info(&"  wrote block {blocknum}: {data}")
-'''
+      log.info("  wrote block {blocknum}: {data}")
--- a/service/rfid_pn532_py/tags_test.py	Mon Mar 04 15:18:46 2019 -0800
+++ b/service/rfid_pn532_py/tags_test.py	Sun Mar 10 04:02:59 2019 -0700
@@ -1,8 +1,13 @@
 import unittest
 import tags
+import os
+os.environ['LIBNFC_DEFAULT_DEVICE'] = "pn532_i2c:/dev/i2c-1"
 
 class TestNfc(unittest.TestCase):
     def test_open_close(self):
         n = tags.NfcDevice()
         del n
         
+    def test_get_tags(self):
+        n = tags.NfcDevice()
+        print(n.getTags())