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!

Committer:
AppNearMe
Date:
Thu Aug 16 15:35:56 2012 +0000
Revision:
6:15b1c45d50d4
Parent:
3:0b949b2d3b55
Child:
8:c6c0016c5597
Fixes for LPC11U24 compatibility

Who changed what in which revision?

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