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 Jul 26 10:02:19 2012 +0000
Revision:
2:913eb8fdfd9d
Parent:
0:480387549d89
Child:
3:0b949b2d3b55
NFC Thread is now dynamically allocated for mbed-rtos compatibility

Who changed what in which revision?

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