AppNearMe µNFC stack for the NXP PN532 chip License: You can use the stack free of charge to prototype with mbed; if you want to use the stack with your commercial product, get in touch!
Dependents: IOT_sensor_nfc AppNearMe_MuNFC_PN532_Test p2p_nfc_test NFCMoodLamp ... more
License
You can use the stack free of charge to prototype with mbed; if you want to use the stack with your commercial product, get in touch!
PN532/MuNFC.cpp@11:5be631376e5b, 2012-11-07 (annotated)
- Committer:
- AppNearMe
- Date:
- Wed Nov 07 18:19:09 2012 +0000
- Revision:
- 11:5be631376e5b
Updated library
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
AppNearMe | 11:5be631376e5b | 1 | /* |
AppNearMe | 11:5be631376e5b | 2 | MuNFC.cpp |
AppNearMe | 11:5be631376e5b | 3 | Copyright (c) Donatien Garnier 2012 |
AppNearMe | 11:5be631376e5b | 4 | donatien.garnier@appnearme.com |
AppNearMe | 11:5be631376e5b | 5 | http://www.appnearme.com/ |
AppNearMe | 11:5be631376e5b | 6 | */ |
AppNearMe | 11:5be631376e5b | 7 | |
AppNearMe | 11:5be631376e5b | 8 | |
AppNearMe | 11:5be631376e5b | 9 | #include "MuNFC.h" |
AppNearMe | 11:5be631376e5b | 10 | #include "MuNFCConfig.h" |
AppNearMe | 11:5be631376e5b | 11 | |
AppNearMe | 11:5be631376e5b | 12 | #include "mbed.h" |
AppNearMe | 11:5be631376e5b | 13 | #if MUNFC_RTOS |
AppNearMe | 11:5be631376e5b | 14 | #include "rtos/rtos.h" |
AppNearMe | 11:5be631376e5b | 15 | #endif |
AppNearMe | 11:5be631376e5b | 16 | |
AppNearMe | 11:5be631376e5b | 17 | #include "munfc/core/fwk.h" |
AppNearMe | 11:5be631376e5b | 18 | #include "munfc/event/transaction_event.h" |
AppNearMe | 11:5be631376e5b | 19 | #include "munfc/target/target_nfctype2.h" |
AppNearMe | 11:5be631376e5b | 20 | #include "munfc/target/target_nfctype4.h" |
AppNearMe | 11:5be631376e5b | 21 | #include "munfc/ndef/appnearme_ndef.h" |
AppNearMe | 11:5be631376e5b | 22 | #include "munfc/ndef/appnearme_ndef_tlv.h" |
AppNearMe | 11:5be631376e5b | 23 | |
AppNearMe | 11:5be631376e5b | 24 | #include <cstring> //For memcpy, strlen |
AppNearMe | 11:5be631376e5b | 25 | |
AppNearMe | 11:5be631376e5b | 26 | //TODO add handles in NFC stack to avoid ugly things like that |
AppNearMe | 11:5be631376e5b | 27 | //extern DigitalIn* nfc_irq_pin_int; |
AppNearMe | 11:5be631376e5b | 28 | extern InterruptIn* nfc_irq_pin_isr; |
AppNearMe | 11:5be631376e5b | 29 | extern DigitalOut* nfc_cs_pin; |
AppNearMe | 11:5be631376e5b | 30 | extern SPI* nfc_spi; |
AppNearMe | 11:5be631376e5b | 31 | |
AppNearMe | 11:5be631376e5b | 32 | #define SIGNAL_START 0x01 |
AppNearMe | 11:5be631376e5b | 33 | |
AppNearMe | 11:5be631376e5b | 34 | MuNFC::MuNFC(char appHash[16], uint32_t version, |
AppNearMe | 11:5be631376e5b | 35 | PinName mosi, PinName miso, PinName sclk, PinName cs, PinName isr) : |
AppNearMe | 11:5be631376e5b | 36 | /* m_irq_pin_int(isr),*/ m_irq_pin_isr(isr), m_cs_pin(cs), m_spi(mosi, miso, sclk) |
AppNearMe | 11:5be631376e5b | 37 | #if MUNFC_RTOS |
AppNearMe | 11:5be631376e5b | 38 | , m_pThread(NULL)//m_thread(MuNFC::staticCallback, (void*)this) |
AppNearMe | 11:5be631376e5b | 39 | #endif |
AppNearMe | 11:5be631376e5b | 40 | { |
AppNearMe | 11:5be631376e5b | 41 | //nfc_irq_pin_int = &m_irq_pin_int; |
AppNearMe | 11:5be631376e5b | 42 | nfc_irq_pin_isr = &m_irq_pin_isr; |
AppNearMe | 11:5be631376e5b | 43 | nfc_cs_pin = &m_cs_pin; |
AppNearMe | 11:5be631376e5b | 44 | nfc_spi = &m_spi; |
AppNearMe | 11:5be631376e5b | 45 | |
AppNearMe | 11:5be631376e5b | 46 | appnearme_ndef_init(appHash, version); |
AppNearMe | 11:5be631376e5b | 47 | m_eventCb.init(transaction_event_register_callback); |
AppNearMe | 11:5be631376e5b | 48 | m_encodeCb.init(appnearme_ndef_register_encode_callback); |
AppNearMe | 11:5be631376e5b | 49 | m_decodeCb.init(appnearme_ndef_register_decode_callback); |
AppNearMe | 11:5be631376e5b | 50 | } |
AppNearMe | 11:5be631376e5b | 51 | |
AppNearMe | 11:5be631376e5b | 52 | MuNFC::~MuNFC() |
AppNearMe | 11:5be631376e5b | 53 | { |
AppNearMe | 11:5be631376e5b | 54 | #if MUNFC_RTOS |
AppNearMe | 11:5be631376e5b | 55 | if(m_pThread != NULL) |
AppNearMe | 11:5be631376e5b | 56 | { |
AppNearMe | 11:5be631376e5b | 57 | delete m_pThread; |
AppNearMe | 11:5be631376e5b | 58 | } |
AppNearMe | 11:5be631376e5b | 59 | #endif |
AppNearMe | 11:5be631376e5b | 60 | } |
AppNearMe | 11:5be631376e5b | 61 | |
AppNearMe | 11:5be631376e5b | 62 | bool MuNFC::init() |
AppNearMe | 11:5be631376e5b | 63 | { |
AppNearMe | 11:5be631376e5b | 64 | #if MUNFC_RTOS |
AppNearMe | 11:5be631376e5b | 65 | if(m_pThread == NULL) |
AppNearMe | 11:5be631376e5b | 66 | { |
AppNearMe | 11:5be631376e5b | 67 | m_pThread = new Thread(MuNFC::staticCallback, (void*)this); |
AppNearMe | 11:5be631376e5b | 68 | } |
AppNearMe | 11:5be631376e5b | 69 | #endif |
AppNearMe | 11:5be631376e5b | 70 | |
AppNearMe | 11:5be631376e5b | 71 | #if NFC_CONTROLLER == PN512 |
AppNearMe | 11:5be631376e5b | 72 | int ret = target_nfctype2_start(); |
AppNearMe | 11:5be631376e5b | 73 | #elif NFC_CONTROLLER == PN532 |
AppNearMe | 11:5be631376e5b | 74 | int ret = target_nfctype4_start(); |
AppNearMe | 11:5be631376e5b | 75 | #endif |
AppNearMe | 11:5be631376e5b | 76 | if(ret != OK) |
AppNearMe | 11:5be631376e5b | 77 | { |
AppNearMe | 11:5be631376e5b | 78 | return false; |
AppNearMe | 11:5be631376e5b | 79 | } |
AppNearMe | 11:5be631376e5b | 80 | return true; |
AppNearMe | 11:5be631376e5b | 81 | } |
AppNearMe | 11:5be631376e5b | 82 | |
AppNearMe | 11:5be631376e5b | 83 | #if MUNFC_RTOS |
AppNearMe | 11:5be631376e5b | 84 | void MuNFC::run() |
AppNearMe | 11:5be631376e5b | 85 | { |
AppNearMe | 11:5be631376e5b | 86 | //Start NFC thread |
AppNearMe | 11:5be631376e5b | 87 | m_pThread->signal_set(SIGNAL_START); |
AppNearMe | 11:5be631376e5b | 88 | } |
AppNearMe | 11:5be631376e5b | 89 | |
AppNearMe | 11:5be631376e5b | 90 | void MuNFC::process() |
AppNearMe | 11:5be631376e5b | 91 | { |
AppNearMe | 11:5be631376e5b | 92 | Thread::signal_wait(SIGNAL_START); |
AppNearMe | 11:5be631376e5b | 93 | do |
AppNearMe | 11:5be631376e5b | 94 | { |
AppNearMe | 11:5be631376e5b | 95 | poll(-1); |
AppNearMe | 11:5be631376e5b | 96 | } while(true); |
AppNearMe | 11:5be631376e5b | 97 | } |
AppNearMe | 11:5be631376e5b | 98 | #endif |
AppNearMe | 11:5be631376e5b | 99 | |
AppNearMe | 11:5be631376e5b | 100 | void MuNFC::poll(int timeoutMs) //TODO add Timeout |
AppNearMe | 11:5be631376e5b | 101 | { |
AppNearMe | 11:5be631376e5b | 102 | #if NFC_CONTROLLER == PN512 |
AppNearMe | 11:5be631376e5b | 103 | target_nfctype2_process(); |
AppNearMe | 11:5be631376e5b | 104 | #elif NFC_CONTROLLER == PN532 |
AppNearMe | 11:5be631376e5b | 105 | target_nfctype4_process(); |
AppNearMe | 11:5be631376e5b | 106 | #endif |
AppNearMe | 11:5be631376e5b | 107 | } |
AppNearMe | 11:5be631376e5b | 108 | |
AppNearMe | 11:5be631376e5b | 109 | #if MUNFC_RTOS |
AppNearMe | 11:5be631376e5b | 110 | /*static*/ void MuNFC::staticCallback(void const* p) |
AppNearMe | 11:5be631376e5b | 111 | { |
AppNearMe | 11:5be631376e5b | 112 | ((MuNFC*)p)->process(); |
AppNearMe | 11:5be631376e5b | 113 | } |
AppNearMe | 11:5be631376e5b | 114 | #endif |