From 4a9b557695d2414be2043f9ec61b1842608790db Mon Sep 17 00:00:00 2001 From: Gabriele Barola Date: Fri, 28 Mar 2025 12:03:01 +0100 Subject: [PATCH 1/8] added encoding and iso lang to text write --- src/libNDEF/NDEF_class.h | 2 +- src/libNDEF/lib_NDEF_Text.cpp | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/libNDEF/NDEF_class.h b/src/libNDEF/NDEF_class.h index 021b2a0..04fb8b4 100755 --- a/src/libNDEF/NDEF_class.h +++ b/src/libNDEF/NDEF_class.h @@ -115,7 +115,7 @@ class NDEF { void NDEF_PrepareSMSMessage(sSMSInfo *pSMSStruct, uint8_t *pNDEFMessage, uint16_t *size); //lib_NDEF_Text - uint16_t NDEF_WriteText(char *text); + uint16_t NDEF_WriteText(NDEF_Text_info_t *text_info); uint16_t NDEF_ReadText(sRecordInfo_t *pRecordStruct, NDEF_Text_info_t *pText); //lib_NDEF_URI diff --git a/src/libNDEF/lib_NDEF_Text.cpp b/src/libNDEF/lib_NDEF_Text.cpp index 37e793a..84a4023 100755 --- a/src/libNDEF/lib_NDEF_Text.cpp +++ b/src/libNDEF/lib_NDEF_Text.cpp @@ -60,7 +60,7 @@ /** * @brief This function write the text in the TAG. - * @param text : text to write. + * @param text_info: text_info struct containing text, lang and encoding * @retval NDEF_OK : NDEF file data written in the tag. * @retval NDEF_ERROR : not able to store NDEF in tag. * @retval NDEF_ERROR_MEMORY_INTERNAL : Cannot write to tag. @@ -68,17 +68,18 @@ * @retval NDEF_ERROR_MEMORY_TAG : Size not compatible with memory. * @retval NDEF_ERROR_LOCKED : Tag locked, cannot be write. */ -uint16_t NDEF::NDEF_WriteText(char *text) +uint16_t NDEF::NDEF_WriteText(NDEF_Text_info_t *text_info) { uint16_t status = NDEF_ERROR; uint32_t textSize, Offset = 0; + if(strlen(text_info->language_code) > 10) return status; /* TEXT : 1+en+message */ - textSize = 3 + strlen(text); + textSize = 1 + strlen(text_info->language_code) + strlen(text_info->text); /* TEXT header */ - NDEF_Buffer[Offset] = 0xD1; + NDEF_Buffer[Offset] = 0xC1; if (textSize < 256) { NDEF_Buffer[Offset] |= 0x10; // Set the SR bit } @@ -97,12 +98,13 @@ uint16_t NDEF::NDEF_WriteText(char *text) Offset += TEXT_TYPE_STRING_LENGTH; /* TEXT payload */ - NDEF_Buffer[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; - memcpy(&NDEF_Buffer[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); - Offset += ISO_ENGLISH_CODE_STRING_LENGTH; + NDEF_Buffer[Offset++] = strlen(text_info->language_code) | text_info->encoding << 7; - memcpy(&NDEF_Buffer[Offset], text, strlen(text)); - Offset += strlen(text); + memcpy(&NDEF_Buffer[Offset], text_info->language_code, strlen(text_info->language_code)); + Offset += strlen(text_info->language_code); + + memcpy(&NDEF_Buffer[Offset], text_info->text, strlen(text_info->text)); + Offset += strlen(text_info->text); status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); From 04091fb76b4780ba093b458533f8566768b361ec Mon Sep 17 00:00:00 2001 From: Gabriele Barola Date: Wed, 2 Apr 2025 09:57:54 +0200 Subject: [PATCH 2/8] corrected wrong wifi auth enum --- src/libNDEF/lib_NDEF_Wifi.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/libNDEF/lib_NDEF_Wifi.h b/src/libNDEF/lib_NDEF_Wifi.h index 1c2b281..71f2dd6 100755 --- a/src/libNDEF/lib_NDEF_Wifi.h +++ b/src/libNDEF/lib_NDEF_Wifi.h @@ -70,19 +70,19 @@ #define NDEF_WIFI_DEFAULT_NETWORK_KEY "00000000" typedef enum { - NDEF_WIFI_ENCRYPTION_NONE = 0x0000, /**< WPS No Encryption (set to 0 for Android native support / should be 1) */ + NDEF_WIFI_ENCRYPTION_NONE = 0x0001, /**< WPS No Encryption */ NDEF_WIFI_ENCRYPTION_WEP = 0x0002, /**< WPS Encryption based on WEP */ - NDEF_WIFI_ENCRYPTION_TKIP = 0x0003, /**< WPS Encryption based on TKIP */ - NDEF_WIFI_ENCRYPTION_AES = 0x0004 /**< WPS Encryption based on AES */ + NDEF_WIFI_ENCRYPTION_TKIP = 0x0004, /**< WPS Encryption based on TKIP */ + NDEF_WIFI_ENCRYPTION_AES = 0x0008 /**< WPS Encryption based on AES */ } Ndef_Wifi_Encryption_t; typedef enum { - NDEF_WIFI_AUTHENTICATION_NONE = 0x0000, /**< WPS No Authentication (set to 0 for Android native support / should be 1) */ + NDEF_WIFI_AUTHENTICATION_NONE = 0x0001, /**< WPS No Authentication */ NDEF_WIFI_AUTHENTICATION_WPAPSK = 0x0002, /**< WPS Authentication based on WPAPSK */ - NDEF_WIFI_AUTHENTICATION_SHARED = 0x0003, /**< WPS Authentication based on ?? */ - NDEF_WIFI_AUTHENTICATION_WPA = 0x0004, /**< WPS Authentication based on WPA */ - NDEF_WIFI_AUTHENTICATION_WPA2 = 0x0005, /**< WPS Authentication based on WPA2 */ - NDEF_WIFI_AUTHENTICATION_WPA2PSK = 0x0006 /**< WPS Authentication based on WPA2PSK */ + NDEF_WIFI_AUTHENTICATION_SHARED = 0x0004, /**< WPS Authentication based on WEP Shared Key */ + NDEF_WIFI_AUTHENTICATION_WPA = 0x0008, /**< WPS Authentication based on WPA */ + NDEF_WIFI_AUTHENTICATION_WPA2 = 0x0010, /**< WPS Authentication based on WPA2 */ + NDEF_WIFI_AUTHENTICATION_WPA2PSK = 0x0020 /**< WPS Authentication based on WPA2PSK */ } Ndef_Wifi_Authentication_t; /** From d6fa258517bb4a1135d9eac0d3aff43d3ad19b88 Mon Sep 17 00:00:00 2001 From: Gabriele Barola Date: Wed, 2 Apr 2025 11:58:07 +0200 Subject: [PATCH 3/8] exported wifi, vcard, text, bluetooth, myApp, AAR to sensor class --- keywords.txt | 9 +++ library.properties | 2 +- src/ST25DVSensor.cpp | 102 +++++++++++++++++++++++++++++++++ src/ST25DVSensor.h | 9 +++ src/libNDEF/NDEF_class.h | 4 +- src/libNDEF/lib_NDEF.h | 2 +- src/libNDEF/lib_NDEF_Vcard.cpp | 4 +- src/libNDEF/lib_NDEF_Wifi.cpp | 2 +- 8 files changed, 127 insertions(+), 7 deletions(-) diff --git a/keywords.txt b/keywords.txt index 6213079..728511f 100644 --- a/keywords.txt +++ b/keywords.txt @@ -23,6 +23,15 @@ writeGEO KEYWORD2 readGEO KEYWORD2 writeEMail KEYWORD2 readEMail KEYWORD2 +writeWifi KEYWORD2 +readWifi KEYWORD2 +writeVcard KEYWORD2 +readVcard KEYWORD2 +appendAAR KEYWORD2 +appendBluetoothOOB KEYWORD2 +writeMyApp KEYWORD2 +writeText KEYWORD2 +readText KEYWORD2 ####################################### # Constants (LITERAL1) diff --git a/library.properties b/library.properties index d663ff6..eea58a9 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=STM32duino ST25DV -version=2.1.2 +version=2.2.2 author=STMicroelectronics maintainer=stm32duino sentence=Allows controlling the NFC ST25DV diff --git a/src/ST25DVSensor.cpp b/src/ST25DVSensor.cpp index e124098..398595d 100755 --- a/src/ST25DVSensor.cpp +++ b/src/ST25DVSensor.cpp @@ -52,6 +52,38 @@ int ST25DV::begin(uint8_t *buffer, uint16_t bufferLength) return NFCTAG_OK; }; +int ST25DV::writeText(String text, String iso_lang, NDEF_Text_encoding_t encoding) +{ + NDEF_Text_info_t text_info; + + + strcpy(text_info.text, text.c_str()); + strcpy(text_info.language_code, iso_lang.c_str()); + text_info.encoding = encoding; + + return ndef.NDEF_WriteText(&text_info); +} + +int ST25DV::readText(String *text) +{ + uint16_t ret; + NDEF_Text_info_t info; + sRecordInfo_t recordInfo; + + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } + + ret = ndef.NDEF_ReadText(&recordInfo, &info); + if (ret) { + return ret; + } + *text = String(info.text); + + return 0; +} + int ST25DV::writeURI(String protocol, String uri, String info) { sURI_Info _URI; @@ -273,6 +305,76 @@ int ST25DV::readEMail(String *emailAdd, String *subject, String *message) return NDEF_OK; } +/** + * @brief Writes a WIFI record + * + * @param SSID + * @param auth: authentication type + * @param enc: Encryption type + * @param key + * @retval success or failure + */ +int ST25DV::writeWifi(String SSID, Ndef_Wifi_Authentication_t auth, Ndef_Wifi_Encryption_t enc, String key){ + sWifiTokenInfo _wifi; + + strncpy(_wifi.NetworkSSID, SSID.c_str(), 32); + strncpy(_wifi.NetworkKey, key.c_str(), 32); + + _wifi.AuthenticationType = auth; + _wifi.EncryptionType = enc; + + return ndef.NDEF_WriteWifiToken(&_wifi); +} + +int ST25DV::readWifi(sWifiTokenInfo *wifitoken){ + uint16_t ret; + sRecordInfo_t recordInfo; + + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } + + return ndef.NDEF_ReadWifiToken(&recordInfo, wifitoken); + +} + +int ST25DV::writeVcard(sVcardInfo vcard){ + + return ndef.NDEF_WriteVcard(&vcard); +} + +int ST25DV::readVcard(sVcardInfo *vcard){ + uint16_t ret; + sRecordInfo_t recordInfo; + + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } + + return ndef.NDEF_ReadVcard(&recordInfo, vcard); + +} + +int ST25DV::appendAAR(String pkgName) +{ + sAARInfo _info; + strncpy(_info.PackageName, pkgName.c_str(), 80); + + return ndef.NDEF_AddAAR(&_info); +} + +int ST25DV::appendBluetoothOOB(Ndef_Bluetooth_OOB_t bluetooth, char *recordId) +{ + return ndef.NDEF_AppendBluetoothOOB(&bluetooth, recordId); +} + +int ST25DV::writeMyApp(sMyAppInfo *pMyAppStruct) +{ + return ndef.NDEF_WriteMyApp(pMyAppStruct); +} + /** * @brief reads the type of NDEF on the tag * @param None diff --git a/src/ST25DVSensor.h b/src/ST25DVSensor.h index bf6300c..de367d5 100755 --- a/src/ST25DVSensor.h +++ b/src/ST25DVSensor.h @@ -38,6 +38,8 @@ class ST25DV { int begin(uint8_t *buffer, uint16_t bufferLength); int writeURI(String protocol, String uri, String info); int readURI(String *s); + int writeText(String text, String iso_lang, NDEF_Text_encoding_t encoding); + int readText(String *text); int writeUnabridgedURI(String uri, String info); int readUnabridgedURI(String *s); int writeSMS(String phoneNumber, String message, String info); @@ -46,6 +48,13 @@ class ST25DV { int readGEO(String *latitude, String *longitude); int writeEMail(String emailAdd, String subject, String message, String info); int readEMail(String *emailAdd, String *subject, String *message); + int writeWifi(String SSID, Ndef_Wifi_Authentication_t auth, Ndef_Wifi_Encryption_t enc, String key); + int readWifi(sWifiTokenInfo *wifitoken); + int writeVcard(sVcardInfo vcard); + int readVcard(sVcardInfo *vcard); + int appendAAR(String pkgName); + int appendBluetoothOOB(Ndef_Bluetooth_OOB_t bluetooth, char *recordId); + int writeMyApp(sMyAppInfo *pMyAppStruct); NDEF_TypeDef readNDEFType(); NDEF *getNDEF(); diff --git a/src/libNDEF/NDEF_class.h b/src/libNDEF/NDEF_class.h index 04fb8b4..de4b0f4 100755 --- a/src/libNDEF/NDEF_class.h +++ b/src/libNDEF/NDEF_class.h @@ -131,7 +131,7 @@ class NDEF { int NDEF_getVcardPicture(uint8_t *pPayload, uint32_t PayloadSize, uint8_t *pPict); //lib_NDEF_Wifi - uint16_t NDEF_ReadWifiToken(struct sRecordInfo *pRecordStruct, sWifiTokenInfo *pWifiTokenStruct); + uint16_t NDEF_ReadWifiToken(sRecordInfo *pRecordStruct, sWifiTokenInfo *pWifiTokenStruct); uint16_t NDEF_WriteWifiToken(sWifiTokenInfo *pWifiTokenStruct); //lib_wrapper @@ -180,7 +180,7 @@ class NDEF { //Vcard static - void NDEF_FillVcardStruct(uint8_t *pPayload, uint32_t PayloadSize, char *pKeyWord, uint32_t SizeOfKeyWord, uint8_t *pString); + void NDEF_FillVcardStruct(uint8_t *pPayload, uint32_t PayloadSize, const char *pKeyWord, uint32_t SizeOfKeyWord, uint8_t *pString); void NDEF_ExtractVcard(sRecordInfo_t *pRecordStruct, sVcardInfo *pVcardStruct); //Wifi static diff --git a/src/libNDEF/lib_NDEF.h b/src/libNDEF/lib_NDEF.h index 4e46045..fb04791 100755 --- a/src/libNDEF/lib_NDEF.h +++ b/src/libNDEF/lib_NDEF.h @@ -53,7 +53,7 @@ //#define NDEF_MAX_SIZE NFC_DEVICE_MAX_NDEFMEMORY //#define NDEF_RECORD_MAX_SIZE (512) -#define NDEF_MAX_SIZE (100) +#define NDEF_MAX_SIZE (512) #define NDEF_RECORD_MAX_SIZE (100) #define NDEF_SIZE_OFFSET 0 diff --git a/src/libNDEF/lib_NDEF_Vcard.cpp b/src/libNDEF/lib_NDEF_Vcard.cpp index b4d242b..756c559 100755 --- a/src/libNDEF/lib_NDEF_Vcard.cpp +++ b/src/libNDEF/lib_NDEF_Vcard.cpp @@ -50,7 +50,7 @@ * @param SizeOfKeyWord Number of bytes of the vCard property keyword we are looking for. * @param pString Pointer on a string used to return the vCard property read. */ -void NDEF_FillVcardStruct(uint8_t *pPayload, uint32_t PayloadSize, const char *pKeyWord, uint32_t SizeOfKeyWord, uint8_t *pString) +void NDEF::NDEF_FillVcardStruct(uint8_t *pPayload, uint32_t PayloadSize, const char *pKeyWord, uint32_t SizeOfKeyWord, uint8_t *pString) { uint8_t *pLastByteAdd, *pLook4Word, *pEndString; @@ -90,7 +90,7 @@ void NDEF_FillVcardStruct(uint8_t *pPayload, uint32_t PayloadSize, const char *p * @param pRecordStruct Pointer on the vCard record structure. * @param pVcardStruct Pointer on the `sCardInfo` structure to fill. */ -void NDEF_ExtractVcard(sRecordInfo_t *pRecordStruct, sVcardInfo *pVcardStruct) +void NDEF::NDEF_ExtractVcard(sRecordInfo_t *pRecordStruct, sVcardInfo *pVcardStruct) { uint32_t PayloadSize; uint8_t *pPayload; diff --git a/src/libNDEF/lib_NDEF_Wifi.cpp b/src/libNDEF/lib_NDEF_Wifi.cpp index 99d42f2..edc0ea8 100755 --- a/src/libNDEF/lib_NDEF_Wifi.cpp +++ b/src/libNDEF/lib_NDEF_Wifi.cpp @@ -314,7 +314,7 @@ uint16_t NDEF::NDEF_WriteWifiToken(sWifiTokenInfo *pWifiTokenStruct) strcpy((char *)pPayload, pWifiTokenStruct->NetworkSSID); pPayload = pPayload + strlen(pWifiTokenStruct->NetworkSSID); - for (initStage = 0; initStage < CONFIG_TOKEN_3; initStage++) { + for (initStage = 0; initStage < CONFIG_TOKEN_3; initStage++) { *pPayload = configToken3[initStage]; pPayload++; } From ea1f859075d508a369fa1636ad43be387c30cde8 Mon Sep 17 00:00:00 2001 From: Gabriele Barola Date: Wed, 2 Apr 2025 15:12:46 +0200 Subject: [PATCH 4/8] adding custom config for hardcoded values, fix for issue #35 --- src/libNDEF/default_config.h | 30 ++++++++++++++++++++++++++++++ src/libNDEF/lib_NDEF.h | 12 +++++++----- src/libNDEF/lib_NDEF_Geo.h | 6 +++--- src/libNDEF/lib_NDEF_SMS.h | 6 +++--- src/libNDEF/lib_NDEF_Text.cpp | 4 ++-- src/libNDEF/lib_NDEF_Text.h | 9 ++------- src/libNDEF/lib_NDEF_URI.h | 6 +++--- 7 files changed, 50 insertions(+), 23 deletions(-) create mode 100644 src/libNDEF/default_config.h diff --git a/src/libNDEF/default_config.h b/src/libNDEF/default_config.h new file mode 100644 index 0000000..a69c826 --- /dev/null +++ b/src/libNDEF/default_config.h @@ -0,0 +1,30 @@ + +#ifndef _DEFAULT_CONFIG_H_ +#define _DEFAULT_CONFIG_H_ + + +#define NDEF_MAX_SIZE (512) +#define NDEF_RECORD_MAX_SIZE (100) + +#define URI_PROTOCOL_MAX_SIZE (20) +#define URI_MESSAGE_MAX_SIZE (100) +#define URI_INFO_MAX_SIZE (20) + + +#define TEXT_MAX_SIZE (100) +#define TEXT_LANGUAGE_CODE_MAX_SIZE (10) + +#define SMS_PHONE_MAX_SIZE (16) +#define SMS_MESSAGE_MAX_SIZE (400) +#define SMS_INFO_MAX_SIZE (400) + +#define GEO_LATITUDE_MAX_SIZE (20) +#define GEO_LONGITUDE_MAX_SIZE (20) +#define GEO_INFO_MAX_SIZE (100) + +#define EMAIL_ADDRESS_MAX_SIZE (64) +#define EMAIL_SUBJECT_MAX_SIZE (100) +#define EMAIL_MESSAGE_MAX_SIZE (2000) +#define EMAIL_INFO_MAX_SIZE (400) + +#endif \ No newline at end of file diff --git a/src/libNDEF/lib_NDEF.h b/src/libNDEF/lib_NDEF.h index fb04791..c86ab39 100755 --- a/src/libNDEF/lib_NDEF.h +++ b/src/libNDEF/lib_NDEF.h @@ -43,6 +43,13 @@ {goto Error;} else #endif +#if __has_include("custom_config.h") + #include "custom_config.h" +#else + #include "default_config.h" +#endif + + /* Error codes for Higher level */ #define NDEF_OK RESULTOK #define NDEF_ERROR ERRORCODE_GENERIC @@ -51,11 +58,6 @@ #define NDEF_ERROR_LOCKED 4 #define NDEF_ERROR_NOT_FORMATED 5 -//#define NDEF_MAX_SIZE NFC_DEVICE_MAX_NDEFMEMORY -//#define NDEF_RECORD_MAX_SIZE (512) -#define NDEF_MAX_SIZE (512) -#define NDEF_RECORD_MAX_SIZE (100) - #define NDEF_SIZE_OFFSET 0 #define FIRST_RECORD_OFFSET 0 diff --git a/src/libNDEF/lib_NDEF_Geo.h b/src/libNDEF/lib_NDEF_Geo.h index c9df757..2ba6569 100755 --- a/src/libNDEF/lib_NDEF_Geo.h +++ b/src/libNDEF/lib_NDEF_Geo.h @@ -35,9 +35,9 @@ #include "lib_NDEF.h" typedef struct { - char Latitude[20]; - char Longitude[20]; - char Information[100]; + char Latitude[GEO_LATITUDE_MAX_SIZE]; + char Longitude[GEO_LONGITUDE_MAX_SIZE]; + char Information[GEO_INFO_MAX_SIZE]; } sGeoInfo; #endif /* __LIB_NDEF_GEO_H */ diff --git a/src/libNDEF/lib_NDEF_SMS.h b/src/libNDEF/lib_NDEF_SMS.h index da6e781..2b86ef7 100755 --- a/src/libNDEF/lib_NDEF_SMS.h +++ b/src/libNDEF/lib_NDEF_SMS.h @@ -36,9 +36,9 @@ typedef struct { - char PhoneNumber[16]; - char Message[400]; - char Information[400]; + char PhoneNumber[SMS_PHONE_MAX_SIZE]; + char Message[SMS_MESSAGE_MAX_SIZE]; + char Information[SMS_INFO_MAX_SIZE]; } sSMSInfo; #endif /* __LIB_NDEF_SMS_H */ diff --git a/src/libNDEF/lib_NDEF_Text.cpp b/src/libNDEF/lib_NDEF_Text.cpp index 84a4023..afbe7fd 100755 --- a/src/libNDEF/lib_NDEF_Text.cpp +++ b/src/libNDEF/lib_NDEF_Text.cpp @@ -132,8 +132,8 @@ uint16_t NDEF::NDEF_ReadText(sRecordInfo_t *pRecordStruct, NDEF_Text_info_t *pTe - text_record_info->language_length /* minus language code length */ - sizeof(uint8_t); /* minus the status byte length */ - if ((text_record_info->language_length >= NDEF_TEXT_LANGUAGE_CODE_MAX_LENGTH) || - (text_length >= NDEF_TEXT_MAX_LENGTH)) { + if ((text_record_info->language_length >= TEXT_LANGUAGE_CODE_MAX_SIZE) || + (text_length >= TEXT_MAX_SIZE)) { /* One of the text info structure buffer is too small */ return NDEF_ERROR_MEMORY_INTERNAL; } diff --git a/src/libNDEF/lib_NDEF_Text.h b/src/libNDEF/lib_NDEF_Text.h index c19ae58..74d6e64 100755 --- a/src/libNDEF/lib_NDEF_Text.h +++ b/src/libNDEF/lib_NDEF_Text.h @@ -34,11 +34,6 @@ /* Includes ------------------------------------------------------------------*/ #include "lib_NDEF.h" -/** @brief NDEF Text buffer length. */ -#define NDEF_TEXT_MAX_LENGTH 40 -/** @brief NDEF Language code buffer length. */ -#define NDEF_TEXT_LANGUAGE_CODE_MAX_LENGTH 10 - /** @brief NDEF Text encoding possible values. */ typedef enum { NDEF_TEXT_UTF8 = 0, @@ -48,8 +43,8 @@ typedef enum { /** @brief This structure is used to handle information from a NDEF Text record. */ typedef struct { NDEF_Text_encoding_t encoding; /**< metadata: UTF-8 / UTF-16. */ - char language_code[NDEF_TEXT_LANGUAGE_CODE_MAX_LENGTH]; /**< metadata: Language code as specified by IANA. */ - char text[NDEF_TEXT_MAX_LENGTH]; /**< The text itself. */ + char language_code[TEXT_LANGUAGE_CODE_MAX_SIZE]; /**< metadata: Language code as specified by IANA. */ + char text[TEXT_MAX_SIZE]; /**< The text itself. */ } NDEF_Text_info_t; diff --git a/src/libNDEF/lib_NDEF_URI.h b/src/libNDEF/lib_NDEF_URI.h index 61b6c1d..245eae0 100755 --- a/src/libNDEF/lib_NDEF_URI.h +++ b/src/libNDEF/lib_NDEF_URI.h @@ -38,9 +38,9 @@ typedef struct { // char protocol[80]; // char URI_Message[400]; // char Information[400]; - char protocol[20]; - char URI_Message[100]; - char Information[20]; + char protocol[URI_PROTOCOL_MAX_SIZE]; + char URI_Message[URI_MESSAGE_MAX_SIZE]; + char Information[URI_INFO_MAX_SIZE]; } sURI_Info; #endif /* __LIB_NDEF_URI_H */ From c9ff8ac437e55eb6b571fe8c7f03facd60323b45 Mon Sep 17 00:00:00 2001 From: Gabriele Barola Date: Wed, 2 Apr 2025 15:24:22 +0200 Subject: [PATCH 5/8] astyle format --- src/ST25DVSensor.cpp | 450 +++---- src/ST25DVSensor.h | 8 +- src/ST25DV_IO/st25dv_io.cpp | 2000 ++++++++++++++-------------- src/ST25DV_IO/st25dv_io.h | 172 +-- src/libNDEF/NDEF_class.h | 36 +- src/libNDEF/NDEFcommon.h | 18 +- src/libNDEF/lib_NDEF.cpp | 764 +++++------ src/libNDEF/lib_NDEF.h | 58 +- src/libNDEF/lib_NDEF_AAR.cpp | 84 +- src/libNDEF/lib_NDEF_AAR.h | 2 +- src/libNDEF/lib_NDEF_Bluetooth.cpp | 750 +++++------ src/libNDEF/lib_NDEF_Bluetooth.h | 148 +- src/libNDEF/lib_NDEF_Email.cpp | 486 +++---- src/libNDEF/lib_NDEF_Email.h | 16 +- src/libNDEF/lib_NDEF_Geo.cpp | 380 +++--- src/libNDEF/lib_NDEF_Geo.h | 6 +- src/libNDEF/lib_NDEF_Handover.cpp | 508 +++---- src/libNDEF/lib_NDEF_Handover.h | 36 +- src/libNDEF/lib_NDEF_MyApp.cpp | 280 ++-- src/libNDEF/lib_NDEF_MyApp.h | 16 +- src/libNDEF/lib_NDEF_SMS.cpp | 400 +++--- src/libNDEF/lib_NDEF_SMS.h | 6 +- src/libNDEF/lib_NDEF_Text.cpp | 114 +- src/libNDEF/lib_NDEF_Text.h | 18 +- src/libNDEF/lib_NDEF_URI.cpp | 696 +++++----- src/libNDEF/lib_NDEF_URI.h | 12 +- src/libNDEF/lib_NDEF_Vcard.cpp | 832 ++++++------ src/libNDEF/lib_NDEF_Vcard.h | 32 +- src/libNDEF/lib_NDEF_Wifi.cpp | 370 ++--- src/libNDEF/lib_NDEF_Wifi.h | 28 +- src/libNDEF/tagtype5_wrapper.cpp | 504 +++---- src/libNDEF/tagtype5_wrapper.h | 6 +- 32 files changed, 4620 insertions(+), 4616 deletions(-) diff --git a/src/ST25DVSensor.cpp b/src/ST25DVSensor.cpp index 398595d..857318c 100755 --- a/src/ST25DVSensor.cpp +++ b/src/ST25DVSensor.cpp @@ -21,104 +21,104 @@ int ST25DV::begin() { - return begin(NULL, 0); + return begin(NULL, 0); } int ST25DV::begin(uint8_t *buffer, uint16_t bufferLength) { - uint8_t nfctag_id = 0; - - if (!NfctagInitialized) { - /* ST25DV Init */ - if (ST25DV_Init() != NFCTAG_OK) { - return NFCTAG_ERROR; - } - - /* Check ST25DV driver ID */ - st25dv_io.ST25DV_i2c_ReadID(&nfctag_id); - - if ((nfctag_id == I_AM_ST25DV04) || (nfctag_id == I_AM_ST25DV64) || - (nfctag_id == I_AM_ST25DV04KC) || (nfctag_id == I_AM_ST25DV64KC)) { - NfctagInitialized = 1; - } else { - return NFCTAG_ERROR; - } - - int ret = ndef.begin(buffer, bufferLength); - if (ret != NDEF_OK) { - return ret; + uint8_t nfctag_id = 0; + + if (!NfctagInitialized) { + /* ST25DV Init */ + if (ST25DV_Init() != NFCTAG_OK) { + return NFCTAG_ERROR; + } + + /* Check ST25DV driver ID */ + st25dv_io.ST25DV_i2c_ReadID(&nfctag_id); + + if ((nfctag_id == I_AM_ST25DV04) || (nfctag_id == I_AM_ST25DV64) || + (nfctag_id == I_AM_ST25DV04KC) || (nfctag_id == I_AM_ST25DV64KC)) { + NfctagInitialized = 1; + } else { + return NFCTAG_ERROR; + } + + int ret = ndef.begin(buffer, bufferLength); + if (ret != NDEF_OK) { + return ret; + } } - } - return NFCTAG_OK; + return NFCTAG_OK; }; int ST25DV::writeText(String text, String iso_lang, NDEF_Text_encoding_t encoding) { - NDEF_Text_info_t text_info; + NDEF_Text_info_t text_info; - strcpy(text_info.text, text.c_str()); - strcpy(text_info.language_code, iso_lang.c_str()); - text_info.encoding = encoding; + strcpy(text_info.text, text.c_str()); + strcpy(text_info.language_code, iso_lang.c_str()); + text_info.encoding = encoding; - return ndef.NDEF_WriteText(&text_info); + return ndef.NDEF_WriteText(&text_info); } int ST25DV::readText(String *text) { - uint16_t ret; - NDEF_Text_info_t info; - sRecordInfo_t recordInfo; - - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } - - ret = ndef.NDEF_ReadText(&recordInfo, &info); - if (ret) { - return ret; - } - *text = String(info.text); - - return 0; + uint16_t ret; + NDEF_Text_info_t info; + sRecordInfo_t recordInfo; + + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } + + ret = ndef.NDEF_ReadText(&recordInfo, &info); + if (ret) { + return ret; + } + *text = String(info.text); + + return 0; } int ST25DV::writeURI(String protocol, String uri, String info) { - sURI_Info _URI; + sURI_Info _URI; - // Unabridged protocols must be written using - // `writeUnabridgedURI()` - if (protocol.equals("")) { - return NDEF_ERROR; - } + // Unabridged protocols must be written using + // `writeUnabridgedURI()` + if (protocol.equals("")) { + return NDEF_ERROR; + } - strcpy(_URI.protocol, protocol.c_str()); - strcpy(_URI.URI_Message, uri.c_str()); - strcpy(_URI.Information, info.c_str()); + strcpy(_URI.protocol, protocol.c_str()); + strcpy(_URI.URI_Message, uri.c_str()); + strcpy(_URI.Information, info.c_str()); - return ndef.NDEF_WriteURI(&_URI); + return ndef.NDEF_WriteURI(&_URI); } int ST25DV::readURI(String *s) { - uint16_t ret; - sURI_Info uri = {"", "", ""}; - sRecordInfo_t recordInfo; - - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } - - ret = ndef.NDEF_ReadURI(&recordInfo, &uri); - if (ret) { - return ret; - } - *s = String(uri.protocol) + String(uri.URI_Message); - - return 0; + uint16_t ret; + sURI_Info uri = {"", "", ""}; + sRecordInfo_t recordInfo; + + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } + + ret = ndef.NDEF_ReadURI(&recordInfo, &uri); + if (ret) { + return ret; + } + *s = String(uri.protocol) + String(uri.URI_Message); + + return 0; } /* @@ -133,13 +133,13 @@ int ST25DV::readURI(String *s) */ int ST25DV::writeUnabridgedURI(String uri, String info) { - sURI_Info _URI; + sURI_Info _URI; - strcpy(_URI.protocol, ""); - strcpy(_URI.URI_Message, uri.c_str()); - strcpy(_URI.Information, info.c_str()); + strcpy(_URI.protocol, ""); + strcpy(_URI.URI_Message, uri.c_str()); + strcpy(_URI.Information, info.c_str()); - return ndef.NDEF_WriteURI(&_URI); + return ndef.NDEF_WriteURI(&_URI); } /* @@ -149,28 +149,28 @@ int ST25DV::writeUnabridgedURI(String uri, String info) */ int ST25DV::readUnabridgedURI(String *s) { - uint16_t ret; - sURI_Info uri = {"", "", ""}; - sRecordInfo_t recordInfo; + uint16_t ret; + sURI_Info uri = {"", "", ""}; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } - ret = ndef.NDEF_ReadURI(&recordInfo, &uri); - if (ret) { - return ret; - } + ret = ndef.NDEF_ReadURI(&recordInfo, &uri); + if (ret) { + return ret; + } - // If the URI is abbreviated return error - if (strncmp("", uri.protocol, 1) != 0) { - return ret; //NDEF_ERROR; - } + // If the URI is abbreviated return error + if (strncmp("", uri.protocol, 1) != 0) { + return ret; //NDEF_ERROR; + } - *s = String(uri.URI_Message); + *s = String(uri.URI_Message); - return 0; + return 0; } /* @@ -183,13 +183,13 @@ int ST25DV::readUnabridgedURI(String *s) */ int ST25DV::writeSMS(String phoneNumber, String message, String info) { - sSMSInfo _SMS; + sSMSInfo _SMS; - strncpy(_SMS.PhoneNumber, phoneNumber.c_str(), 16); - strncpy(_SMS.Message, message.c_str(), 400); - strncpy(_SMS.Information, info.c_str(), 400); + strncpy(_SMS.PhoneNumber, phoneNumber.c_str(), 16); + strncpy(_SMS.Message, message.c_str(), 400); + strncpy(_SMS.Information, info.c_str(), 400); - return ndef.NDEF_WriteSMS(&_SMS); + return ndef.NDEF_WriteSMS(&_SMS); } /* @@ -201,24 +201,24 @@ int ST25DV::writeSMS(String phoneNumber, String message, String info) */ int ST25DV::readSMS(String *phoneNumber, String *message) { - uint16_t ret; - sSMSInfo _SMS; - sRecordInfo_t recordInfo; + uint16_t ret; + sSMSInfo _SMS; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } - ret = ndef.NDEF_ReadSMS(&recordInfo, &_SMS); - if (ret) { - return ret; - } + ret = ndef.NDEF_ReadSMS(&recordInfo, &_SMS); + if (ret) { + return ret; + } - *phoneNumber = String(_SMS.PhoneNumber); - *message = String(_SMS.Message); + *phoneNumber = String(_SMS.PhoneNumber); + *message = String(_SMS.Message); - return NDEF_OK; + return NDEF_OK; } /* @@ -231,13 +231,13 @@ int ST25DV::readSMS(String *phoneNumber, String *message) */ int ST25DV::writeGEO(String latitude, String longitude, String info) { - sGeoInfo _GEO; + sGeoInfo _GEO; - strncpy(_GEO.Latitude, latitude.c_str(), 20); - strncpy(_GEO.Longitude, longitude.c_str(), 20); - strncpy(_GEO.Information, info.c_str(), 100); + strncpy(_GEO.Latitude, latitude.c_str(), 20); + strncpy(_GEO.Longitude, longitude.c_str(), 20); + strncpy(_GEO.Information, info.c_str(), 100); - return ndef.NDEF_WriteGeo(&_GEO); + return ndef.NDEF_WriteGeo(&_GEO); } /* @@ -249,63 +249,63 @@ int ST25DV::writeGEO(String latitude, String longitude, String info) */ int ST25DV::readGEO(String *latitude, String *longitude) { - uint16_t ret; - sGeoInfo _GEO; - sRecordInfo_t recordInfo; + uint16_t ret; + sGeoInfo _GEO; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } - ret = ndef.NDEF_ReadGeo(&recordInfo, &_GEO); - if (ret) { - return ret; - } + ret = ndef.NDEF_ReadGeo(&recordInfo, &_GEO); + if (ret) { + return ret; + } - *latitude = String(_GEO.Latitude); - *longitude = String(_GEO.Longitude); + *latitude = String(_GEO.Latitude); + *longitude = String(_GEO.Longitude); - return NDEF_OK; + return NDEF_OK; } int ST25DV::writeEMail(String emailAdd, String subject, String message, String info) { - sEmailInfo _EMAIL; + sEmailInfo _EMAIL; - strncpy(_EMAIL.EmailAdd, emailAdd.c_str(), 64); - strncpy(_EMAIL.Subject, subject.c_str(), 100); - strncpy(_EMAIL.Message, message.c_str(), 2000); - strncpy(_EMAIL.Information, info.c_str(), 400); + strncpy(_EMAIL.EmailAdd, emailAdd.c_str(), 64); + strncpy(_EMAIL.Subject, subject.c_str(), 100); + strncpy(_EMAIL.Message, message.c_str(), 2000); + strncpy(_EMAIL.Information, info.c_str(), 400); - return ndef.NDEF_WriteEmail(&_EMAIL); + return ndef.NDEF_WriteEmail(&_EMAIL); } int ST25DV::readEMail(String *emailAdd, String *subject, String *message) { - uint16_t ret; - sEmailInfo _EMAIL; - sRecordInfo_t recordInfo; + uint16_t ret; + sEmailInfo _EMAIL; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } - ret = ndef.NDEF_ReadEmail(&recordInfo, &_EMAIL); - if (ret) { - return ret; - } + ret = ndef.NDEF_ReadEmail(&recordInfo, &_EMAIL); + if (ret) { + return ret; + } - *emailAdd = String(_EMAIL.EmailAdd); - *subject = String(_EMAIL.Subject); - *message = String(_EMAIL.Message); + *emailAdd = String(_EMAIL.EmailAdd); + *subject = String(_EMAIL.Subject); + *message = String(_EMAIL.Message); - return NDEF_OK; + return NDEF_OK; } -/** +/** * @brief Writes a WIFI record * * @param SSID @@ -314,47 +314,47 @@ int ST25DV::readEMail(String *emailAdd, String *subject, String *message) * @param key * @retval success or failure */ -int ST25DV::writeWifi(String SSID, Ndef_Wifi_Authentication_t auth, Ndef_Wifi_Encryption_t enc, String key){ - sWifiTokenInfo _wifi; +int ST25DV::writeWifi(String SSID, Ndef_Wifi_Authentication_t auth, Ndef_Wifi_Encryption_t enc, String key) { + sWifiTokenInfo _wifi; + + strncpy(_wifi.NetworkSSID, SSID.c_str(), 32); + strncpy(_wifi.NetworkKey, key.c_str(), 32); - strncpy(_wifi.NetworkSSID, SSID.c_str(), 32); - strncpy(_wifi.NetworkKey, key.c_str(), 32); - - _wifi.AuthenticationType = auth; - _wifi.EncryptionType = enc; + _wifi.AuthenticationType = auth; + _wifi.EncryptionType = enc; - return ndef.NDEF_WriteWifiToken(&_wifi); + return ndef.NDEF_WriteWifiToken(&_wifi); } -int ST25DV::readWifi(sWifiTokenInfo *wifitoken){ - uint16_t ret; - sRecordInfo_t recordInfo; +int ST25DV::readWifi(sWifiTokenInfo *wifitoken) { + uint16_t ret; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } + + return ndef.NDEF_ReadWifiToken(&recordInfo, wifitoken); - return ndef.NDEF_ReadWifiToken(&recordInfo, wifitoken); - } -int ST25DV::writeVcard(sVcardInfo vcard){ +int ST25DV::writeVcard(sVcardInfo vcard) { - return ndef.NDEF_WriteVcard(&vcard); + return ndef.NDEF_WriteVcard(&vcard); } -int ST25DV::readVcard(sVcardInfo *vcard){ - uint16_t ret; - sRecordInfo_t recordInfo; +int ST25DV::readVcard(sVcardInfo *vcard) { + uint16_t ret; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } + + return ndef.NDEF_ReadVcard(&recordInfo, vcard); - return ndef.NDEF_ReadVcard(&recordInfo, vcard); - } int ST25DV::appendAAR(String pkgName) @@ -382,15 +382,15 @@ int ST25DV::writeMyApp(sMyAppInfo *pMyAppStruct) */ NDEF_TypeDef ST25DV::readNDEFType(void) { - uint16_t ret; - sRecordInfo_t recordInfo; + uint16_t ret; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return UNKNOWN_TYPE; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return UNKNOWN_TYPE; + } - return recordInfo.NDEF_Type; + return recordInfo.NDEF_Type; } /** @@ -400,7 +400,7 @@ NDEF_TypeDef ST25DV::readNDEFType(void) */ NDEF *ST25DV::getNDEF(void) { - return &ndef; + return &ndef; } /** @@ -410,17 +410,17 @@ NDEF *ST25DV::getNDEF(void) */ NFCTAG_StatusTypeDef ST25DV::ST25DV_Init(void) { - if (st25dv_io.get_pwire() == NULL) { - return NFCTAG_ERROR; - } + if (st25dv_io.get_pwire() == NULL) { + return NFCTAG_ERROR; + } - ST25DV_GPO_Init(); - ST25DV_LPD_Init(); + ST25DV_GPO_Init(); + ST25DV_LPD_Init(); - ST25DV_I2C_Init(); - ST25DV_SelectI2cSpeed(3); + ST25DV_I2C_Init(); + ST25DV_SelectI2cSpeed(3); - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -430,7 +430,7 @@ NFCTAG_StatusTypeDef ST25DV::ST25DV_Init(void) */ void ST25DV::ST25DV_GPO_Init(void) { - pinMode(st25dv_io.get_gpo(), INPUT); + pinMode(st25dv_io.get_gpo(), INPUT); } /** @@ -440,7 +440,7 @@ void ST25DV::ST25DV_GPO_Init(void) */ uint8_t ST25DV::ST25DV_GPO_ReadPin(void) { - return digitalRead(st25dv_io.get_gpo()); + return digitalRead(st25dv_io.get_gpo()); } /** @@ -450,10 +450,10 @@ uint8_t ST25DV::ST25DV_GPO_ReadPin(void) */ void ST25DV::ST25DV_LPD_Init(void) { - if (st25dv_io.get_lpd() > 0) { - pinMode(st25dv_io.get_lpd(), OUTPUT); - digitalWrite(st25dv_io.get_lpd(), LOW); - } + if (st25dv_io.get_lpd() > 0) { + pinMode(st25dv_io.get_lpd(), OUTPUT); + digitalWrite(st25dv_io.get_lpd(), LOW); + } } /** @@ -472,7 +472,7 @@ void ST25DV::ST25DV_LPD_DeInit(void) */ uint8_t ST25DV::ST25DV_LPD_ReadPin(void) { - return digitalRead(st25dv_io.get_lpd()); + return digitalRead(st25dv_io.get_lpd()); } /** @@ -482,7 +482,7 @@ uint8_t ST25DV::ST25DV_LPD_ReadPin(void) */ void ST25DV::ST25DV_LPD_WritePin(uint8_t LpdPinState) { - digitalWrite(st25dv_io.get_lpd(), LpdPinState); + digitalWrite(st25dv_io.get_lpd(), LpdPinState); } /** @@ -492,47 +492,47 @@ void ST25DV::ST25DV_LPD_WritePin(uint8_t LpdPinState) */ void ST25DV::ST25DV_SelectI2cSpeed(uint8_t i2cspeedchoice) { - if (st25dv_io.get_pwire() == NULL) { - return; - } + if (st25dv_io.get_pwire() == NULL) { + return; + } #if !defined(ARDUINO_ARCH_ARC) && !defined(ARDUINO_ARCH_ARC32) - switch (i2cspeedchoice) { + switch (i2cspeedchoice) { case 0: - st25dv_io.get_pwire()->setClock(10000); - break; + st25dv_io.get_pwire()->setClock(10000); + break; case 1: - st25dv_io.get_pwire()->setClock(100000); - break; + st25dv_io.get_pwire()->setClock(100000); + break; case 2: - st25dv_io.get_pwire()->setClock(200000); - break; + st25dv_io.get_pwire()->setClock(200000); + break; case 3: - st25dv_io.get_pwire()->setClock(400000); - break; + st25dv_io.get_pwire()->setClock(400000); + break; case 4: - st25dv_io.get_pwire()->setClock(800000); - break; + st25dv_io.get_pwire()->setClock(800000); + break; case 5: - st25dv_io.get_pwire()->setClock(1000000); - break; + st25dv_io.get_pwire()->setClock(1000000); + break; default: - st25dv_io.get_pwire()->setClock(1000000); - break; - } + st25dv_io.get_pwire()->setClock(1000000); + break; + } } /** @@ -542,7 +542,7 @@ void ST25DV::ST25DV_SelectI2cSpeed(uint8_t i2cspeedchoice) */ void ST25DV::ST25DV_I2C_Init(void) { - st25dv_io.get_pwire()->begin(); + st25dv_io.get_pwire()->begin(); } #endif diff --git a/src/ST25DVSensor.h b/src/ST25DVSensor.h index de367d5..e3496f1 100755 --- a/src/ST25DVSensor.h +++ b/src/ST25DVSensor.h @@ -25,13 +25,13 @@ #include "libNDEF/NDEF_class.h" #if defined(ARDUINO_SAM_DUE) - #define WIRE Wire1 +#define WIRE Wire1 #else - #define WIRE Wire +#define WIRE Wire #endif class ST25DV { - public: +public: ST25DV(int32_t gpo, int32_t lpd, TwoWire *i2c, Stream *serial = NULL) : st25dv_io(gpo, lpd, i2c, serial), ndef(&st25dv_io) {} int begin(); @@ -58,7 +58,7 @@ class ST25DV { NDEF_TypeDef readNDEFType(); NDEF *getNDEF(); - protected: +protected: NFCTAG_StatusTypeDef ST25DV_Init(void); void ST25DV_GPO_Init(void); void ST25DV_GPO_DeInit(void); diff --git a/src/ST25DV_IO/st25dv_io.cpp b/src/ST25DV_IO/st25dv_io.cpp index cb7d6d7..6941e82 100644 --- a/src/ST25DV_IO/st25dv_io.cpp +++ b/src/ST25DV_IO/st25dv_io.cpp @@ -23,10 +23,10 @@ ST25DV_IO::ST25DV_IO(int32_t gpo, int32_t lpd, TwoWire *i2c, Stream *serial) { - _gpo = gpo; - _lpd = lpd; - _pwire = i2c; - _serial = serial; + _gpo = gpo; + _lpd = lpd; + _pwire = i2c; + _serial = serial; } /******************************** LINK EEPROM COMPONENT *****************************/ @@ -42,68 +42,68 @@ ST25DV_IO::ST25DV_IO(int32_t gpo, int32_t lpd, TwoWire *i2c, Stream *serial) NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_MemWrite(const uint8_t *const pData, const uint8_t DevAddr, const uint16_t TarAddr, const uint16_t Size) { - NFCTAG_StatusTypeDef pollstatus; - byte ret; - uint32_t tickstart; - uint8_t Addr = DevAddr >> 1; - char tmp[4]; - - if (_pwire == NULL) { - return NFCTAG_ERROR; - } - - if (_serial != NULL) { - // _serial->println(SP); - _serial->print(" w "); - sprintf(tmp, "%02X", Addr); - _serial->print(tmp); - _serial->print("@"); - sprintf(tmp, "%02X", TarAddr >> 8); - _serial->print(tmp); - sprintf(tmp, "%02X", TarAddr & 0xFF); - _serial->print(tmp); - _serial->print(":"); - _serial->println(Size); - _serial->print(" "); - for (uint16_t d = 0; d < Size; d++) { - sprintf(tmp, "%02X", pData[d]); - _serial->print(tmp); - } - _serial->println(""); - } - - _pwire->beginTransmission(Addr); // transmit to device - _pwire->write(TarAddr >> 8); // send memory address MSB - _pwire->write(TarAddr & 0xFF); // send memory address LSB - _pwire->write(pData, Size); // sends bytes - ret = _pwire->endTransmission(true); // stop transmitting - if (_serial != NULL) { - _serial->print(" ="); - _serial->println(ret); - } - - if (ret == 0) { - /* Poll until EEPROM is available */ - tickstart = millis(); - /* Wait until ST25DV is ready or timeout occurs */ - do { - pollstatus = ST25DV_IO_IsDeviceReady(DevAddr, 1); - } while (((millis() - tickstart) < ST25DV_I2C_TIMEOUT) && (pollstatus != NFCTAG_OK)); + NFCTAG_StatusTypeDef pollstatus; + byte ret; + uint32_t tickstart; + uint8_t Addr = DevAddr >> 1; + char tmp[4]; - if (pollstatus != NFCTAG_OK) { - return NFCTAG_TIMEOUT; + if (_pwire == NULL) { + return NFCTAG_ERROR; } - } -#if defined(ARDUINO_ARCH_ARC) || defined(ARDUINO_ARCH_ARC32) - // Arduino 101 i2c seems buggy after an address NACK: restart the i2c - else if (ret == 2) { + + if (_serial != NULL) { + // _serial->println(SP); + _serial->print(" w "); + sprintf(tmp, "%02X", Addr); + _serial->print(tmp); + _serial->print("@"); + sprintf(tmp, "%02X", TarAddr >> 8); + _serial->print(tmp); + sprintf(tmp, "%02X", TarAddr & 0xFF); + _serial->print(tmp); + _serial->print(":"); + _serial->println(Size); + _serial->print(" "); + for (uint16_t d = 0; d < Size; d++) { + sprintf(tmp, "%02X", pData[d]); + _serial->print(tmp); + } + _serial->println(""); + } + + _pwire->beginTransmission(Addr); // transmit to device + _pwire->write(TarAddr >> 8); // send memory address MSB + _pwire->write(TarAddr & 0xFF); // send memory address LSB + _pwire->write(pData, Size); // sends bytes + ret = _pwire->endTransmission(true); // stop transmitting if (_serial != NULL) { - _serial->print(" -\n"); + _serial->print(" ="); + _serial->println(ret); + } + + if (ret == 0) { + /* Poll until EEPROM is available */ + tickstart = millis(); + /* Wait until ST25DV is ready or timeout occurs */ + do { + pollstatus = ST25DV_IO_IsDeviceReady(DevAddr, 1); + } while (((millis() - tickstart) < ST25DV_I2C_TIMEOUT) && (pollstatus != NFCTAG_OK)); + + if (pollstatus != NFCTAG_OK) { + return NFCTAG_TIMEOUT; + } + } +#if defined(ARDUINO_ARCH_ARC) || defined(ARDUINO_ARCH_ARC32) + // Arduino 101 i2c seems buggy after an address NACK: restart the i2c + else if (ret == 2) { + if (_serial != NULL) { + _serial->print(" -\n"); + } + _pwire->begin(); } - _pwire->begin(); - } #endif - return NFCTAG_ConvertStatus(ret); + return NFCTAG_ConvertStatus(ret); } /** @@ -116,80 +116,80 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_MemWrite(const uint8_t *const pData, c */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_MemRead(uint8_t *const pData, const uint8_t DevAddr, const uint16_t TarAddr, const uint16_t Size) { - int i = 0; - uint8_t ret = 4; - uint8_t Addr = DevAddr >> 1; - char tmp[4]; - - if (_pwire == NULL) { - return NFCTAG_ERROR; - } - - if (_serial != NULL) { - // _serial->println(SP); - _serial->print(" r "); - sprintf(tmp, "%02X", Addr); - _serial->print(tmp); - _serial->print("@"); - sprintf(tmp, "%02X", TarAddr >> 8); - _serial->print(tmp); - sprintf(tmp, "%02X", TarAddr & 0xFF); - _serial->print(tmp); - _serial->print(":"); - _serial->println(Size); - } - _pwire->beginTransmission(Addr); // Get the slave's attention, tell it we're sending a command byte - _pwire->write(TarAddr >> 8); // The command byte, sets pointer to register with address of 0x32 - _pwire->write(TarAddr & 0xFF); // The command byte, sets pointer to register with address of 0x32 - ret = _pwire->endTransmission(true); - // Address is not OK - if (ret != 0) { + int i = 0; + uint8_t ret = 4; + uint8_t Addr = DevAddr >> 1; + char tmp[4]; + + if (_pwire == NULL) { + return NFCTAG_ERROR; + } + + if (_serial != NULL) { + // _serial->println(SP); + _serial->print(" r "); + sprintf(tmp, "%02X", Addr); + _serial->print(tmp); + _serial->print("@"); + sprintf(tmp, "%02X", TarAddr >> 8); + _serial->print(tmp); + sprintf(tmp, "%02X", TarAddr & 0xFF); + _serial->print(tmp); + _serial->print(":"); + _serial->println(Size); + } + _pwire->beginTransmission(Addr); // Get the slave's attention, tell it we're sending a command byte + _pwire->write(TarAddr >> 8); // The command byte, sets pointer to register with address of 0x32 + _pwire->write(TarAddr & 0xFF); // The command byte, sets pointer to register with address of 0x32 + ret = _pwire->endTransmission(true); + // Address is not OK + if (ret != 0) { + return NFCTAG_ConvertStatus(ret); + } + + // be carefully with the (int)Size, the size parameter us no more on 16 bits but only 15 bits (the cast is required for arduino UNO) + _pwire->requestFrom((int)Addr, (int)Size); // Tell slave we need to read 1byte from the current register + + + while (_pwire->available()) { + pData[i++] = _pwire->read(); // read that byte into 'slaveByte2' variable + } + if (_serial != NULL) { + _serial->print(" "); + for (int d = 0; d < i; d++) { + sprintf(tmp, "%02X", pData[d]); + _serial->print(tmp); + } + _serial->println(""); + } + + /* + It doesn't seem like Arduino wants you to call `endTransmission` + after `requestFrom`. On the ESP32 the ret value is 8 because it + is an `endTransmission` without a `startTransmission` which is + considered an error by the library. + */ + // ret = _pwire->endTransmission(); + // if (_serial != NULL) { + // // _serial->println(pData[0]); + // _serial->print(" ="); + // _serial->println(ret); + // // _serial->print(" "); + // // _serial->println(pData[0]); + // // _serial->println((uint32_t)pData); + // } return NFCTAG_ConvertStatus(ret); - } - - // be carefully with the (int)Size, the size parameter us no more on 16 bits but only 15 bits (the cast is required for arduino UNO) - _pwire->requestFrom((int)Addr, (int)Size); // Tell slave we need to read 1byte from the current register - - - while (_pwire->available()) { - pData[i++] = _pwire->read(); // read that byte into 'slaveByte2' variable - } - if (_serial != NULL) { - _serial->print(" "); - for (int d = 0; d < i; d++) { - sprintf(tmp, "%02X", pData[d]); - _serial->print(tmp); - } - _serial->println(""); - } - - /* - It doesn't seem like Arduino wants you to call `endTransmission` - after `requestFrom`. On the ESP32 the ret value is 8 because it - is an `endTransmission` without a `startTransmission` which is - considered an error by the library. - */ - // ret = _pwire->endTransmission(); - // if (_serial != NULL) { - // // _serial->println(pData[0]); - // _serial->print(" ="); - // _serial->println(ret); - // // _serial->print(" "); - // // _serial->println(pData[0]); - // // _serial->println((uint32_t)pData); - // } - return NFCTAG_ConvertStatus(ret); } NFCTAG_StatusTypeDef ST25DV_IO::NFCTAG_ConvertStatus(uint8_t ret) { - if (ret == 0) { - return NFCTAG_OK; - } else if ((ret == 2) || (ret == 3)) { - return NFCTAG_NACK; - } else { - return NFCTAG_ERROR; - } + if (ret == 0) { + return NFCTAG_OK; + } else if ((ret == 2) || (ret == 3)) { + return NFCTAG_NACK; + } else { + return NFCTAG_ERROR; + } } @@ -202,46 +202,46 @@ NFCTAG_StatusTypeDef ST25DV_IO::NFCTAG_ConvertStatus(uint8_t ret) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_Read(uint8_t *const pData, const uint8_t DevAddr, const uint16_t Size) { - int i = 0; - uint8_t Addr = DevAddr >> 1; - char tmp[4]; - - if (_pwire == NULL) { - return NFCTAG_ERROR; - } - if (_serial != NULL) { - _serial->print(" r"); - _serial->print(":"); - _serial->println(Size); - } - // be carefully with the (int)Size, the size parameter us no more on 16 bits but only 15 bits (the cast is required for arduino UNO) - byte ret = _pwire->requestFrom((int)Addr, (int)Size); // Tell slave we need to read 1byte from the current register - while (_pwire->available()) { - pData[i++] = _pwire->read(); // read that byte into 'slaveByte2' variable - } - - if (_serial != NULL) { - _serial->print(" "); - for (int d = 0; d < i; d++) { - sprintf(tmp, "%02X", pData[d]); - _serial->print(tmp); - } - _serial->println(""); - } - /* - It doesn't seem like Arduino wants you to call `endTransmission` - after `requestFrom`. On the ESP32 the ret value is 8 because it - is an `endTransmission` without a `startTransmission` which is - considered an error by the library. - */ - // ret = _pwire->endTransmission(); - - // if (_serial != NULL) { - // // _serial->println(pData[0]); - // _serial->print(" ="); - // _serial->println(ret); - // } - return NFCTAG_ConvertStatus(ret); + int i = 0; + uint8_t Addr = DevAddr >> 1; + char tmp[4]; + + if (_pwire == NULL) { + return NFCTAG_ERROR; + } + if (_serial != NULL) { + _serial->print(" r"); + _serial->print(":"); + _serial->println(Size); + } + // be carefully with the (int)Size, the size parameter us no more on 16 bits but only 15 bits (the cast is required for arduino UNO) + byte ret = _pwire->requestFrom((int)Addr, (int)Size); // Tell slave we need to read 1byte from the current register + while (_pwire->available()) { + pData[i++] = _pwire->read(); // read that byte into 'slaveByte2' variable + } + + if (_serial != NULL) { + _serial->print(" "); + for (int d = 0; d < i; d++) { + sprintf(tmp, "%02X", pData[d]); + _serial->print(tmp); + } + _serial->println(""); + } + /* + It doesn't seem like Arduino wants you to call `endTransmission` + after `requestFrom`. On the ESP32 the ret value is 8 because it + is an `endTransmission` without a `startTransmission` which is + considered an error by the library. + */ + // ret = _pwire->endTransmission(); + + // if (_serial != NULL) { + // // _serial->println(pData[0]); + // _serial->print(" ="); + // _serial->println(ret); + // } + return NFCTAG_ConvertStatus(ret); } @@ -253,24 +253,24 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_Read(uint8_t *const pData, const uint8 */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_IsDeviceReady(const uint8_t DevAddr, const uint32_t Trials) { - int ret = 4; - uint32_t count = 0; - if (_pwire == NULL) { - return NFCTAG_ERROR; - } - if (_serial != NULL) { - _serial->println(" ?"); - } - - while ((count++ < Trials) && ret) { - _pwire->beginTransmission(DevAddr >> 1); - ret = _pwire->endTransmission(); + int ret = 4; + uint32_t count = 0; + if (_pwire == NULL) { + return NFCTAG_ERROR; + } if (_serial != NULL) { - _serial->print(" ="); - _serial->println(ret); + _serial->println(" ?"); } - } - return NFCTAG_ConvertStatus(ret); + + while ((count++ < Trials) && ret) { + _pwire->beginTransmission(DevAddr >> 1); + ret = _pwire->endTransmission(); + if (_serial != NULL) { + _serial->print(" ="); + _serial->println(ret); + } + } + return NFCTAG_ConvertStatus(ret); } /** @@ -279,8 +279,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_IsDeviceReady(const uint8_t DevAddr, c */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_Init(void) { - /* Configure the low level interface */ - return ST25DV_IO_Init(); + /* Configure the low level interface */ + return ST25DV_IO_Init(); } /** @@ -290,8 +290,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_Init(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadID(uint8_t *const pICRef) { - /* Read ICRef on device */ - return ST25DV_i2c_ReadRegister(pICRef, ST25DV_ICREF_REG, 1); + /* Read ICRef on device */ + return ST25DV_i2c_ReadRegister(pICRef, ST25DV_ICREF_REG, 1); } /** @@ -303,8 +303,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadID(uint8_t *const pICRef) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadData(uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - /* Read Data in user memory */ - return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); + /* Read Data in user memory */ + return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); } /** @@ -316,32 +316,32 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadData(uint8_t *const pData, const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteData(const uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - NFCTAG_StatusTypeDef ret; - uint16_t split_data_nb; - const uint8_t *pdata_index = (const uint8_t *)pData; - uint16_t bytes_to_write = NbByte; - uint16_t mem_addr = TarAddr; - - /* ST25DV can write a maximum of 256 bytes in EEPROM per i2c communication */ - do { - /* Split write if data to write is superior of max write bytes for ST25DV */ - if (bytes_to_write > ST25DV_MAX_WRITE_BYTE) { - /* DataSize higher than max page write, copy data by page */ - split_data_nb = (uint16_t)ST25DV_MAX_WRITE_BYTE; - } else { - /* DataSize lower or equal to max page write, copy only last bytes */ - split_data_nb = bytes_to_write; - } - /* Write split_data_nb bytes in memory */ - ret = ST25DV_IO_MemWrite(pdata_index, ST25DV_ADDR_DATA_I2C, mem_addr, split_data_nb); + NFCTAG_StatusTypeDef ret; + uint16_t split_data_nb; + const uint8_t *pdata_index = (const uint8_t *)pData; + uint16_t bytes_to_write = NbByte; + uint16_t mem_addr = TarAddr; - /* update index, dest address, size for next write */ - pdata_index += split_data_nb; - mem_addr += split_data_nb; - bytes_to_write -= split_data_nb; - } while ((bytes_to_write > 0) && (ret == NFCTAG_OK)); + /* ST25DV can write a maximum of 256 bytes in EEPROM per i2c communication */ + do { + /* Split write if data to write is superior of max write bytes for ST25DV */ + if (bytes_to_write > ST25DV_MAX_WRITE_BYTE) { + /* DataSize higher than max page write, copy data by page */ + split_data_nb = (uint16_t)ST25DV_MAX_WRITE_BYTE; + } else { + /* DataSize lower or equal to max page write, copy only last bytes */ + split_data_nb = bytes_to_write; + } + /* Write split_data_nb bytes in memory */ + ret = ST25DV_IO_MemWrite(pdata_index, ST25DV_ADDR_DATA_I2C, mem_addr, split_data_nb); + + /* update index, dest address, size for next write */ + pdata_index += split_data_nb; + mem_addr += split_data_nb; + bytes_to_write -= split_data_nb; + } while ((bytes_to_write > 0) && (ret == NFCTAG_OK)); - return ret; + return ret; } /** @@ -353,8 +353,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteData(const uint8_t *const pData, */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRegister(uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - /* Read Data in system memory */ - return ST25DV_IO_MemRead(pData, ST25DV_ADDR_SYST_I2C, TarAddr, NbByte); + /* Read Data in system memory */ + return ST25DV_IO_MemRead(pData, ST25DV_ADDR_SYST_I2C, TarAddr, NbByte); } /** @@ -367,32 +367,32 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRegister(uint8_t *const pData, co */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRegister(const uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - NFCTAG_StatusTypeDef ret; - uint8_t split_data_nb; - uint16_t bytes_to_write = NbByte; - uint16_t mem_addr = TarAddr; - const uint8_t *pdata_index = (const uint8_t *)pData; - - /* ST25DV can write a maximum of 256 bytes in EEPROM per i2c communication */ - do { - /* Split write if data to write is superior of max write bytes for ST25DV */ - if (bytes_to_write > ST25DV_MAX_WRITE_BYTE) { - /* DataSize higher than max page write, copy data by page */ - split_data_nb = (uint8_t)ST25DV_MAX_WRITE_BYTE; - } else { - /* DataSize lower or equal to max page write, copy only last bytes */ - split_data_nb = bytes_to_write; - } - /* Write split_data_nb bytes in register */ - ret = ST25DV_IO_MemWrite(pdata_index, ST25DV_ADDR_SYST_I2C, mem_addr, split_data_nb); + NFCTAG_StatusTypeDef ret; + uint8_t split_data_nb; + uint16_t bytes_to_write = NbByte; + uint16_t mem_addr = TarAddr; + const uint8_t *pdata_index = (const uint8_t *)pData; - /* update index, dest address, size for next write */ - pdata_index += split_data_nb; - mem_addr += split_data_nb; - bytes_to_write -= split_data_nb; - } while ((bytes_to_write > 0) && (ret == NFCTAG_OK)); + /* ST25DV can write a maximum of 256 bytes in EEPROM per i2c communication */ + do { + /* Split write if data to write is superior of max write bytes for ST25DV */ + if (bytes_to_write > ST25DV_MAX_WRITE_BYTE) { + /* DataSize higher than max page write, copy data by page */ + split_data_nb = (uint8_t)ST25DV_MAX_WRITE_BYTE; + } else { + /* DataSize lower or equal to max page write, copy only last bytes */ + split_data_nb = bytes_to_write; + } + /* Write split_data_nb bytes in register */ + ret = ST25DV_IO_MemWrite(pdata_index, ST25DV_ADDR_SYST_I2C, mem_addr, split_data_nb); + + /* update index, dest address, size for next write */ + pdata_index += split_data_nb; + mem_addr += split_data_nb; + bytes_to_write -= split_data_nb; + } while ((bytes_to_write > 0) && (ret == NFCTAG_OK)); - return ret; + return ret; } /** @@ -402,8 +402,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRegister(const uint8_t *const pD */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadICRev(uint8_t *const pICRev) { - /* Read ICRev on device */ - return ST25DV_i2c_ReadRegister(pICRev, ST25DV_ICREV_REG, 1); + /* Read ICRev on device */ + return ST25DV_i2c_ReadRegister(pICRev, ST25DV_ICREV_REG, 1); } /** TODO adjust comment @@ -422,21 +422,21 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadICRev(uint8_t *const pICRev) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetGPOStatus(uint16_t *const pGPOStatus) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; - /* Read value of GPO register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO2_REG, 1); - if (status == NFCTAG_OK) { - // Extract GPO configuration - *pGPOStatus = ((uint16_t)0x0003 & (uint16_t)reg_value) << 8; - // Read value of GPO register - status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO1_REG, 1); + uint8_t reg_value; + NFCTAG_StatusTypeDef status; + /* Read value of GPO register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO2_REG, 1); if (status == NFCTAG_OK) { - // Extract GPO configuration - *pGPOStatus |= ((uint16_t)0x00FF & (uint16_t)reg_value); + // Extract GPO configuration + *pGPOStatus = ((uint16_t)0x0003 & (uint16_t)reg_value) << 8; + // Read value of GPO register + status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO1_REG, 1); + if (status == NFCTAG_OK) { + // Extract GPO configuration + *pGPOStatus |= ((uint16_t)0x00FF & (uint16_t)reg_value); + } } - } - return status; + return status; } /** @@ -456,8 +456,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetGPOStatus(uint16_t *const pGPOStat */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ConfigureGPO(const uint16_t ITConf) { - /* Write GPO configuration to register */ - return ST25DV_i2c_WriteRegister((uint8_t *)&ITConf, ST25DVXXKC_GPO1_REG, 1); + /* Write GPO configuration to register */ + return ST25DV_i2c_WriteRegister((uint8_t *)&ITConf, ST25DVXXKC_GPO1_REG, 1); } @@ -468,19 +468,19 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ConfigureGPO(const uint16_t ITConf) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadITPulse(ST25DV_PULSE_DURATION *const pITtime) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read ITtime register value */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO2_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read ITtime register value */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO2_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract delay coefficient value */ - *pITtime = (ST25DV_PULSE_DURATION)reg_value; + /* Extract delay coefficient value */ + *pITtime = (ST25DV_PULSE_DURATION)reg_value; - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -491,13 +491,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadITPulse(ST25DV_PULSE_DURATION *co */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteITPulse(const ST25DV_PULSE_DURATION ITtime) { - uint8_t reg_value; + uint8_t reg_value; - /* prepare data to write */ - reg_value = (uint8_t)ITtime; + /* prepare data to write */ + reg_value = (uint8_t)ITtime; - /* Write value for ITtime register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DVXXKC_GPO2_REG, 1); + /* Write value for ITtime register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DVXXKC_GPO2_REG, 1); } /** @@ -508,8 +508,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteITPulse(const ST25DV_PULSE_DURAT */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDataCurrentAddr(uint8_t *const pData, const uint16_t NbByte) { - /* Read Data in user memory */ - return ST25DV_IO_Read(pData, ST25DV_ADDR_DATA_I2C, NbByte); + /* Read Data in user memory */ + return ST25DV_IO_Read(pData, ST25DV_ADDR_DATA_I2C, NbByte); } /** @@ -519,30 +519,30 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDataCurrentAddr(uint8_t *const pD */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadUID(ST25DV_UID *const pUid) { - uint8_t reg_value[8]; - uint8_t i; - NFCTAG_StatusTypeDef status; + uint8_t reg_value[8]; + uint8_t i; + NFCTAG_StatusTypeDef status; - /* Read value of UID registers */ - status = ST25DV_i2c_ReadRegister(reg_value, ST25DV_UID_REG, 8); - if (status != NFCTAG_OK) { - return status; - } + /* Read value of UID registers */ + status = ST25DV_i2c_ReadRegister(reg_value, ST25DV_UID_REG, 8); + if (status != NFCTAG_OK) { + return status; + } - /* Store information in 2 WORD */ - pUid->MsbUid = 0; + /* Store information in 2 WORD */ + pUid->MsbUid = 0; - for (i = 0; i < 4; i++) { - pUid->MsbUid = (pUid->MsbUid << 8) | reg_value[7 - i]; - } + for (i = 0; i < 4; i++) { + pUid->MsbUid = (pUid->MsbUid << 8) | reg_value[7 - i]; + } - pUid->LsbUid = 0; + pUid->LsbUid = 0; - for (i = 0; i < 4; i++) { - pUid->LsbUid = (pUid->LsbUid << 8) | reg_value[3 - i]; - } + for (i = 0; i < 4; i++) { + pUid->LsbUid = (pUid->LsbUid << 8) | reg_value[3 - i]; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -552,8 +552,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadUID(ST25DV_UID *const pUid) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDSFID(uint8_t *const pDsfid) { - /* Read DSFID register */ - return ST25DV_i2c_ReadRegister(pDsfid, ST25DV_DSFID_REG, 1); + /* Read DSFID register */ + return ST25DV_i2c_ReadRegister(pDsfid, ST25DV_DSFID_REG, 1); } /** @@ -563,22 +563,22 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDSFID(uint8_t *const pDsfid) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDsfidRFProtection(ST25DV_LOCK_STATUS *const pLockDsfid) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_LOCKDSFID_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_LOCKDSFID_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Lock Status */ - if (reg_value == 0) { - *pLockDsfid = ST25DV_UNLOCKED; - } else { - *pLockDsfid = ST25DV_LOCKED; - } - return NFCTAG_OK; + /* Extract Lock Status */ + if (reg_value == 0) { + *pLockDsfid = ST25DV_UNLOCKED; + } else { + *pLockDsfid = ST25DV_LOCKED; + } + return NFCTAG_OK; } /** @@ -588,8 +588,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDsfidRFProtection(ST25DV_LOCK_STA */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadAFI(uint8_t *const pAfi) { - /* Read AFI register */ - return ST25DV_i2c_ReadRegister(pAfi, ST25DV_AFI_REG, 1); + /* Read AFI register */ + return ST25DV_i2c_ReadRegister(pAfi, ST25DV_AFI_REG, 1); } /** @@ -599,22 +599,22 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadAFI(uint8_t *const pAfi) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadAfiRFProtection(ST25DV_LOCK_STATUS *const pLockAfi) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_LOCKAFI_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_LOCKAFI_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Lock Status */ - if (reg_value == 0) { - *pLockAfi = ST25DV_UNLOCKED; - } else { - *pLockAfi = ST25DV_LOCKED; - } - return NFCTAG_OK; + /* Extract Lock Status */ + if (reg_value == 0) { + *pLockAfi = ST25DV_UNLOCKED; + } else { + *pLockAfi = ST25DV_LOCKED; + } + return NFCTAG_OK; } /** @@ -624,22 +624,22 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadAfiRFProtection(ST25DV_LOCK_STATU */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadI2CProtectZone(ST25DV_I2C_PROT_ZONE *const pProtZone) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read value of I2c Protected Zone register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_I2CZSS_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read value of I2c Protected Zone register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_I2CZSS_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Dispatch information to corresponding struct member */ - pProtZone->ProtectZone1 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ1_MASK) >> ST25DV_I2CZSS_PZ1_SHIFT); - pProtZone->ProtectZone2 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ2_MASK) >> ST25DV_I2CZSS_PZ2_SHIFT); - pProtZone->ProtectZone3 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ3_MASK) >> ST25DV_I2CZSS_PZ3_SHIFT); - pProtZone->ProtectZone4 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ4_MASK) >> ST25DV_I2CZSS_PZ4_SHIFT); + /* Dispatch information to corresponding struct member */ + pProtZone->ProtectZone1 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ1_MASK) >> ST25DV_I2CZSS_PZ1_SHIFT); + pProtZone->ProtectZone2 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ2_MASK) >> ST25DV_I2CZSS_PZ2_SHIFT); + pProtZone->ProtectZone3 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ3_MASK) >> ST25DV_I2CZSS_PZ3_SHIFT); + pProtZone->ProtectZone4 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ4_MASK) >> ST25DV_I2CZSS_PZ4_SHIFT); - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -650,13 +650,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadI2CProtectZone(ST25DV_I2C_PROT_ZO */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteLockCFG(const ST25DV_LOCK_STATUS LockCfg) { - uint8_t reg_value; + uint8_t reg_value; - /* Configure value to write on register */ - reg_value = (uint8_t)LockCfg; + /* Configure value to write on register */ + reg_value = (uint8_t)LockCfg; - /* Write LOCKCFG register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_LOCKCFG_REG, 1); + /* Write LOCKCFG register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_LOCKCFG_REG, 1); } /** @@ -666,20 +666,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteLockCFG(const ST25DV_LOCK_STATUS */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_PresentI2CPassword(const ST25DV_PASSWD PassWord) { - uint8_t ai2c_message[17] = {0}; - uint8_t i; + uint8_t ai2c_message[17] = {0}; + uint8_t i; - /* Build I2C Message with Password + Validation code 0x09 + Password */ - ai2c_message[8] = 0x09; - for (i = 0; i < 4; i++) { - ai2c_message[i] = (PassWord.MsbPasswd >> ((3 - i) * 8)) & 0xFF; - ai2c_message[i + 4] = (PassWord.LsbPasswd >> ((3 - i) * 8)) & 0xFF; - ai2c_message[i + 9] = ai2c_message[i]; - ai2c_message[i + 13] = ai2c_message[i + 4]; - }; + /* Build I2C Message with Password + Validation code 0x09 + Password */ + ai2c_message[8] = 0x09; + for (i = 0; i < 4; i++) { + ai2c_message[i] = (PassWord.MsbPasswd >> ((3 - i) * 8)) & 0xFF; + ai2c_message[i + 4] = (PassWord.LsbPasswd >> ((3 - i) * 8)) & 0xFF; + ai2c_message[i + 9] = ai2c_message[i]; + ai2c_message[i + 13] = ai2c_message[i + 4]; + }; - /* Present password to ST25DV */ - return ST25DV_i2c_WriteRegister(ai2c_message, ST25DV_I2CPASSWD_REG, 17); + /* Present password to ST25DV */ + return ST25DV_i2c_WriteRegister(ai2c_message, ST25DV_I2CPASSWD_REG, 17); } /** @@ -690,21 +690,21 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_PresentI2CPassword(const ST25DV_PASSW */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteI2CPassword(const ST25DV_PASSWD PassWord) { - uint8_t ai2c_message[17] = {0}; - uint8_t i; + uint8_t ai2c_message[17] = {0}; + uint8_t i; - /* Build I2C Message with Password + Validation code 0x07 + Password */ - ai2c_message[8] = 0x07; + /* Build I2C Message with Password + Validation code 0x07 + Password */ + ai2c_message[8] = 0x07; - for (i = 0; i < 4; i++) { - ai2c_message[i] = (PassWord.MsbPasswd >> ((3 - i) * 8)) & 0xFF; - ai2c_message[i + 4] = (PassWord.LsbPasswd >> ((3 - i) * 8)) & 0xFF; - ai2c_message[i + 9] = ai2c_message[i]; - ai2c_message[i + 13] = ai2c_message[i + 4]; - }; + for (i = 0; i < 4; i++) { + ai2c_message[i] = (PassWord.MsbPasswd >> ((3 - i) * 8)) & 0xFF; + ai2c_message[i + 4] = (PassWord.LsbPasswd >> ((3 - i) * 8)) & 0xFF; + ai2c_message[i + 9] = ai2c_message[i]; + ai2c_message[i + 13] = ai2c_message[i + 4]; + }; - /* Write new password in I2CPASSWD register */ - return ST25DV_i2c_WriteRegister(ai2c_message, ST25DV_I2CPASSWD_REG, 17); + /* Write new password in I2CPASSWD register */ + return ST25DV_i2c_WriteRegister(ai2c_message, ST25DV_I2CPASSWD_REG, 17); } /** @@ -715,40 +715,40 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteI2CPassword(const ST25DV_PASSWD */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFZxSS(const ST25DV_PROTECTION_ZONE Zone, ST25DV_RF_PROT_ZONE *const pRfprotZone) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; - uint16_t sector_security_addr; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; + uint16_t sector_security_addr; - /* Select Sector Security register address */ - switch (Zone) { + /* Select Sector Security register address */ + switch (Zone) { case ST25DV_PROT_ZONE1: - sector_security_addr = ST25DV_RFZ1SS_REG; - break; + sector_security_addr = ST25DV_RFZ1SS_REG; + break; case ST25DV_PROT_ZONE2: - sector_security_addr = ST25DV_RFZ2SS_REG; - break; + sector_security_addr = ST25DV_RFZ2SS_REG; + break; case ST25DV_PROT_ZONE3: - sector_security_addr = ST25DV_RFZ3SS_REG; - break; + sector_security_addr = ST25DV_RFZ3SS_REG; + break; case ST25DV_PROT_ZONE4: - sector_security_addr = ST25DV_RFZ4SS_REG; - break; + sector_security_addr = ST25DV_RFZ4SS_REG; + break; default: - return NFCTAG_ERROR; - } + return NFCTAG_ERROR; + } - /* Read actual value of Sector Security Status register */ - status = ST25DV_i2c_ReadRegister(®_value, sector_security_addr, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of Sector Security Status register */ + status = ST25DV_i2c_ReadRegister(®_value, sector_security_addr, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Sector Security Status configuration */ - pRfprotZone->PasswdCtrl = (ST25DV_PASSWD_PROT_STATUS)((reg_value & ST25DV_RFZSS_PWDCTRL_MASK) >> ST25DV_RFZSS_PWDCTRL_SHIFT); - pRfprotZone->RWprotection = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_RFZSS_RWPROT_MASK) >> ST25DV_RFZSS_RWPROT_SHIFT); + /* Extract Sector Security Status configuration */ + pRfprotZone->PasswdCtrl = (ST25DV_PASSWD_PROT_STATUS)((reg_value & ST25DV_RFZSS_PWDCTRL_MASK) >> ST25DV_RFZSS_PWDCTRL_SHIFT); + pRfprotZone->RWprotection = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_RFZSS_RWPROT_MASK) >> ST25DV_RFZSS_RWPROT_SHIFT); - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -760,34 +760,34 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFZxSS(const ST25DV_PROTECTION_ZO */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFZxSS(const ST25DV_PROTECTION_ZONE Zone, const ST25DV_RF_PROT_ZONE RfProtZone) { - uint8_t reg_value; - uint16_t sector_security_addr; + uint8_t reg_value; + uint16_t sector_security_addr; - /* Select Sector Security register address */ - switch (Zone) { + /* Select Sector Security register address */ + switch (Zone) { case ST25DV_PROT_ZONE1: - sector_security_addr = ST25DV_RFZ1SS_REG; - break; + sector_security_addr = ST25DV_RFZ1SS_REG; + break; case ST25DV_PROT_ZONE2: - sector_security_addr = ST25DV_RFZ2SS_REG; - break; + sector_security_addr = ST25DV_RFZ2SS_REG; + break; case ST25DV_PROT_ZONE3: - sector_security_addr = ST25DV_RFZ3SS_REG; - break; + sector_security_addr = ST25DV_RFZ3SS_REG; + break; case ST25DV_PROT_ZONE4: - sector_security_addr = ST25DV_RFZ4SS_REG; - break; + sector_security_addr = ST25DV_RFZ4SS_REG; + break; default: - return NFCTAG_ERROR; - } + return NFCTAG_ERROR; + } - /* Update Sector Security Status */ - reg_value = (RfProtZone.RWprotection << ST25DV_RFZSS_RWPROT_SHIFT) & ST25DV_RFZSS_RWPROT_MASK; - reg_value |= ((RfProtZone.PasswdCtrl << ST25DV_RFZSS_PWDCTRL_SHIFT) & ST25DV_RFZSS_PWDCTRL_MASK); + /* Update Sector Security Status */ + reg_value = (RfProtZone.RWprotection << ST25DV_RFZSS_RWPROT_SHIFT) & ST25DV_RFZSS_RWPROT_MASK; + reg_value |= ((RfProtZone.PasswdCtrl << ST25DV_RFZSS_PWDCTRL_SHIFT) & ST25DV_RFZSS_PWDCTRL_MASK); - /* Write Sector Security register */ - return ST25DV_i2c_WriteRegister(®_value, sector_security_addr, 1); + /* Write Sector Security register */ + return ST25DV_i2c_WriteRegister(®_value, sector_security_addr, 1); } /** @@ -798,26 +798,26 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFZxSS(const ST25DV_PROTECTION_Z */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEndZonex(const ST25DV_END_ZONE EndZone, uint8_t *const pEndZ) { - uint16_t mem_addr; + uint16_t mem_addr; - /* End zone register address to read */ - switch (EndZone) { + /* End zone register address to read */ + switch (EndZone) { case ST25DV_ZONE_END1: - mem_addr = ST25DV_END1_REG; - break; + mem_addr = ST25DV_END1_REG; + break; case ST25DV_ZONE_END2: - mem_addr = ST25DV_END2_REG; - break; + mem_addr = ST25DV_END2_REG; + break; case ST25DV_ZONE_END3: - mem_addr = ST25DV_END3_REG; - break; + mem_addr = ST25DV_END3_REG; + break; default: - return NFCTAG_ERROR; - } + return NFCTAG_ERROR; + } - /* Read the corresponding End zone */ - return ST25DV_i2c_ReadRegister(pEndZ, mem_addr, 1); + /* Read the corresponding End zone */ + return ST25DV_i2c_ReadRegister(pEndZ, mem_addr, 1); } /** @@ -831,29 +831,29 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEndZonex(const ST25DV_END_ZONE En */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteEndZonex(const ST25DV_END_ZONE EndZone, const uint8_t EndZ) { - uint16_t mem_addr; - NFCTAG_StatusTypeDef ret; + uint16_t mem_addr; + NFCTAG_StatusTypeDef ret; - /* End zone register address to write */ - switch (EndZone) { + /* End zone register address to write */ + switch (EndZone) { case ST25DV_ZONE_END1: - mem_addr = ST25DV_END1_REG; - break; + mem_addr = ST25DV_END1_REG; + break; case ST25DV_ZONE_END2: - mem_addr = ST25DV_END2_REG; - break; + mem_addr = ST25DV_END2_REG; + break; case ST25DV_ZONE_END3: - mem_addr = ST25DV_END3_REG; - break; + mem_addr = ST25DV_END3_REG; + break; default: - return NFCTAG_ERROR; - } + return NFCTAG_ERROR; + } - /* Write the corresponding End zone value in register */ - ret = ST25DV_i2c_WriteRegister(&EndZ, mem_addr, 1); + /* Write the corresponding End zone value in register */ + ret = ST25DV_i2c_WriteRegister(&EndZ, mem_addr, 1); - return ret; + return ret; } /** @@ -865,38 +865,38 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteEndZonex(const ST25DV_END_ZONE E */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_InitEndZone(void) { - uint8_t endval = 0xFF; - uint32_t maxmemlength; - ST25DV_MEM_SIZE memsize; - NFCTAG_StatusTypeDef ret; + uint8_t endval = 0xFF; + uint32_t maxmemlength; + ST25DV_MEM_SIZE memsize; + NFCTAG_StatusTypeDef ret; - memsize.Mem_Size = 0; - memsize.BlockSize = 0; + memsize.Mem_Size = 0; + memsize.BlockSize = 0; - /* Get EEPROM mem size */ - ST25DV_i2c_ReadMemSize(&memsize); - maxmemlength = (memsize.Mem_Size + 1) * (memsize.BlockSize + 1); + /* Get EEPROM mem size */ + ST25DV_i2c_ReadMemSize(&memsize); + maxmemlength = (memsize.Mem_Size + 1) * (memsize.BlockSize + 1); - /* Compute Max value for endzone register */ - endval = (maxmemlength / 32) - 1; + /* Compute Max value for endzone register */ + endval = (maxmemlength / 32) - 1; - /* Write EndZone value to ST25DV registers */ - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END3, endval); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + /* Write EndZone value to ST25DV registers */ + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END3, endval); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END2, endval); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END2, endval); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END1, endval); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END1, endval); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } - return ret; + return ret; } /** @@ -910,68 +910,68 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_InitEndZone(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_CreateUserZone(uint16_t Zone1Length, uint16_t Zone2Length, uint16_t Zone3Length, uint16_t Zone4Length) { - uint8_t EndVal; - ST25DV_MEM_SIZE memsize; - uint16_t maxmemlength = 0; - NFCTAG_StatusTypeDef ret; + uint8_t EndVal; + ST25DV_MEM_SIZE memsize; + uint16_t maxmemlength = 0; + NFCTAG_StatusTypeDef ret; - memsize.Mem_Size = 0; - memsize.BlockSize = 0; + memsize.Mem_Size = 0; + memsize.BlockSize = 0; - ST25DV_i2c_ReadMemSize(&memsize); + ST25DV_i2c_ReadMemSize(&memsize); - maxmemlength = (memsize.Mem_Size + 1) * (memsize.BlockSize + 1); + maxmemlength = (memsize.Mem_Size + 1) * (memsize.BlockSize + 1); - /* Checks that values of different zones are in bounds */ - if ((Zone1Length < 32) || (Zone1Length > maxmemlength) || (Zone2Length > (maxmemlength - 32)) - || (Zone3Length > (maxmemlength - 64)) || (Zone4Length > (maxmemlength - 96))) { - return NFCTAG_ERROR; - } + /* Checks that values of different zones are in bounds */ + if ((Zone1Length < 32) || (Zone1Length > maxmemlength) || (Zone2Length > (maxmemlength - 32)) + || (Zone3Length > (maxmemlength - 64)) || (Zone4Length > (maxmemlength - 96))) { + return NFCTAG_ERROR; + } - /* Checks that the total is less than the authorised maximum */ - if ((Zone1Length + Zone2Length + Zone3Length + Zone4Length) > maxmemlength) { - return NFCTAG_ERROR; - } + /* Checks that the total is less than the authorised maximum */ + if ((Zone1Length + Zone2Length + Zone3Length + Zone4Length) > maxmemlength) { + return NFCTAG_ERROR; + } - /* if The value for each Length is not a multiple of 64 correct it. */ - if ((Zone1Length % 32) != 0) { - Zone1Length = Zone1Length - (Zone1Length % 32); - } + /* if The value for each Length is not a multiple of 64 correct it. */ + if ((Zone1Length % 32) != 0) { + Zone1Length = Zone1Length - (Zone1Length % 32); + } - if ((Zone2Length % 32) != 0) { - Zone2Length = Zone2Length - (Zone2Length % 32); - } + if ((Zone2Length % 32) != 0) { + Zone2Length = Zone2Length - (Zone2Length % 32); + } - if ((Zone3Length % 32) != 0) { - Zone3Length = Zone3Length - (Zone3Length % 32); - } + if ((Zone3Length % 32) != 0) { + Zone3Length = Zone3Length - (Zone3Length % 32); + } - /* First right 0xFF in each Endx value */ - ret = ST25DV_i2c_InitEndZone(); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + /* First right 0xFF in each Endx value */ + ret = ST25DV_i2c_InitEndZone(); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } - /* Then Write corresponding value for each zone */ - EndVal = (uint8_t)((Zone1Length / 32) - 1); - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END1, EndVal); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + /* Then Write corresponding value for each zone */ + EndVal = (uint8_t)((Zone1Length / 32) - 1); + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END1, EndVal); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } - EndVal = (uint8_t)(((Zone1Length + Zone2Length) / 32) - 1); - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END2, EndVal); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + EndVal = (uint8_t)(((Zone1Length + Zone2Length) / 32) - 1); + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END2, EndVal); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } - EndVal = (uint8_t)(((Zone1Length + Zone2Length + Zone3Length) / 32) - 1); - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END3, EndVal); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + EndVal = (uint8_t)(((Zone1Length + Zone2Length + Zone3Length) / 32) - 1); + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END3, EndVal); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -981,20 +981,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_CreateUserZone(uint16_t Zone1Length, */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMemSize(ST25DV_MEM_SIZE *const pSizeInfo) { - uint8_t reg_value[3]; - NFCTAG_StatusTypeDef status; + uint8_t reg_value[3]; + NFCTAG_StatusTypeDef status; - /* Read actual value of MEM_SIZE register */ - status = ST25DV_i2c_ReadRegister(reg_value, ST25DV_MEM_SIZE_REG, 3); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of MEM_SIZE register */ + status = ST25DV_i2c_ReadRegister(reg_value, ST25DV_MEM_SIZE_REG, 3); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Memory information */ - pSizeInfo->BlockSize = reg_value[2]; - pSizeInfo->Mem_Size = reg_value[1]; - pSizeInfo->Mem_Size = (pSizeInfo->Mem_Size << 8) | reg_value[0]; - return NFCTAG_OK; + /* Extract Memory information */ + pSizeInfo->BlockSize = reg_value[2]; + pSizeInfo->Mem_Size = reg_value[1]; + pSizeInfo->Mem_Size = (pSizeInfo->Mem_Size << 8) | reg_value[0]; + return NFCTAG_OK; } /** @@ -1004,23 +1004,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMemSize(ST25DV_MEM_SIZE *const pS */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEHMode(ST25DV_EH_MODE_STATUS *const pEH_mode) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of EH_MODE register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_EH_MODE_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of EH_MODE register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_EH_MODE_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract EH_mode configuration */ - if ((reg_value & ST25DV_EH_MODE_MASK) == ST25DV_EH_MODE_MASK) { - *pEH_mode = ST25DV_EH_ON_DEMAND; - } else { - *pEH_mode = ST25DV_EH_ACTIVE_AFTER_BOOT; - } + /* Extract EH_mode configuration */ + if ((reg_value & ST25DV_EH_MODE_MASK) == ST25DV_EH_MODE_MASK) { + *pEH_mode = ST25DV_EH_ON_DEMAND; + } else { + *pEH_mode = ST25DV_EH_ACTIVE_AFTER_BOOT; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1031,13 +1031,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEHMode(ST25DV_EH_MODE_STATUS *con */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteEHMode(const ST25DV_EH_MODE_STATUS EH_mode) { - uint8_t reg_value; + uint8_t reg_value; - /* Update EH_mode */ - reg_value = (uint8_t)EH_mode; + /* Update EH_mode */ + reg_value = (uint8_t)EH_mode; - /* Write EH_MODE register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_EH_MODE_REG, 1); + /* Write EH_MODE register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_EH_MODE_REG, 1); } /** @@ -1047,29 +1047,29 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteEHMode(const ST25DV_EH_MODE_STAT */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFMngt(ST25DV_RF_MNGT *const pRF_Mngt) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; - - /* Read actual value of RF_MNGT register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - if (status == NFCTAG_OK) { - /* Extract RF Disable information */ - if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { - pRF_Mngt->RfDisable = ST25DV_ENABLE; - } else { - pRF_Mngt->RfDisable = ST25DV_DISABLE; - } + /* Read actual value of RF_MNGT register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); - /* Extract RF Sleep information */ - if ((reg_value & ST25DV_RF_MNGT_RFSLEEP_MASK) == ST25DV_RF_MNGT_RFSLEEP_MASK) { - pRF_Mngt->RfSleep = ST25DV_ENABLE; - } else { - pRF_Mngt->RfSleep = ST25DV_DISABLE; + if (status == NFCTAG_OK) { + /* Extract RF Disable information */ + if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { + pRF_Mngt->RfDisable = ST25DV_ENABLE; + } else { + pRF_Mngt->RfDisable = ST25DV_DISABLE; + } + + /* Extract RF Sleep information */ + if ((reg_value & ST25DV_RF_MNGT_RFSLEEP_MASK) == ST25DV_RF_MNGT_RFSLEEP_MASK) { + pRF_Mngt->RfSleep = ST25DV_ENABLE; + } else { + pRF_Mngt->RfSleep = ST25DV_DISABLE; + } } - } - return status; + return status; } /** @@ -1080,8 +1080,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFMngt(ST25DV_RF_MNGT *const pRF_ */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFMngt(const uint8_t Rfmngt) { - /* Write RF_MNGT register */ - return ST25DV_i2c_WriteRegister(&Rfmngt, ST25DV_RF_MNGT_REG, 1); + /* Write RF_MNGT register */ + return ST25DV_i2c_WriteRegister(&Rfmngt, ST25DV_RF_MNGT_REG, 1); } /** @@ -1091,23 +1091,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFMngt(const uint8_t Rfmngt) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFDisable(ST25DV_EN_STATUS *const pRFDisable) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Read actual value of RF_MNGT register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_REG, 1); - /* Extract RFDisable information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { - *pRFDisable = ST25DV_ENABLE; - } else { - *pRFDisable = ST25DV_DISABLE; + /* Extract RFDisable information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { + *pRFDisable = ST25DV_ENABLE; + } else { + *pRFDisable = ST25DV_DISABLE; + } + return NFCTAG_OK; } - return NFCTAG_OK; - } - return status; + return status; } /** @@ -1117,20 +1117,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFDisable(ST25DV_EN_STATUS *const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFDisable(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_RMNGT register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_RMNGT register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update RF Disable field configuration */ - reg_value |= ST25DV_RF_MNGT_RFDIS_MASK; + /* Update RF Disable field configuration */ + reg_value |= ST25DV_RF_MNGT_RFDIS_MASK; - /* Write RF_MNGT register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Write RF_MNGT register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); } /** @@ -1140,20 +1140,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFDisable(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFDisable(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_RMNGT register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_RMNGT register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update RF Disable field configuration */ - reg_value &= ST25DV_RF_MNGT_RFDIS_FIELD; + /* Update RF Disable field configuration */ + reg_value &= ST25DV_RF_MNGT_RFDIS_FIELD; - /* Write RF_MNGT register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Write RF_MNGT register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); } /** @@ -1163,23 +1163,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFDisable(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFSleep(ST25DV_EN_STATUS *const pRFSleep) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Read actual value of RF_MNGT register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_REG, 1); - /* Extract RFSleep information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { - *pRFSleep = ST25DV_ENABLE; - } else { - *pRFSleep = ST25DV_DISABLE; + /* Extract RFSleep information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { + *pRFSleep = ST25DV_ENABLE; + } else { + *pRFSleep = ST25DV_DISABLE; + } + return NFCTAG_OK; } - return NFCTAG_OK; - } - return status; + return status; } /** @@ -1189,20 +1189,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFSleep(ST25DV_EN_STATUS *const pR */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFSleep(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_RMNGT register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_RMNGT register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update RF Sleep field configuration */ - reg_value |= ST25DV_RF_MNGT_RFSLEEP_MASK; + /* Update RF Sleep field configuration */ + reg_value |= ST25DV_RF_MNGT_RFSLEEP_MASK; - /* Write RF_MNGT register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Write RF_MNGT register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); } /** @@ -1212,20 +1212,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFSleep(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFSleep(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_RMNGT register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_RMNGT register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update RF Sleep field configuration */ - reg_value &= ST25DV_RF_MNGT_RFSLEEP_FIELD; + /* Update RF Sleep field configuration */ + reg_value &= ST25DV_RF_MNGT_RFSLEEP_FIELD; - /* Write RF_MNGT register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Write RF_MNGT register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); } /** @@ -1235,23 +1235,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFSleep(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBMode(ST25DV_EN_STATUS *const pMB_mode) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of MB_MODE register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_MB_MODE_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of MB_MODE register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_MB_MODE_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Mailbox mode status */ - if ((reg_value & ST25DV_MB_MODE_RW_MASK) == ST25DV_MB_MODE_RW_MASK) { - *pMB_mode = ST25DV_ENABLE; - } else { - *pMB_mode = ST25DV_DISABLE; - } + /* Extract Mailbox mode status */ + if ((reg_value & ST25DV_MB_MODE_RW_MASK) == ST25DV_MB_MODE_RW_MASK) { + *pMB_mode = ST25DV_ENABLE; + } else { + *pMB_mode = ST25DV_DISABLE; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1262,13 +1262,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBMode(ST25DV_EN_STATUS *const pM */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMBMode(const ST25DV_EN_STATUS MB_mode) { - uint8_t reg_value; + uint8_t reg_value; - /* Update Mailbox mode status */ - reg_value = (uint8_t)MB_mode; + /* Update Mailbox mode status */ + reg_value = (uint8_t)MB_mode; - /* Write MB_MODE register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_MB_MODE_REG, 1); + /* Write MB_MODE register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_MB_MODE_REG, 1); } /** @@ -1278,19 +1278,19 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMBMode(const ST25DV_EN_STATUS MB */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBWDG(uint8_t *const pWdgDelay) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of MB_WDG register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_MB_WDG_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of MB_WDG register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_MB_WDG_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract watchdog coefficient delay configuration */ - *pWdgDelay = (reg_value & ST25DV_MB_WDG_DELAY_MASK) >> ST25DV_MB_WDG_DELAY_RW_SHIFT; + /* Extract watchdog coefficient delay configuration */ + *pWdgDelay = (reg_value & ST25DV_MB_WDG_DELAY_MASK) >> ST25DV_MB_WDG_DELAY_RW_SHIFT; - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1301,13 +1301,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBWDG(uint8_t *const pWdgDelay) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMBWDG(const uint8_t WdgDelay) { - uint8_t reg_value; + uint8_t reg_value; - /* Set Watchdog coefficient delay */ - reg_value = WdgDelay & ST25DV_MB_WDG_DELAY_MASK; + /* Set Watchdog coefficient delay */ + reg_value = WdgDelay & ST25DV_MB_WDG_DELAY_MASK; - /* Write MB_MODE register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_MB_WDG_REG, 1); + /* Write MB_MODE register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_MB_WDG_REG, 1); } /** @@ -1319,12 +1319,12 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMBWDG(const uint8_t WdgDelay) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMailboxData(uint8_t *const pData, const uint16_t Offset, const uint16_t NbByte) { - if (Offset > ST25DV_MAX_MAILBOX_LENGTH) { - return NFCTAG_ERROR; - } + if (Offset > ST25DV_MAX_MAILBOX_LENGTH) { + return NFCTAG_ERROR; + } - /* Read Data in user memory */ - return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, ST25DV_MAILBOX_RAM_REG + Offset, NbByte); + /* Read Data in user memory */ + return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, ST25DV_MAILBOX_RAM_REG + Offset, NbByte); } /** @@ -1335,17 +1335,17 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMailboxData(uint8_t *const pData, */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMailboxData(const uint8_t *const pData, const uint16_t NbByte) { - NFCTAG_StatusTypeDef status; + NFCTAG_StatusTypeDef status; - /* ST25DV can write a maximum of 256 bytes in Mailbox */ - if (NbByte < ST25DV_MAX_MAILBOX_LENGTH) { - /* Write NbByte data in memory */ - status = ST25DV_IO_MemWrite(pData, ST25DV_ADDR_DATA_I2C, ST25DV_MAILBOX_RAM_REG, NbByte); - } else { - status = NFCTAG_ERROR; - } + /* ST25DV can write a maximum of 256 bytes in Mailbox */ + if (NbByte < ST25DV_MAX_MAILBOX_LENGTH) { + /* Write NbByte data in memory */ + status = ST25DV_IO_MemWrite(pData, ST25DV_ADDR_DATA_I2C, ST25DV_MAILBOX_RAM_REG, NbByte); + } else { + status = NFCTAG_ERROR; + } - return status; + return status; } /** @@ -1357,11 +1357,11 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMailboxData(const uint8_t *const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMailboxRegister(uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - if ((TarAddr < ST25DV_GPO_DYN_REG) || (TarAddr > ST25DV_MB_LEN_DYN_REG)) { - return NFCTAG_ERROR; - } + if ((TarAddr < ST25DV_GPO_DYN_REG) || (TarAddr > ST25DV_MB_LEN_DYN_REG)) { + return NFCTAG_ERROR; + } - return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); + return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); } /** @@ -1373,21 +1373,21 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMailboxRegister(uint8_t *const pD */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMailboxRegister(const uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - NFCTAG_StatusTypeDef status; + NFCTAG_StatusTypeDef status; - if ((TarAddr < ST25DV_GPO_DYN_REG) || (TarAddr > ST25DV_MB_LEN_DYN_REG)) { - return NFCTAG_ERROR; - } + if ((TarAddr < ST25DV_GPO_DYN_REG) || (TarAddr > ST25DV_MB_LEN_DYN_REG)) { + return NFCTAG_ERROR; + } - /* ST25DV can write a maximum of 256 bytes in Mailbox */ - if (NbByte < ST25DV_MAX_MAILBOX_LENGTH) { - /* Write NbByte data in memory */ - status = ST25DV_IO_MemWrite(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); - } else { - status = NFCTAG_ERROR; - } + /* ST25DV can write a maximum of 256 bytes in Mailbox */ + if (NbByte < ST25DV_MAX_MAILBOX_LENGTH) { + /* Write NbByte data in memory */ + status = ST25DV_IO_MemWrite(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); + } else { + status = NFCTAG_ERROR; + } - return status; + return status; } /** @@ -1397,23 +1397,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMailboxRegister(const uint8_t *c */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadI2CSecuritySession_Dyn(ST25DV_I2CSSO_STATUS *const pSession) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of I2C_SSO_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_I2C_SSO_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of I2C_SSO_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_I2C_SSO_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Open session information */ - if ((reg_value & ST25DV_I2C_SSO_DYN_I2CSSO_MASK) == ST25DV_I2C_SSO_DYN_I2CSSO_MASK) { - *pSession = ST25DV_SESSION_OPEN; - } else { - *pSession = ST25DV_SESSION_CLOSED; - } + /* Extract Open session information */ + if ((reg_value & ST25DV_I2C_SSO_DYN_I2CSSO_MASK) == ST25DV_I2C_SSO_DYN_I2CSSO_MASK) { + *pSession = ST25DV_SESSION_OPEN; + } else { + *pSession = ST25DV_SESSION_CLOSED; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1432,8 +1432,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadI2CSecuritySession_Dyn(ST25DV_I2C */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadITSTStatus_Dyn(uint8_t *const pITStatus) { - /* Read value of ITStatus register */ - return ST25DV_i2c_ReadMailboxRegister(pITStatus, ST25DV_ITSTS_DYN_REG, 1); + /* Read value of ITStatus register */ + return ST25DV_i2c_ReadMailboxRegister(pITStatus, ST25DV_ITSTS_DYN_REG, 1); } /** @@ -1443,8 +1443,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadITSTStatus_Dyn(uint8_t *const pIT */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadGPO_Dyn(uint8_t *GPOConfig) { - /* Read actual value of ST25DV_GPO_DYN_REG register */ - return ST25DV_i2c_ReadMailboxRegister(GPOConfig, ST25DV_GPO_DYN_REG, 1); + /* Read actual value of ST25DV_GPO_DYN_REG register */ + return ST25DV_i2c_ReadMailboxRegister(GPOConfig, ST25DV_GPO_DYN_REG, 1); } @@ -1455,22 +1455,22 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadGPO_Dyn(uint8_t *GPOConfig) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetGPO_en_Dyn(ST25DV_EN_STATUS *const pGPO_en) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; - /* Read actual value of GPO_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + uint8_t reg_value; + NFCTAG_StatusTypeDef status; + /* Read actual value of GPO_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract GPO enable status information */ - if ((reg_value & ST25DV_GPO_DYN_ENABLE_MASK) == ST25DV_GPO_DYN_ENABLE_MASK) { - *pGPO_en = ST25DV_ENABLE; - } else { - *pGPO_en = ST25DV_DISABLE; - } + /* Extract GPO enable status information */ + if ((reg_value & ST25DV_GPO_DYN_ENABLE_MASK) == ST25DV_GPO_DYN_ENABLE_MASK) { + *pGPO_en = ST25DV_ENABLE; + } else { + *pGPO_en = ST25DV_DISABLE; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1480,20 +1480,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetGPO_en_Dyn(ST25DV_EN_STATUS *const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetGPO_en_Dyn(void) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of GPO_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of GPO_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update GPO enable configuration */ - reg_value |= ST25DV_GPO_DYN_ENABLE_MASK; + /* Update GPO enable configuration */ + reg_value |= ST25DV_GPO_DYN_ENABLE_MASK; - /* Write GPO_DYN Register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); + /* Write GPO_DYN Register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); } /** @@ -1503,20 +1503,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetGPO_en_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetGPO_en_Dyn(void) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of GPO_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of GPO_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update GPO enable configuration */ - reg_value &= ST25DV_GPO_DYN_ENABLE_FIELD; + /* Update GPO enable configuration */ + reg_value &= ST25DV_GPO_DYN_ENABLE_FIELD; - /* Write GPO_DYN Register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); + /* Write GPO_DYN Register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); } /** @@ -1526,45 +1526,45 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetGPO_en_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEHCtrl_Dyn(ST25DV_EH_CTRL *const pEH_CTRL) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; - - /* Read actual value of ST25DV_EH_CTRL_DYN_REG register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - - if (status == NFCTAG_OK) { - /* Extract EH EN Mode configuration */ - if ((reg_value & ST25DV_EH_CTRL_DYN_EH_EN_MASK) == ST25DV_EH_CTRL_DYN_EH_EN_MASK) { - pEH_CTRL->EH_EN_Mode = ST25DV_ENABLE; - } else { - pEH_CTRL->EH_EN_Mode = ST25DV_DISABLE; - } + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Extract EH_ON configuration */ - if ((reg_value & ST25DV_EH_CTRL_DYN_EH_ON_MASK) == ST25DV_EH_CTRL_DYN_EH_ON_MASK) { - pEH_CTRL->EH_on = ST25DV_ENABLE; - } else { - pEH_CTRL->EH_on = ST25DV_DISABLE; - } + /* Read actual value of ST25DV_EH_CTRL_DYN_REG register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - /* Extract FIELD_ON configuration */ - if ((reg_value & ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) == ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) { - pEH_CTRL->Field_on = ST25DV_ENABLE; - } else { - pEH_CTRL->Field_on = ST25DV_DISABLE; - } - - /* Extract VCC_ON configuration */ - if ((reg_value & ST25DV_EH_CTRL_DYN_VCC_ON_MASK) == ST25DV_EH_CTRL_DYN_VCC_ON_MASK) { - pEH_CTRL->VCC_on = ST25DV_ENABLE; - } else { - pEH_CTRL->VCC_on = ST25DV_DISABLE; + if (status == NFCTAG_OK) { + /* Extract EH EN Mode configuration */ + if ((reg_value & ST25DV_EH_CTRL_DYN_EH_EN_MASK) == ST25DV_EH_CTRL_DYN_EH_EN_MASK) { + pEH_CTRL->EH_EN_Mode = ST25DV_ENABLE; + } else { + pEH_CTRL->EH_EN_Mode = ST25DV_DISABLE; + } + + /* Extract EH_ON configuration */ + if ((reg_value & ST25DV_EH_CTRL_DYN_EH_ON_MASK) == ST25DV_EH_CTRL_DYN_EH_ON_MASK) { + pEH_CTRL->EH_on = ST25DV_ENABLE; + } else { + pEH_CTRL->EH_on = ST25DV_DISABLE; + } + + /* Extract FIELD_ON configuration */ + if ((reg_value & ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) == ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) { + pEH_CTRL->Field_on = ST25DV_ENABLE; + } else { + pEH_CTRL->Field_on = ST25DV_DISABLE; + } + + /* Extract VCC_ON configuration */ + if ((reg_value & ST25DV_EH_CTRL_DYN_VCC_ON_MASK) == ST25DV_EH_CTRL_DYN_VCC_ON_MASK) { + pEH_CTRL->VCC_on = ST25DV_ENABLE; + } else { + pEH_CTRL->VCC_on = ST25DV_DISABLE; + } + + return NFCTAG_OK; } - return NFCTAG_OK; - } - - return status; + return status; } /** @@ -1574,23 +1574,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEHCtrl_Dyn(ST25DV_EH_CTRL *const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetEHENMode_Dyn(ST25DV_EN_STATUS *const pEH_Val) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Energy Harvesting status information */ - if ((reg_value & ST25DV_EH_CTRL_DYN_EH_EN_MASK) == ST25DV_EH_CTRL_DYN_EH_EN_MASK) { - *pEH_Val = ST25DV_ENABLE; - } else { - *pEH_Val = ST25DV_DISABLE; - } + /* Extract Energy Harvesting status information */ + if ((reg_value & ST25DV_EH_CTRL_DYN_EH_EN_MASK) == ST25DV_EH_CTRL_DYN_EH_EN_MASK) { + *pEH_Val = ST25DV_ENABLE; + } else { + *pEH_Val = ST25DV_DISABLE; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1599,20 +1599,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetEHENMode_Dyn(ST25DV_EN_STATUS *con */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetEHENMode_Dyn(void) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update Energy Harvesting configuration */ - reg_value |= ST25DV_EH_CTRL_DYN_EH_EN_MASK; + /* Update Energy Harvesting configuration */ + reg_value |= ST25DV_EH_CTRL_DYN_EH_EN_MASK; - /* Write EH_CTRL_DYN Register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + /* Write EH_CTRL_DYN Register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); } /** @@ -1621,20 +1621,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetEHENMode_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetEHENMode_Dyn(void) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update Energy Harvesting configuration */ - reg_value &= ST25DV_EH_CTRL_DYN_EH_EN_FIELD; + /* Update Energy Harvesting configuration */ + reg_value &= ST25DV_EH_CTRL_DYN_EH_EN_FIELD; - /* Write EH_CTRL_DYN Register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + /* Write EH_CTRL_DYN Register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); } /** @@ -1644,23 +1644,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetEHENMode_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetEHON_Dyn(ST25DV_EN_STATUS *const pEHON) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - /* Extract RF Field information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_EH_CTRL_DYN_EH_ON_MASK) == ST25DV_EH_CTRL_DYN_EH_ON_MASK) { - *pEHON = ST25DV_ENABLE; - } else { - *pEHON = ST25DV_DISABLE; + /* Extract RF Field information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_EH_CTRL_DYN_EH_ON_MASK) == ST25DV_EH_CTRL_DYN_EH_ON_MASK) { + *pEHON = ST25DV_ENABLE; + } else { + *pEHON = ST25DV_DISABLE; + } + return NFCTAG_OK; } - return NFCTAG_OK; - } - return status; + return status; } /** @@ -1670,23 +1670,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetEHON_Dyn(ST25DV_EN_STATUS *const p */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFField_Dyn(ST25DV_FIELD_STATUS *const pRF_Field) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - /* Extract RF Field information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) == ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) { - *pRF_Field = ST25DV_FIELD_ON; - } else { - *pRF_Field = ST25DV_FIELD_OFF; + /* Extract RF Field information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) == ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) { + *pRF_Field = ST25DV_FIELD_ON; + } else { + *pRF_Field = ST25DV_FIELD_OFF; + } + return NFCTAG_OK; } - return NFCTAG_OK; - } - return status; + return status; } /** @@ -1696,23 +1696,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFField_Dyn(ST25DV_FIELD_STATUS *c */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetVCC_Dyn(ST25DV_VCC_STATUS *const pVCC) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - /* Extract VCC information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_EH_CTRL_DYN_VCC_ON_MASK) == ST25DV_EH_CTRL_DYN_VCC_ON_MASK) { - *pVCC = ST25DV_VCC_ON; - } else { - *pVCC = ST25DV_VCC_OFF; + /* Extract VCC information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_EH_CTRL_DYN_VCC_ON_MASK) == ST25DV_EH_CTRL_DYN_VCC_ON_MASK) { + *pVCC = ST25DV_VCC_ON; + } else { + *pVCC = ST25DV_VCC_OFF; + } + return NFCTAG_OK; } - return NFCTAG_OK; - } - return status; + return status; } /** @@ -1722,31 +1722,31 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetVCC_Dyn(ST25DV_VCC_STATUS *const p */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFMngt_Dyn(ST25DV_RF_MNGT *const pRF_Mngt) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - if (status == NFCTAG_OK) { - /* Extract RF Disable configuration */ - if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { - pRF_Mngt->RfDisable = ST25DV_ENABLE; - } else { - pRF_Mngt->RfDisable = ST25DV_DISABLE; - } - - /* Extract RF Sleep configuration */ - if ((reg_value & ST25DV_RF_MNGT_DYN_RFSLEEP_MASK) == ST25DV_RF_MNGT_DYN_RFSLEEP_MASK) { - pRF_Mngt->RfSleep = ST25DV_ENABLE; - } else { - pRF_Mngt->RfSleep = ST25DV_DISABLE; + if (status == NFCTAG_OK) { + /* Extract RF Disable configuration */ + if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { + pRF_Mngt->RfDisable = ST25DV_ENABLE; + } else { + pRF_Mngt->RfDisable = ST25DV_DISABLE; + } + + /* Extract RF Sleep configuration */ + if ((reg_value & ST25DV_RF_MNGT_DYN_RFSLEEP_MASK) == ST25DV_RF_MNGT_DYN_RFSLEEP_MASK) { + pRF_Mngt->RfSleep = ST25DV_ENABLE; + } else { + pRF_Mngt->RfSleep = ST25DV_DISABLE; + } + + return NFCTAG_OK; } - return NFCTAG_OK; - } - - return status; + return status; } /** @@ -1756,8 +1756,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFMngt_Dyn(ST25DV_RF_MNGT *const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFMngt_Dyn(const uint8_t RF_Mngt) { - /* Write value to RF_MNGT_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(&RF_Mngt, ST25DV_RF_MNGT_DYN_REG, 1); + /* Write value to RF_MNGT_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(&RF_Mngt, ST25DV_RF_MNGT_DYN_REG, 1); } /** @@ -1767,23 +1767,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFMngt_Dyn(const uint8_t RF_Mngt */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFDisable_Dyn(ST25DV_EN_STATUS *const pRFDisable) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - /* Extract RFDisable information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { - *pRFDisable = ST25DV_ENABLE; - } else { - *pRFDisable = ST25DV_DISABLE; + /* Extract RFDisable information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { + *pRFDisable = ST25DV_ENABLE; + } else { + *pRFDisable = ST25DV_DISABLE; + } + return NFCTAG_OK; } - return NFCTAG_OK; - } - return status; + return status; } /** @@ -1792,20 +1792,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFDisable_Dyn(ST25DV_EN_STATUS *co */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFDisable_Dyn(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update dynamic RF Disable field */ - reg_value |= ST25DV_RF_MNGT_DYN_RFDIS_MASK; + /* Update dynamic RF Disable field */ + reg_value |= ST25DV_RF_MNGT_DYN_RFDIS_MASK; - /* Write RF_MNGT_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Write RF_MNGT_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); } /** @@ -1814,20 +1814,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFDisable_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFDisable_Dyn(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update dynamic RF Disable field configuration */ - reg_value &= ST25DV_RF_MNGT_DYN_RFDIS_FIELD; + /* Update dynamic RF Disable field configuration */ + reg_value &= ST25DV_RF_MNGT_DYN_RFDIS_FIELD; - /* Write RF_MNGT_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Write RF_MNGT_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); } /** @@ -1837,23 +1837,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFDisable_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFSleep_Dyn(ST25DV_EN_STATUS *const pRFSleep) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - /* Extract RFSleep information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { - *pRFSleep = ST25DV_ENABLE; - } else { - *pRFSleep = ST25DV_DISABLE; + /* Extract RFSleep information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { + *pRFSleep = ST25DV_ENABLE; + } else { + *pRFSleep = ST25DV_DISABLE; + } + return NFCTAG_OK; } - return NFCTAG_OK; - } - return status; + return status; } /** @@ -1862,20 +1862,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFSleep_Dyn(ST25DV_EN_STATUS *cons */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFSleep_Dyn(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update dynamic RF Disable field configuration */ - reg_value |= ST25DV_RF_MNGT_DYN_RFSLEEP_MASK; + /* Update dynamic RF Disable field configuration */ + reg_value |= ST25DV_RF_MNGT_DYN_RFSLEEP_MASK; - /* Write RF_MNGT_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Write RF_MNGT_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); } /** @@ -1884,20 +1884,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFSleep_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFSleep_Dyn(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update dynamic RF Disable field configuration */ - reg_value &= ST25DV_RF_MNGT_DYN_RFSLEEP_FIELD; + /* Update dynamic RF Disable field configuration */ + reg_value &= ST25DV_RF_MNGT_DYN_RFSLEEP_FIELD; - /* Write RF_MNGT_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Write RF_MNGT_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); } /** @@ -1907,24 +1907,24 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFSleep_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBCtrl_Dyn(ST25DV_MB_CTRL_DYN_STATUS *const pCtrlStatus) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read MB_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read MB_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Mailbox ctrl information */ - pCtrlStatus->MbEnable = (reg_value & ST25DV_MB_CTRL_DYN_MBEN_MASK) >> ST25DV_MB_CTRL_DYN_MBEN_SHIFT; - pCtrlStatus->HostPutMsg = (reg_value & ST25DV_MB_CTRL_DYN_HOSTPUTMSG_MASK) >> ST25DV_MB_CTRL_DYN_HOSTPUTMSG_SHIFT; - pCtrlStatus->RfPutMsg = (reg_value & ST25DV_MB_CTRL_DYN_RFPUTMSG_MASK) >> ST25DV_MB_CTRL_DYN_RFPUTMSG_SHIFT; - pCtrlStatus->HostMissMsg = (reg_value & ST25DV_MB_CTRL_DYN_HOSTMISSMSG_MASK) >> ST25DV_MB_CTRL_DYN_HOSTMISSMSG_SHIFT; - pCtrlStatus->RFMissMsg = (reg_value & ST25DV_MB_CTRL_DYN_RFMISSMSG_MASK) >> ST25DV_MB_CTRL_DYN_RFMISSMSG_SHIFT; - pCtrlStatus->CurrentMsg = (ST25DV_CURRENT_MSG)((reg_value & ST25DV_MB_CTRL_DYN_CURRENTMSG_MASK) >> ST25DV_MB_CTRL_DYN_CURRENTMSG_SHIFT); + /* Extract Mailbox ctrl information */ + pCtrlStatus->MbEnable = (reg_value & ST25DV_MB_CTRL_DYN_MBEN_MASK) >> ST25DV_MB_CTRL_DYN_MBEN_SHIFT; + pCtrlStatus->HostPutMsg = (reg_value & ST25DV_MB_CTRL_DYN_HOSTPUTMSG_MASK) >> ST25DV_MB_CTRL_DYN_HOSTPUTMSG_SHIFT; + pCtrlStatus->RfPutMsg = (reg_value & ST25DV_MB_CTRL_DYN_RFPUTMSG_MASK) >> ST25DV_MB_CTRL_DYN_RFPUTMSG_SHIFT; + pCtrlStatus->HostMissMsg = (reg_value & ST25DV_MB_CTRL_DYN_HOSTMISSMSG_MASK) >> ST25DV_MB_CTRL_DYN_HOSTMISSMSG_SHIFT; + pCtrlStatus->RFMissMsg = (reg_value & ST25DV_MB_CTRL_DYN_RFMISSMSG_MASK) >> ST25DV_MB_CTRL_DYN_RFMISSMSG_SHIFT; + pCtrlStatus->CurrentMsg = (ST25DV_CURRENT_MSG)((reg_value & ST25DV_MB_CTRL_DYN_CURRENTMSG_MASK) >> ST25DV_MB_CTRL_DYN_CURRENTMSG_SHIFT); - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1933,22 +1933,22 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBCtrl_Dyn(ST25DV_MB_CTRL_DYN_STA */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetMBEN_Dyn(ST25DV_EN_STATUS *const pMBEN) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read MB_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read MB_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - if ((reg_value & ST25DV_MB_MODE_RW_MASK) == ST25DV_MB_MODE_RW_MASK) { - *pMBEN = ST25DV_ENABLE; - } else { - *pMBEN = ST25DV_DISABLE; - } + if ((reg_value & ST25DV_MB_MODE_RW_MASK) == ST25DV_MB_MODE_RW_MASK) { + *pMBEN = ST25DV_ENABLE; + } else { + *pMBEN = ST25DV_DISABLE; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1957,13 +1957,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetMBEN_Dyn(ST25DV_EN_STATUS *const p */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetMBEN_Dyn(void) { - uint8_t reg_value; + uint8_t reg_value; - /* Set dynamic Mailbox enable */ - reg_value = ST25DV_MB_CTRL_DYN_MBEN_MASK; + /* Set dynamic Mailbox enable */ + reg_value = ST25DV_MB_CTRL_DYN_MBEN_MASK; - /* Write MB_CTRL_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); + /* Write MB_CTRL_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); } /** @@ -1972,13 +1972,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetMBEN_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetMBEN_Dyn(void) { - uint8_t reg_value; + uint8_t reg_value; - /* Set dynamic Mailbox disable */ - reg_value = 0; + /* Set dynamic Mailbox disable */ + reg_value = 0; - /* Write MB_CTRL_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); + /* Write MB_CTRL_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); } /** @@ -1988,26 +1988,26 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetMBEN_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBLength_Dyn(uint8_t *const pMBLength) { - /* Read actual value of MBLEN_DYN register */ - return ST25DV_i2c_ReadMailboxRegister(pMBLength, ST25DV_MB_LEN_DYN_REG, 1); + /* Read actual value of MBLEN_DYN register */ + return ST25DV_i2c_ReadMailboxRegister(pMBLength, ST25DV_MB_LEN_DYN_REG, 1); } int32_t ST25DV_IO::get_gpo() { - return _gpo; + return _gpo; } int32_t ST25DV_IO::get_lpd() { - return _lpd; + return _lpd; } TwoWire *ST25DV_IO::get_pwire() { - return _pwire; + return _pwire; } Stream *ST25DV_IO::get_pserial() { - return _serial; + return _serial; } diff --git a/src/ST25DV_IO/st25dv_io.h b/src/ST25DV_IO/st25dv_io.h index b579ef6..1468103 100644 --- a/src/ST25DV_IO/st25dv_io.h +++ b/src/ST25DV_IO/st25dv_io.h @@ -36,7 +36,7 @@ #define I_AM_ST25DV64KC 0x51 #ifndef NULL - #define NULL (void *) 0 +#define NULL (void *) 0 #endif #define NFCTAG_4K_SIZE ((uint32_t) 0x200) @@ -336,242 +336,242 @@ * @brief ST25DV Ack Nack enumerator definition */ typedef enum { - I2CANSW_ACK = 0, - I2CANSW_NACK + I2CANSW_ACK = 0, + I2CANSW_NACK } ST25DV_I2CANSW_E; /** * @brief NFCTAG status enumerator definition. */ typedef enum { - NFCTAG_OK = 0, - NFCTAG_ERROR = 1, - NFCTAG_BUSY = 2, - NFCTAG_TIMEOUT = 3, - NFCTAG_NACK = 4 + NFCTAG_OK = 0, + NFCTAG_ERROR = 1, + NFCTAG_BUSY = 2, + NFCTAG_TIMEOUT = 3, + NFCTAG_NACK = 4 } NFCTAG_StatusTypeDef; /** * @brief ST25DV Enable Disable enumerator definition. */ typedef enum { - ST25DV_DISABLE = 0, - ST25DV_ENABLE + ST25DV_DISABLE = 0, + ST25DV_ENABLE } ST25DV_EN_STATUS; /** * @brief ST25DV Energy Harvesting mode enumerator definition. */ typedef enum { - ST25DV_EH_ACTIVE_AFTER_BOOT = 0, - ST25DV_EH_ON_DEMAND + ST25DV_EH_ACTIVE_AFTER_BOOT = 0, + ST25DV_EH_ON_DEMAND } ST25DV_EH_MODE_STATUS; /** * @brief ST25DV FIELD status enumerator definition. */ typedef enum { - ST25DV_FIELD_OFF = 0, - ST25DV_FIELD_ON + ST25DV_FIELD_OFF = 0, + ST25DV_FIELD_ON } ST25DV_FIELD_STATUS; /** * @brief ST25DV VCC status enumerator definition */ typedef enum { - ST25DV_VCC_OFF = 0, - ST25DV_VCC_ON + ST25DV_VCC_OFF = 0, + ST25DV_VCC_ON } ST25DV_VCC_STATUS; /** * @brief ST25DV protection status enumerator definition */ typedef enum { - ST25DV_NO_PROT = 0, - ST25DV_WRITE_PROT, - ST25DV_READ_PROT, - ST25DV_READWRITE_PROT + ST25DV_NO_PROT = 0, + ST25DV_WRITE_PROT, + ST25DV_READ_PROT, + ST25DV_READWRITE_PROT } ST25DV_PROTECTION_CONF; /** * @brief ST25DV area protection enumerator definition. */ typedef enum { - ST25DV_PROT_ZONE1 = 0, - ST25DV_PROT_ZONE2, - ST25DV_PROT_ZONE3, - ST25DV_PROT_ZONE4 + ST25DV_PROT_ZONE1 = 0, + ST25DV_PROT_ZONE2, + ST25DV_PROT_ZONE3, + ST25DV_PROT_ZONE4 } ST25DV_PROTECTION_ZONE; /** * @brief ST25DV password protection status enumerator definition. */ typedef enum { - ST25DV_NOT_PROTECTED = 0, - ST25DV_PROT_PASSWD1, - ST25DV_PROT_PASSWD2, - ST25DV_PROT_PASSWD3 + ST25DV_NOT_PROTECTED = 0, + ST25DV_PROT_PASSWD1, + ST25DV_PROT_PASSWD2, + ST25DV_PROT_PASSWD3 } ST25DV_PASSWD_PROT_STATUS; /** * @brief ST25DV lock status enumerator definition. */ typedef enum { - ST25DV_UNLOCKED = 0, - ST25DV_LOCKED + ST25DV_UNLOCKED = 0, + ST25DV_LOCKED } ST25DV_LOCK_STATUS; /** * @brief ST25DV Number of Blocks for the CCFile enumerator definition. */ typedef enum { - ST25DV_CCFILE_1BLCK = 0, - ST25DV_CCFILE_2BLCK + ST25DV_CCFILE_1BLCK = 0, + ST25DV_CCFILE_2BLCK } ST25DV_CCFILE_BLOCK; /** * @brief ST25DV session status enumerator definition. */ typedef enum { - ST25DV_SESSION_CLOSED = 0, - ST25DV_SESSION_OPEN + ST25DV_SESSION_CLOSED = 0, + ST25DV_SESSION_OPEN } ST25DV_I2CSSO_STATUS; /** * @brief ST25DV area end address enumerator definition. */ typedef enum { - ST25DV_ZONE_END1 = 0, - ST25DV_ZONE_END2, - ST25DV_ZONE_END3 + ST25DV_ZONE_END1 = 0, + ST25DV_ZONE_END2, + ST25DV_ZONE_END3 } ST25DV_END_ZONE; /** * @brief ST25DV IT pulse duration enumerator definition. */ typedef enum { - ST25DV_302_US = 0, - ST25DV_264_US, - ST25DV_226_US, - ST25DV_188_US, - ST25DV_151_US, - ST25DV_113_US, - ST25DV_75_US, - ST25DV_37_US + ST25DV_302_US = 0, + ST25DV_264_US, + ST25DV_226_US, + ST25DV_188_US, + ST25DV_151_US, + ST25DV_113_US, + ST25DV_75_US, + ST25DV_37_US } ST25DV_PULSE_DURATION; /** * @brief ST25DV Mailbox Current Message enumerator definition */ typedef enum { - ST25DV_NO_MSG = 0, - ST25DV_HOST_MSG, - ST25DV_RF_MSG + ST25DV_NO_MSG = 0, + ST25DV_HOST_MSG, + ST25DV_RF_MSG } ST25DV_CURRENT_MSG; /** * @brief ST25DV EH Ctrl structure definition */ typedef struct { - ST25DV_EN_STATUS EH_EN_Mode; - ST25DV_EN_STATUS EH_on; - ST25DV_EN_STATUS Field_on; - ST25DV_EN_STATUS VCC_on; + ST25DV_EN_STATUS EH_EN_Mode; + ST25DV_EN_STATUS EH_on; + ST25DV_EN_STATUS Field_on; + ST25DV_EN_STATUS VCC_on; } ST25DV_EH_CTRL; /** * @brief ST25DV GPO structure definition */ typedef struct { - ST25DV_EN_STATUS GPO_RFUser_en; - ST25DV_EN_STATUS GPO_RFActivity_en; - ST25DV_EN_STATUS GPO_RFInterrupt_en; - ST25DV_EN_STATUS GPO_FieldChange_en; - ST25DV_EN_STATUS GPO_RFPutMsg_en; - ST25DV_EN_STATUS GPO_RFGetMsg_en; - ST25DV_EN_STATUS GPO_RFWrite_en; - ST25DV_EN_STATUS GPO_Enable; + ST25DV_EN_STATUS GPO_RFUser_en; + ST25DV_EN_STATUS GPO_RFActivity_en; + ST25DV_EN_STATUS GPO_RFInterrupt_en; + ST25DV_EN_STATUS GPO_FieldChange_en; + ST25DV_EN_STATUS GPO_RFPutMsg_en; + ST25DV_EN_STATUS GPO_RFGetMsg_en; + ST25DV_EN_STATUS GPO_RFWrite_en; + ST25DV_EN_STATUS GPO_Enable; } ST25DV_GPO; /** * @brief ST25DV RF Management structure definition. */ typedef struct { - ST25DV_EN_STATUS RfDisable; - ST25DV_EN_STATUS RfSleep; + ST25DV_EN_STATUS RfDisable; + ST25DV_EN_STATUS RfSleep; } ST25DV_RF_MNGT; /** * @brief ST25DV RF Area protection structure definition. */ typedef struct { - ST25DV_PASSWD_PROT_STATUS PasswdCtrl; - ST25DV_PROTECTION_CONF RWprotection; + ST25DV_PASSWD_PROT_STATUS PasswdCtrl; + ST25DV_PROTECTION_CONF RWprotection; } ST25DV_RF_PROT_ZONE; /** * @brief ST25DV I2C Area protection structure definition. */ typedef struct { - ST25DV_PROTECTION_CONF ProtectZone1; - ST25DV_PROTECTION_CONF ProtectZone2; - ST25DV_PROTECTION_CONF ProtectZone3; - ST25DV_PROTECTION_CONF ProtectZone4; + ST25DV_PROTECTION_CONF ProtectZone1; + ST25DV_PROTECTION_CONF ProtectZone2; + ST25DV_PROTECTION_CONF ProtectZone3; + ST25DV_PROTECTION_CONF ProtectZone4; } ST25DV_I2C_PROT_ZONE; /** * @brief ST25DV MB_CTRL_DYN register structure definition. */ typedef struct { - uint8_t MbEnable; - uint8_t HostPutMsg; - uint8_t RfPutMsg; - uint8_t HostMissMsg; - uint8_t RFMissMsg; - ST25DV_CURRENT_MSG CurrentMsg; + uint8_t MbEnable; + uint8_t HostPutMsg; + uint8_t RfPutMsg; + uint8_t HostMissMsg; + uint8_t RFMissMsg; + ST25DV_CURRENT_MSG CurrentMsg; } ST25DV_MB_CTRL_DYN_STATUS; /** * @brief ST25DV Lock CCFile structure definition. */ typedef struct { - ST25DV_LOCK_STATUS LckBck0; - ST25DV_LOCK_STATUS LckBck1; + ST25DV_LOCK_STATUS LckBck0; + ST25DV_LOCK_STATUS LckBck1; } ST25DV_LOCK_CCFILE; /** * @brief ST25DV Memory size structure definition. */ typedef struct { - uint8_t BlockSize; - uint16_t Mem_Size; + uint8_t BlockSize; + uint16_t Mem_Size; } ST25DV_MEM_SIZE; /** * @brief ST25DV UID information structure definition. */ typedef struct { - uint32_t MsbUid; - uint32_t LsbUid; + uint32_t MsbUid; + uint32_t LsbUid; } ST25DV_UID; /** * @brief ST25DV Password structure definition. */ typedef struct { - uint32_t MsbPasswd; - uint32_t LsbPasswd; + uint32_t MsbPasswd; + uint32_t LsbPasswd; } ST25DV_PASSWD; #if defined(ARDUINO_SAM_DUE) - #define WIRE Wire1 +#define WIRE Wire1 #else - #define WIRE Wire +#define WIRE Wire #endif class ST25DV_IO { - public: +public: ST25DV_IO(int32_t gpo, int32_t ldp, TwoWire *i2c, Stream *serial = NULL); NFCTAG_StatusTypeDef ST25DV_i2c_Init(void); @@ -664,7 +664,7 @@ class ST25DV_IO { TwoWire *get_pwire(); Stream *get_pserial(); - protected: +protected: int32_t _gpo; int32_t _lpd; TwoWire *_pwire; diff --git a/src/libNDEF/NDEF_class.h b/src/libNDEF/NDEF_class.h index de4b0f4..51eb737 100755 --- a/src/libNDEF/NDEF_class.h +++ b/src/libNDEF/NDEF_class.h @@ -19,16 +19,16 @@ * @brief Tag Type 5 State enumeration definition. */ typedef enum { - TT5_NO_NDEF = 0, /**< No data detected in the tag. */ - TT5_INITIALIZED, /**< Capability container detected. */ - TT5_READ_WRITE, /**< Read-Write data detected. */ - TT5_READ /**< Read-Only data message detected. */ + TT5_NO_NDEF = 0, /**< No data detected in the tag. */ + TT5_INITIALIZED, /**< Capability container detected. */ + TT5_READ_WRITE, /**< Read-Write data detected. */ + TT5_READ /**< Read-Only data message detected. */ } TT5_State; /** @brief Type5 Tag Capability Container Magic numbers as defined by the NFC Forum. */ typedef enum { - NFCT5_MAGICNUMBER_E1_CCFILE = 0xE1, /**< Complete data area can be read by 1-byte block adrdess commands. */ - NFCT5_MAGICNUMBER_E2_CCFILE = 0xE2 /**< Last part of the data area can be only read by 2-bytes block address commands.\n + NFCT5_MAGICNUMBER_E1_CCFILE = 0xE1, /**< Complete data area can be read by 1-byte block adrdess commands. */ + NFCT5_MAGICNUMBER_E2_CCFILE = 0xE2 /**< Last part of the data area can be only read by 2-bytes block address commands.\n The first 256 blocks can be read by 1-byte block address commands. */ } TT5_MagicNumber_t; @@ -36,25 +36,25 @@ typedef enum { * @brief Type5 Tag Capability Container structure. */ typedef struct { - TT5_MagicNumber_t MagicNumber; /**< CCfile[0]: Magic Number should be E1h or E2h (for extended API) */ - uint8_t Version; /**< CCfile[1]: Capability container version (b7-b4) and access conditions (b3-b0) */ - uint8_t MemorySize; /**< CCfile[2]: Memory size, expressed in 8 bytes blocks, set to 0 if tag size is greater than 16kbits. */ - uint8_t TT5Tag; /**< CCfile[3]: Additional information on the Type5 Tag:\n + TT5_MagicNumber_t MagicNumber; /**< CCfile[0]: Magic Number should be E1h or E2h (for extended API) */ + uint8_t Version; /**< CCfile[1]: Capability container version (b7-b4) and access conditions (b3-b0) */ + uint8_t MemorySize; /**< CCfile[2]: Memory size, expressed in 8 bytes blocks, set to 0 if tag size is greater than 16kbits. */ + uint8_t TT5Tag; /**< CCfile[3]: Additional information on the Type5 Tag:\n b0: supports `read multiple block` commands\n b1: RFU\n b2: RFU\n b3: supports `lock block` commands\n b4: requires the `special frame` format */ - uint8_t rsved1; /**< RFU */ - uint8_t rsved2; /**< RFU */ - uint16_t ExtMemorySize; /**< CCfile[6],CCfile[7]: Memory size, expressed in 8 bytes blocks, when tag size is greater than 16kbits. */ - TT5_State State; /**< Indicates if a NDEF message is present. */ - uint32_t NDEF_offset; /**< Indicates the address of a NDEF message in the tag. */ + uint8_t rsved1; /**< RFU */ + uint8_t rsved2; /**< RFU */ + uint16_t ExtMemorySize; /**< CCfile[6],CCfile[7]: Memory size, expressed in 8 bytes blocks, when tag size is greater than 16kbits. */ + TT5_State State; /**< Indicates if a NDEF message is present. */ + uint32_t NDEF_offset; /**< Indicates the address of a NDEF message in the tag. */ } sCCFileInfo; class NDEF { - public: +public: NDEF(ST25DV_IO *dev); uint16_t begin(); @@ -162,7 +162,7 @@ class NDEF { //Email static void NDEF_FillEmailStruct(uint8_t *pPayload, uint32_t PayloadSize, sEmailInfo *pEmailStruct); void NDEF_ReadURI_Email(sRecordInfo_t *pRecordStruct, sEmailInfo *pEmailStruct); - private: +private: //Geo static void NDEF_FillGeoStruct(uint8_t *pPayload, uint32_t PayloadSize, sGeoInfo *pGeoStruct); @@ -219,7 +219,7 @@ class NDEF { /** @brief Capability Container structure instance (global). */ sCCFileInfo CCFileStruct; - private: +private: ST25DV_IO *mydev; }; diff --git a/src/libNDEF/NDEFcommon.h b/src/libNDEF/NDEFcommon.h index 9f1610b..3eaa5fb 100755 --- a/src/libNDEF/NDEFcommon.h +++ b/src/libNDEF/NDEFcommon.h @@ -40,19 +40,19 @@ * @brief GPO status information structure definition */ typedef struct { - uint8_t WritenEEPROM; - uint8_t RfBusy; - uint8_t FieldOn; - uint8_t FieldOff; - uint8_t MsgInMailbox; - uint8_t MailboxMsgRead; - uint8_t RfInterrupt; - uint8_t Rfuser; + uint8_t WritenEEPROM; + uint8_t RfBusy; + uint8_t FieldOn; + uint8_t FieldOff; + uint8_t MsgInMailbox; + uint8_t MailboxMsgRead; + uint8_t RfInterrupt; + uint8_t Rfuser; } IT_GPO_STATUS; /* Exported macro ------------------------------------------------------------*/ #ifndef MIN - #define MIN(x, y) (((x) < (y)) ? (x) : (y)) +#define MIN(x, y) (((x) < (y)) ? (x) : (y)) #endif /* diff --git a/src/libNDEF/lib_NDEF.cpp b/src/libNDEF/lib_NDEF.cpp index 115d5af..f23f151 100755 --- a/src/libNDEF/lib_NDEF.cpp +++ b/src/libNDEF/lib_NDEF.cpp @@ -59,54 +59,54 @@ NDEF::NDEF(ST25DV_IO *dev) { - mydev = dev; - SPRecordStructAdd[0] = &SPRecordStruct1; - SPRecordStructAdd[1] = &SPRecordStruct2; - SPRecordStructAdd[2] = &SPRecordStruct3; - SPRecordStructAdd[3] = &SPRecordStruct4; + mydev = dev; + SPRecordStructAdd[0] = &SPRecordStruct1; + SPRecordStructAdd[1] = &SPRecordStruct2; + SPRecordStructAdd[2] = &SPRecordStruct3; + SPRecordStructAdd[3] = &SPRecordStruct4; } uint16_t NDEF::begin() { - return begin(NULL, 0); + return begin(NULL, 0); } uint16_t NDEF::begin(uint8_t *buffer, uint16_t bufferLength) { - int ret = NDEF_OK; - - if (buffer == NULL) { - NDEF_Buffer = NDEF_Default_Buffer; - NDEF_Buffer_size = NDEF_MAX_SIZE; - } else { - // TODO should we check minimum buffer length? - NDEF_Buffer = buffer; - NDEF_Buffer_size = bufferLength; - } - - if (NfcType5_NDEFDetection() != NDEF_OK) { - CCFileStruct.MagicNumber = NFCT5_MAGICNUMBER_E1_CCFILE; - CCFileStruct.Version = NFCT5_VERSION_V1_0; - CCFileStruct.MemorySize = (ST25DV_MAX_SIZE / 8) & 0xFF; - CCFileStruct.TT5Tag = 0x05; - /* Init of the Type Tag 5 component (M24LR) */ - ret = NfcType5_TT5Init(); - } - return ret; + int ret = NDEF_OK; + + if (buffer == NULL) { + NDEF_Buffer = NDEF_Default_Buffer; + NDEF_Buffer_size = NDEF_MAX_SIZE; + } else { + // TODO should we check minimum buffer length? + NDEF_Buffer = buffer; + NDEF_Buffer_size = bufferLength; + } + + if (NfcType5_NDEFDetection() != NDEF_OK) { + CCFileStruct.MagicNumber = NFCT5_MAGICNUMBER_E1_CCFILE; + CCFileStruct.Version = NFCT5_VERSION_V1_0; + CCFileStruct.MemorySize = (ST25DV_MAX_SIZE / 8) & 0xFF; + CCFileStruct.TT5Tag = 0x05; + /* Init of the Type Tag 5 component (M24LR) */ + ret = NfcType5_TT5Init(); + } + return ret; } uint16_t NDEF::NDEF_IsNDEFPresent(void) { - uint16_t FileSize; + uint16_t FileSize; - /* Check NDEF existence */ - NfcTag_GetLength(&FileSize); + /* Check NDEF existence */ + NfcTag_GetLength(&FileSize); - if (FileSize != 0) { - return NDEF_OK; - } else { - return NDEF_ERROR; - } + if (FileSize != 0) { + return NDEF_OK; + } else { + return NDEF_ERROR; + } } /** @@ -117,64 +117,64 @@ uint16_t NDEF::NDEF_IsNDEFPresent(void) */ uint16_t NDEF::NDEF_IdentifySPRecord(sRecordInfo_t *pRecordStruct, uint8_t *pPayload) { - uint16_t status = NDEF_ERROR; - uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; - - /* Is ID length field present */ - if ((*pPayload) & IL_Mask) { - IDLengthField = ID_LENGTH_FIELD; - } else { - IDLengthField = 0; - } - - /* it's a SR */ - if ((*pPayload) & SR_Mask) { - TypeNbByte = pPayload[1]; - PayloadLengthField = 1; - if (IDLengthField == ID_LENGTH_FIELD) { - IDNbByte = pPayload[3]; + uint16_t status = NDEF_ERROR; + uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; + + /* Is ID length field present */ + if ((*pPayload) & IL_Mask) { + IDLengthField = ID_LENGTH_FIELD; } else { - IDNbByte = 0; + IDLengthField = 0; } - } else { - TypeNbByte = pPayload[1]; - PayloadLengthField = 4; - if (IDLengthField == ID_LENGTH_FIELD) { - IDNbByte = pPayload[6]; + + /* it's a SR */ + if ((*pPayload) & SR_Mask) { + TypeNbByte = pPayload[1]; + PayloadLengthField = 1; + if (IDLengthField == ID_LENGTH_FIELD) { + IDNbByte = pPayload[3]; + } else { + IDNbByte = 0; + } } else { - IDNbByte = 0; + TypeNbByte = pPayload[1]; + PayloadLengthField = 4; + if (IDLengthField == ID_LENGTH_FIELD) { + IDNbByte = pPayload[6]; + } else { + IDNbByte = 0; + } } - } - - SizeOfRecordHeader = RECORD_FLAG_FIELD + TYPE_LENGTH_FIELD + PayloadLengthField + IDLengthField + TypeNbByte + IDNbByte; - - /* it's a SR */ - if (pPayload[0] & SR_Mask) { - pRecordStruct->RecordFlags = pPayload[0]; - pRecordStruct->TypeLength = TypeNbByte; - pRecordStruct->PayloadLength = pPayload[2]; - pRecordStruct->IDLength = IDNbByte; - memcpy(pRecordStruct->Type, &pPayload[3 + IDNbByte], TypeNbByte); - memcpy(pRecordStruct->ID, &pPayload[3 + IDNbByte + TypeNbByte], IDNbByte); - pRecordStruct->PayloadOffset = SizeOfRecordHeader; - } else { - pRecordStruct->RecordFlags = pPayload[0]; - pRecordStruct->TypeLength = TypeNbByte; - pRecordStruct->PayloadLength = (((uint32_t)pPayload[2]) << 24) | - (((uint32_t)pPayload[3]) << 16) | - (((uint32_t)pPayload[4]) << 8) - | pPayload[5] ; - pRecordStruct->IDLength = IDNbByte; - memcpy(pRecordStruct->Type, &pPayload[6 + IDNbByte], TypeNbByte); - memcpy(pRecordStruct->ID, &pPayload[6 + IDNbByte + TypeNbByte], IDNbByte); - pRecordStruct->PayloadOffset = SizeOfRecordHeader; - } - - pRecordStruct->PayloadBufferAdd = pPayload + SizeOfRecordHeader ; - - status = NDEF_ParseRecordHeader(pRecordStruct); - - return status; + + SizeOfRecordHeader = RECORD_FLAG_FIELD + TYPE_LENGTH_FIELD + PayloadLengthField + IDLengthField + TypeNbByte + IDNbByte; + + /* it's a SR */ + if (pPayload[0] & SR_Mask) { + pRecordStruct->RecordFlags = pPayload[0]; + pRecordStruct->TypeLength = TypeNbByte; + pRecordStruct->PayloadLength = pPayload[2]; + pRecordStruct->IDLength = IDNbByte; + memcpy(pRecordStruct->Type, &pPayload[3 + IDNbByte], TypeNbByte); + memcpy(pRecordStruct->ID, &pPayload[3 + IDNbByte + TypeNbByte], IDNbByte); + pRecordStruct->PayloadOffset = SizeOfRecordHeader; + } else { + pRecordStruct->RecordFlags = pPayload[0]; + pRecordStruct->TypeLength = TypeNbByte; + pRecordStruct->PayloadLength = (((uint32_t)pPayload[2]) << 24) | + (((uint32_t)pPayload[3]) << 16) | + (((uint32_t)pPayload[4]) << 8) + | pPayload[5] ; + pRecordStruct->IDLength = IDNbByte; + memcpy(pRecordStruct->Type, &pPayload[6 + IDNbByte], TypeNbByte); + memcpy(pRecordStruct->ID, &pPayload[6 + IDNbByte + TypeNbByte], IDNbByte); + pRecordStruct->PayloadOffset = SizeOfRecordHeader; + } + + pRecordStruct->PayloadBufferAdd = pPayload + SizeOfRecordHeader ; + + status = NDEF_ParseRecordHeader(pRecordStruct); + + return status; } /** @@ -185,27 +185,27 @@ uint16_t NDEF::NDEF_IdentifySPRecord(sRecordInfo_t *pRecordStruct, uint8_t *pPay */ uint16_t NDEF::NDEF_ParseRecordHeader(sRecordInfo_t *pRecordStruct) { - uint16_t status = NDEF_OK; + uint16_t status = NDEF_OK; - switch ((pRecordStruct->RecordFlags & TNF_Mask)) { + switch ((pRecordStruct->RecordFlags & TNF_Mask)) { case TNF_WellKnown: - NDEF_ParseWellKnownType(pRecordStruct); - break; + NDEF_ParseWellKnownType(pRecordStruct); + break; case TNF_MediaType: - NDEF_ParseMediaType(pRecordStruct); - break; + NDEF_ParseMediaType(pRecordStruct); + break; case TNF_NFCForumExternal: - NDEF_ParseForumExternalType(pRecordStruct); - break; + NDEF_ParseForumExternalType(pRecordStruct); + break; default: - /* currently not supported or unknown*/ - pRecordStruct->NDEF_Type = UNKNOWN_TYPE; - status = NDEF_ERROR; - } - return status; + /* currently not supported or unknown*/ + pRecordStruct->NDEF_Type = UNKNOWN_TYPE; + status = NDEF_ERROR; + } + return status; } /** @@ -214,41 +214,41 @@ uint16_t NDEF::NDEF_ParseRecordHeader(sRecordInfo_t *pRecordStruct) */ void NDEF::NDEF_ParseWellKnownType(sRecordInfo_t *pRecordStruct) { - uint8_t *pPayload; - - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - - if (!memcmp(&(pRecordStruct->Type), SMART_POSTER_TYPE_STRING, pRecordStruct->TypeLength)) { - /* special case where we have to parse others records */ - pRecordStruct->NDEF_Type = SMARTPOSTER_TYPE; - NDEF_ParseSP(pRecordStruct); - } - - else if (!memcmp(&(pRecordStruct->Type), URI_TYPE_STRING, pRecordStruct->TypeLength)) { - /* it's an URI Type check if it's an URL or SMS or ... */ - /* check identifier */ - if (*pPayload == URI_ID_0x00) { - NDEF_ParseURI(pRecordStruct); - } else if ((*pPayload > URI_ID_0x00) && (*pPayload < URI_RFU)) { - /* email special case */ - if (*pPayload == (uint8_t) URI_ID_0x06) { - pRecordStruct->NDEF_Type = URI_EMAIL_TYPE; - } else { - pRecordStruct->NDEF_Type = WELL_KNOWN_ABRIDGED_URI_TYPE; - } + uint8_t *pPayload; + + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + + if (!memcmp(&(pRecordStruct->Type), SMART_POSTER_TYPE_STRING, pRecordStruct->TypeLength)) { + /* special case where we have to parse others records */ + pRecordStruct->NDEF_Type = SMARTPOSTER_TYPE; + NDEF_ParseSP(pRecordStruct); + } + + else if (!memcmp(&(pRecordStruct->Type), URI_TYPE_STRING, pRecordStruct->TypeLength)) { + /* it's an URI Type check if it's an URL or SMS or ... */ + /* check identifier */ + if (*pPayload == URI_ID_0x00) { + NDEF_ParseURI(pRecordStruct); + } else if ((*pPayload > URI_ID_0x00) && (*pPayload < URI_RFU)) { + /* email special case */ + if (*pPayload == (uint8_t) URI_ID_0x06) { + pRecordStruct->NDEF_Type = URI_EMAIL_TYPE; + } else { + pRecordStruct->NDEF_Type = WELL_KNOWN_ABRIDGED_URI_TYPE; + } + } else { + pRecordStruct->NDEF_Type = UNKNOWN_TYPE; + } + } + + else if (!memcmp(&(pRecordStruct->Type), TEXT_TYPE_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = TEXT_TYPE; + } else if ((!memcmp(&(pRecordStruct->Type), NDEF_HANDOVER_SELECT_TYPE_STR, pRecordStruct->TypeLength)) || + (!memcmp(&(pRecordStruct->Type), NDEF_HANDOVER_REQUEST_TYPE_STR, pRecordStruct->TypeLength))) { + pRecordStruct->NDEF_Type = HANDOVER_TYPE; } else { - pRecordStruct->NDEF_Type = UNKNOWN_TYPE; + pRecordStruct->NDEF_Type = UNKNOWN_TYPE; } - } - - else if (!memcmp(&(pRecordStruct->Type), TEXT_TYPE_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = TEXT_TYPE; - } else if ((!memcmp(&(pRecordStruct->Type), NDEF_HANDOVER_SELECT_TYPE_STR, pRecordStruct->TypeLength)) || - (!memcmp(&(pRecordStruct->Type), NDEF_HANDOVER_REQUEST_TYPE_STR, pRecordStruct->TypeLength))) { - pRecordStruct->NDEF_Type = HANDOVER_TYPE; - } else { - pRecordStruct->NDEF_Type = UNKNOWN_TYPE; - } } /** @@ -257,21 +257,21 @@ void NDEF::NDEF_ParseWellKnownType(sRecordInfo_t *pRecordStruct) */ void NDEF::NDEF_ParseMediaType(sRecordInfo_t *pRecordStruct) { - if (!memcmp(&(pRecordStruct->Type), VCARD_TYPE_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = VCARD_TYPE; - } else if (!memcmp(&(pRecordStruct->Type), XVCARD_TYPE_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = VCARD_TYPE; - } else if (!memcmp(&(pRecordStruct->Type), XVCARD2_TYPE_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = VCARD_TYPE; - } else if (!memcmp(&pRecordStruct->Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = BT_TYPE; - } else if (!memcmp(&pRecordStruct->Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = BLE_TYPE; - } else if (!memcmp(&pRecordStruct->Type, WIFITOKEN_TYPE_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = URI_WIFITOKEN_TYPE; - } else { - pRecordStruct->NDEF_Type = UNKNOWN_TYPE; - } + if (!memcmp(&(pRecordStruct->Type), VCARD_TYPE_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = VCARD_TYPE; + } else if (!memcmp(&(pRecordStruct->Type), XVCARD_TYPE_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = VCARD_TYPE; + } else if (!memcmp(&(pRecordStruct->Type), XVCARD2_TYPE_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = VCARD_TYPE; + } else if (!memcmp(&pRecordStruct->Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = BT_TYPE; + } else if (!memcmp(&pRecordStruct->Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = BLE_TYPE; + } else if (!memcmp(&pRecordStruct->Type, WIFITOKEN_TYPE_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = URI_WIFITOKEN_TYPE; + } else { + pRecordStruct->NDEF_Type = UNKNOWN_TYPE; + } } /** @@ -280,11 +280,11 @@ void NDEF::NDEF_ParseMediaType(sRecordInfo_t *pRecordStruct) */ void NDEF::NDEF_ParseForumExternalType(sRecordInfo_t *pRecordStruct) { - if (!memcmp(&(pRecordStruct->Type), M24SR_DISCOVERY_APP_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = M24SR_DISCOVERY_APP_TYPE; - } else { - pRecordStruct->NDEF_Type = UNKNOWN_TYPE; - } + if (!memcmp(&(pRecordStruct->Type), M24SR_DISCOVERY_APP_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = M24SR_DISCOVERY_APP_TYPE; + } else { + pRecordStruct->NDEF_Type = UNKNOWN_TYPE; + } } /** @@ -293,18 +293,18 @@ void NDEF::NDEF_ParseForumExternalType(sRecordInfo_t *pRecordStruct) */ void NDEF::NDEF_ParseURI(sRecordInfo_t *pRecordStruct) { - uint8_t *pPayload; - - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - pPayload++; /* to skip URI identifier first URI payload byte */ - - if (!memcmp(pPayload, SMS_TYPE_STRING, strlen(SMS_TYPE_STRING))) { - pRecordStruct->NDEF_Type = URI_SMS_TYPE; - } else if (!memcmp(pPayload, GEO_TYPE_STRING, strlen(GEO_TYPE_STRING))) { - pRecordStruct->NDEF_Type = URI_GEO_TYPE; - } else { - pRecordStruct->NDEF_Type = UNABRIDGED_URI_TYPE; - } + uint8_t *pPayload; + + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + pPayload++; /* to skip URI identifier first URI payload byte */ + + if (!memcmp(pPayload, SMS_TYPE_STRING, strlen(SMS_TYPE_STRING))) { + pRecordStruct->NDEF_Type = URI_SMS_TYPE; + } else if (!memcmp(pPayload, GEO_TYPE_STRING, strlen(GEO_TYPE_STRING))) { + pRecordStruct->NDEF_Type = URI_GEO_TYPE; + } else { + pRecordStruct->NDEF_Type = UNABRIDGED_URI_TYPE; + } } /** @@ -313,41 +313,41 @@ void NDEF::NDEF_ParseURI(sRecordInfo_t *pRecordStruct) */ void NDEF::NDEF_ParseSP(sRecordInfo_t *pRecordStruct) { - uint8_t *pPayload; - uint32_t PayloadSize = 0; - uint32_t SPPayloadSize = 0; - uint32_t OffsetInSPPayload = 0; - uint32_t RecordPosition = 0; - sRecordInfo_t *pSPRecordStruct; - - /* initialize variable with size of the payload and pointer on data */ - PayloadSize = pRecordStruct->PayloadLength; - - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - - pSPRecordStruct = SPRecordStructAdd[0]; - - /* Initialize the number of record find in the SP payload */ - pRecordStruct->NbOfRecordInSPPayload = 0; - - do { - pSPRecordStruct = SPRecordStructAdd[RecordPosition]; - /* identify the record in the SP payload */ - if (NDEF_IdentifySPRecord(pSPRecordStruct, pPayload) == NDEF_OK) { - /* store add of structure that will contain the other record information */ - pRecordStruct->NbOfRecordInSPPayload++; - pRecordStruct->SPRecordStructAdd[RecordPosition] = pSPRecordStruct; - - /* After SPRecord + First Record check if we are at the end of NDEF file */ - SPPayloadSize = pSPRecordStruct->PayloadLength; - - OffsetInSPPayload += pSPRecordStruct->PayloadOffset + SPPayloadSize; - pPayload += OffsetInSPPayload; - } else { /* Recommended Action Record for example */ - SPPayloadSize = 0; - } - RecordPosition++; - } while ((OffsetInSPPayload < PayloadSize) && RecordPosition < SP_MAX_RECORD); /* there is another record */ + uint8_t *pPayload; + uint32_t PayloadSize = 0; + uint32_t SPPayloadSize = 0; + uint32_t OffsetInSPPayload = 0; + uint32_t RecordPosition = 0; + sRecordInfo_t *pSPRecordStruct; + + /* initialize variable with size of the payload and pointer on data */ + PayloadSize = pRecordStruct->PayloadLength; + + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + + pSPRecordStruct = SPRecordStructAdd[0]; + + /* Initialize the number of record find in the SP payload */ + pRecordStruct->NbOfRecordInSPPayload = 0; + + do { + pSPRecordStruct = SPRecordStructAdd[RecordPosition]; + /* identify the record in the SP payload */ + if (NDEF_IdentifySPRecord(pSPRecordStruct, pPayload) == NDEF_OK) { + /* store add of structure that will contain the other record information */ + pRecordStruct->NbOfRecordInSPPayload++; + pRecordStruct->SPRecordStructAdd[RecordPosition] = pSPRecordStruct; + + /* After SPRecord + First Record check if we are at the end of NDEF file */ + SPPayloadSize = pSPRecordStruct->PayloadLength; + + OffsetInSPPayload += pSPRecordStruct->PayloadOffset + SPPayloadSize; + pPayload += OffsetInSPPayload; + } else { /* Recommended Action Record for example */ + SPPayloadSize = 0; + } + RecordPosition++; + } while ((OffsetInSPPayload < PayloadSize) && RecordPosition < SP_MAX_RECORD); /* there is another record */ } /** @@ -367,7 +367,7 @@ void NDEF::NDEF_ParseSP(sRecordInfo_t *pRecordStruct) */ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct) { - return NDEF_IdentifyNDEF(pRecordStruct, NDEF_Buffer, NDEF_Buffer_size); + return NDEF_IdentifyNDEF(pRecordStruct, NDEF_Buffer, NDEF_Buffer_size); } /** @@ -380,7 +380,7 @@ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct) */ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF) { - return NDEF_IdentifyNDEF(pRecordStruct, pNDEF, NDEF_MAX_SIZE); + return NDEF_IdentifyNDEF(pRecordStruct, pNDEF, NDEF_MAX_SIZE); } /** @@ -392,17 +392,17 @@ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF) */ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF, uint16_t bufferLength) { - uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; + uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; - /* check NDEF present */ - if (NDEF_IsNDEFPresent() != NDEF_OK) { - return NDEF_ERROR; - } + /* check NDEF present */ + if (NDEF_IsNDEFPresent() != NDEF_OK) { + return NDEF_ERROR; + } - /* Read the NDEF file up to the max length of the record header*/ - NfcTag_ReadNDEF(pNDEF, bufferLength); + /* Read the NDEF file up to the max length of the record header*/ + NfcTag_ReadNDEF(pNDEF, bufferLength); - return NDEF_IdentifyBuffer(pRecordStruct, pNDEF); + return NDEF_IdentifyBuffer(pRecordStruct, pNDEF); } /** @@ -416,7 +416,7 @@ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF, u */ uint16_t NDEF::NDEF_ReadNDEF() { - return NfcTag_ReadNDEF(NDEF_Buffer, NDEF_Buffer_size); + return NfcTag_ReadNDEF(NDEF_Buffer, NDEF_Buffer_size); } /** @@ -431,7 +431,7 @@ uint16_t NDEF::NDEF_ReadNDEF() */ uint16_t NDEF::NDEF_ReadNDEF(uint8_t *pNDEF) { - return NfcTag_ReadNDEF(pNDEF, NDEF_MAX_SIZE); + return NfcTag_ReadNDEF(pNDEF, NDEF_MAX_SIZE); } /** @@ -446,7 +446,7 @@ uint16_t NDEF::NDEF_ReadNDEF(uint8_t *pNDEF) */ uint16_t NDEF::NDEF_ReadNDEF(uint8_t *pNDEF, uint16_t bufferLength) { - return NfcTag_ReadNDEF(pNDEF, bufferLength); + return NfcTag_ReadNDEF(pNDEF, bufferLength); } @@ -462,7 +462,7 @@ uint16_t NDEF::NDEF_ReadNDEF(uint8_t *pNDEF, uint16_t bufferLength) */ uint16_t NDEF::NDEF_getNDEFSize(uint16_t *Size) { - return NfcTag_GetLength(Size); + return NfcTag_GetLength(Size); } /** * @brief This function write the NDEF in the TAG. @@ -476,7 +476,7 @@ uint16_t NDEF::NDEF_getNDEFSize(uint16_t *Size) */ uint16_t NDEF::NDEF_WriteNDEF(uint16_t NDEF_Size, uint8_t *pNDEF) { - return NfcTag_WriteNDEF(NDEF_Size, pNDEF); + return NfcTag_WriteNDEF(NDEF_Size, pNDEF); } @@ -492,43 +492,43 @@ uint16_t NDEF::NDEF_WriteNDEF(uint16_t NDEF_Size, uint8_t *pNDEF) */ uint16_t NDEF::NDEF_AppendRecord(sRecordInfo_t *Record) { - uint16_t status; - uint16_t NDEF_Size = 0; - uint8_t *pData = NDEF_Buffer; - - status = NDEF_getNDEFSize(&NDEF_Size); - if (status != NDEF_OK) { - return status ; - } - - if (NDEF_Size != 0) { - // There are already records in the NDEF - Record->RecordFlags &= ~MB_Mask; + uint16_t status; + uint16_t NDEF_Size = 0; + uint8_t *pData = NDEF_Buffer; - status = NfcTag_ReadNDEF(pData); + status = NDEF_getNDEFSize(&NDEF_Size); if (status != NDEF_OK) { - return status ; + return status ; } - uint8_t *pNdefRecord; - sRecordInfo_t LastRecord; - do { - pNdefRecord = pData; - NDEF_IdentifyBuffer(&LastRecord, pData); - pData += LastRecord.PayloadOffset + LastRecord.PayloadLength; - // TO DO: add a security condition to avoid infinite loop if NDEF file is corrupted - } while (!(LastRecord.RecordFlags & ME_Mask)); - LastRecord.RecordFlags &= ~ME_Mask; - *pNdefRecord = LastRecord.RecordFlags; - } else { - // This will be the first message in memory - Record->RecordFlags |= MB_Mask; - } - Record->RecordFlags |= ME_Mask; - uint32_t RecordLength = NDEF_WriteRecord(Record, pData); - - - return NfcTag_WriteNDEF(NDEF_Size + RecordLength, NDEF_Buffer); + if (NDEF_Size != 0) { + // There are already records in the NDEF + Record->RecordFlags &= ~MB_Mask; + + status = NfcTag_ReadNDEF(pData); + if (status != NDEF_OK) { + return status ; + } + + uint8_t *pNdefRecord; + sRecordInfo_t LastRecord; + do { + pNdefRecord = pData; + NDEF_IdentifyBuffer(&LastRecord, pData); + pData += LastRecord.PayloadOffset + LastRecord.PayloadLength; + // TO DO: add a security condition to avoid infinite loop if NDEF file is corrupted + } while (!(LastRecord.RecordFlags & ME_Mask)); + LastRecord.RecordFlags &= ~ME_Mask; + *pNdefRecord = LastRecord.RecordFlags; + } else { + // This will be the first message in memory + Record->RecordFlags |= MB_Mask; + } + Record->RecordFlags |= ME_Mask; + uint32_t RecordLength = NDEF_WriteRecord(Record, pData); + + + return NfcTag_WriteNDEF(NDEF_Size + RecordLength, NDEF_Buffer); } @@ -543,65 +543,65 @@ uint16_t NDEF::NDEF_AppendRecord(sRecordInfo_t *Record) */ uint16_t NDEF::NDEF_IdentifyBuffer(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF) { - uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; - - /* Is ID length field present */ - if ((*pNDEF) & IL_Mask) { - IDLengthField = ID_LENGTH_FIELD; - } else { - IDLengthField = 0; - } - - /* it's a SR */ - if ((*pNDEF) & SR_Mask) { - /* Analyse short record layout */ - TypeNbByte = pNDEF[1]; - PayloadLengthField = 1; - if (IDLengthField == ID_LENGTH_FIELD) { - IDNbByte = pNDEF[3]; + uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; + + /* Is ID length field present */ + if ((*pNDEF) & IL_Mask) { + IDLengthField = ID_LENGTH_FIELD; } else { - IDNbByte = 0; + IDLengthField = 0; } - } else { - /* Analyse normal record layout */ - TypeNbByte = pNDEF[1]; - PayloadLengthField = 4; - if (IDLengthField == ID_LENGTH_FIELD) { - IDNbByte = pNDEF[6]; + + /* it's a SR */ + if ((*pNDEF) & SR_Mask) { + /* Analyse short record layout */ + TypeNbByte = pNDEF[1]; + PayloadLengthField = 1; + if (IDLengthField == ID_LENGTH_FIELD) { + IDNbByte = pNDEF[3]; + } else { + IDNbByte = 0; + } } else { - IDNbByte = 0; + /* Analyse normal record layout */ + TypeNbByte = pNDEF[1]; + PayloadLengthField = 4; + if (IDLengthField == ID_LENGTH_FIELD) { + IDNbByte = pNDEF[6]; + } else { + IDNbByte = 0; + } } - } - - SizeOfRecordHeader = RECORD_FLAG_FIELD + TYPE_LENGTH_FIELD + PayloadLengthField + IDLengthField + TypeNbByte + IDNbByte; - - /* it's a SR */ - if (pNDEF[0] & SR_Mask) { - pRecordStruct->RecordFlags = pNDEF[0]; - pRecordStruct->TypeLength = TypeNbByte; - pRecordStruct->PayloadLength = pNDEF[2]; - pRecordStruct->IDLength = IDNbByte; - memcpy(pRecordStruct->Type, &pNDEF[3 + IDLengthField], TypeNbByte); - memcpy(pRecordStruct->ID, &pNDEF[3 + IDLengthField + TypeNbByte], IDNbByte); - pRecordStruct->PayloadOffset = SizeOfRecordHeader; - } else { - pRecordStruct->RecordFlags = pNDEF[0]; - pRecordStruct->TypeLength = TypeNbByte; - pRecordStruct->PayloadLength = (((uint32_t)pNDEF[2]) << 24) | - (((uint32_t)pNDEF[3]) << 16) | - (((uint32_t)pNDEF[4]) << 8) - | pNDEF[5] ; - pRecordStruct->IDLength = IDNbByte; - memcpy(pRecordStruct->Type, &pNDEF[6 + IDNbByte], TypeNbByte); - memcpy(pRecordStruct->ID, &pNDEF[6 + IDNbByte + TypeNbByte], IDNbByte); - pRecordStruct->PayloadOffset = SizeOfRecordHeader; - } - - pRecordStruct->PayloadBufferAdd = &pNDEF[pRecordStruct->PayloadOffset]; - - NDEF_ParseRecordHeader(pRecordStruct); - - return NDEF_OK; + + SizeOfRecordHeader = RECORD_FLAG_FIELD + TYPE_LENGTH_FIELD + PayloadLengthField + IDLengthField + TypeNbByte + IDNbByte; + + /* it's a SR */ + if (pNDEF[0] & SR_Mask) { + pRecordStruct->RecordFlags = pNDEF[0]; + pRecordStruct->TypeLength = TypeNbByte; + pRecordStruct->PayloadLength = pNDEF[2]; + pRecordStruct->IDLength = IDNbByte; + memcpy(pRecordStruct->Type, &pNDEF[3 + IDLengthField], TypeNbByte); + memcpy(pRecordStruct->ID, &pNDEF[3 + IDLengthField + TypeNbByte], IDNbByte); + pRecordStruct->PayloadOffset = SizeOfRecordHeader; + } else { + pRecordStruct->RecordFlags = pNDEF[0]; + pRecordStruct->TypeLength = TypeNbByte; + pRecordStruct->PayloadLength = (((uint32_t)pNDEF[2]) << 24) | + (((uint32_t)pNDEF[3]) << 16) | + (((uint32_t)pNDEF[4]) << 8) + | pNDEF[5] ; + pRecordStruct->IDLength = IDNbByte; + memcpy(pRecordStruct->Type, &pNDEF[6 + IDNbByte], TypeNbByte); + memcpy(pRecordStruct->ID, &pNDEF[6 + IDNbByte + TypeNbByte], IDNbByte); + pRecordStruct->PayloadOffset = SizeOfRecordHeader; + } + + pRecordStruct->PayloadBufferAdd = &pNDEF[pRecordStruct->PayloadOffset]; + + NDEF_ParseRecordHeader(pRecordStruct); + + return NDEF_OK; } /** @@ -612,66 +612,66 @@ uint16_t NDEF::NDEF_IdentifyBuffer(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF) */ uint32_t NDEF::NDEF_WriteRecord(sRecordInfo_t *pRecord, uint8_t *pNDEF) { - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ - /*----------------------------------*/ - /* PAYLOAD */ - /************************************/ - uint8_t *start = pNDEF; - - // start by considering payload length - if (pRecord->PayloadLength <= 0xFF) { - pRecord->RecordFlags |= SR_Mask; - } else { - pRecord->RecordFlags &= ~SR_Mask; - } - - // Then start writing! - *pNDEF++ = pRecord->RecordFlags; - - *pNDEF++ = pRecord->TypeLength; - - if (!(pRecord->RecordFlags & SR_Mask)) { - *pNDEF++ = (pRecord->PayloadLength >> 24) & 0xFF; - *pNDEF++ = (pRecord->PayloadLength >> 16) & 0xFF ; - *pNDEF++ = (pRecord->PayloadLength >> 8) & 0xFF; - } - *pNDEF++ = (pRecord->PayloadLength) & 0xFF; - - if (pRecord->RecordFlags & IL_Mask) { - *pNDEF++ = (pRecord->IDLength); - } - - memcpy(pNDEF, pRecord->Type, pRecord->TypeLength); - pNDEF += pRecord->TypeLength; - - if (pRecord->RecordFlags & IL_Mask) { - memcpy(pNDEF, pRecord->ID, pRecord->IDLength); - pNDEF += pRecord->IDLength; - } - - memcpy(pNDEF, pRecord->PayloadBufferAdd, pRecord->PayloadLength); - pNDEF += pRecord->PayloadLength; - - return (pNDEF - start); + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ + /*----------------------------------*/ + /* PAYLOAD */ + /************************************/ + uint8_t *start = pNDEF; + + // start by considering payload length + if (pRecord->PayloadLength <= 0xFF) { + pRecord->RecordFlags |= SR_Mask; + } else { + pRecord->RecordFlags &= ~SR_Mask; + } + + // Then start writing! + *pNDEF++ = pRecord->RecordFlags; + + *pNDEF++ = pRecord->TypeLength; + + if (!(pRecord->RecordFlags & SR_Mask)) { + *pNDEF++ = (pRecord->PayloadLength >> 24) & 0xFF; + *pNDEF++ = (pRecord->PayloadLength >> 16) & 0xFF ; + *pNDEF++ = (pRecord->PayloadLength >> 8) & 0xFF; + } + *pNDEF++ = (pRecord->PayloadLength) & 0xFF; + + if (pRecord->RecordFlags & IL_Mask) { + *pNDEF++ = (pRecord->IDLength); + } + + memcpy(pNDEF, pRecord->Type, pRecord->TypeLength); + pNDEF += pRecord->TypeLength; + + if (pRecord->RecordFlags & IL_Mask) { + memcpy(pNDEF, pRecord->ID, pRecord->IDLength); + pNDEF += pRecord->IDLength; + } + + memcpy(pNDEF, pRecord->PayloadBufferAdd, pRecord->PayloadLength); + pNDEF += pRecord->PayloadLength; + + return (pNDEF - start); } /** @@ -681,23 +681,23 @@ uint32_t NDEF::NDEF_WriteRecord(sRecordInfo_t *pRecord, uint8_t *pNDEF) */ uint32_t NDEF::NDEF_GetRecordLength(sRecordInfo_t *pRecord) { - // start by considering payload length - if (pRecord->PayloadLength <= 0xFF) { - pRecord->RecordFlags |= SR_Mask; - } else { - pRecord->RecordFlags &= ~SR_Mask; - } - - // Then compute the length - uint32_t length = 1 + // Flags - 1 + // Type length - ((pRecord->RecordFlags & SR_Mask) ? 1 : 4) + // Payload length - ((pRecord->RecordFlags & IL_Mask) ? 1 : 0) + // ID length - pRecord->TypeLength + // Type - ((pRecord->RecordFlags & IL_Mask) ? pRecord->IDLength : 0) + // ID - pRecord->PayloadLength; // Payload; - - return length; + // start by considering payload length + if (pRecord->PayloadLength <= 0xFF) { + pRecord->RecordFlags |= SR_Mask; + } else { + pRecord->RecordFlags &= ~SR_Mask; + } + + // Then compute the length + uint32_t length = 1 + // Flags + 1 + // Type length + ((pRecord->RecordFlags & SR_Mask) ? 1 : 4) + // Payload length + ((pRecord->RecordFlags & IL_Mask) ? 1 : 0) + // ID length + pRecord->TypeLength + // Type + ((pRecord->RecordFlags & IL_Mask) ? pRecord->IDLength : 0) + // ID + pRecord->PayloadLength; // Payload; + + return length; } /** @@ -706,7 +706,7 @@ uint32_t NDEF::NDEF_GetRecordLength(sRecordInfo_t *pRecord) */ uint16_t NDEF::NDEF_ClearNDEF(void) { - return NDEF_WriteNDEF(0, NULL); + return NDEF_WriteNDEF(0, NULL); } /** diff --git a/src/libNDEF/lib_NDEF.h b/src/libNDEF/lib_NDEF.h index c86ab39..b95a7cb 100755 --- a/src/libNDEF/lib_NDEF.h +++ b/src/libNDEF/lib_NDEF.h @@ -44,9 +44,9 @@ #endif #if __has_include("custom_config.h") - #include "custom_config.h" +#include "custom_config.h" #else - #include "default_config.h" +#include "default_config.h" #endif @@ -217,38 +217,38 @@ extern uint8_t NDEF_Record_Buffer [NDEF_RECORD_MAX_SIZE]; extern uint32_t NDEF_Record_Buffer_size; typedef enum { - UNKNOWN_TYPE = 0, - VCARD_TYPE, - UNABRIDGED_URI_TYPE, - WELL_KNOWN_ABRIDGED_URI_TYPE, - URI_SMS_TYPE, - URI_GEO_TYPE, - URI_EMAIL_TYPE, - SMARTPOSTER_TYPE, - URL_TYPE, - TEXT_TYPE, - HANDOVER_TYPE, - /* list of "external type" known by this demo, other external type will be addressed as UNKNWON_TYPE */ - M24SR_DISCOVERY_APP_TYPE, - BT_TYPE, - BLE_TYPE, - URI_WIFITOKEN_TYPE + UNKNOWN_TYPE = 0, + VCARD_TYPE, + UNABRIDGED_URI_TYPE, + WELL_KNOWN_ABRIDGED_URI_TYPE, + URI_SMS_TYPE, + URI_GEO_TYPE, + URI_EMAIL_TYPE, + SMARTPOSTER_TYPE, + URL_TYPE, + TEXT_TYPE, + HANDOVER_TYPE, + /* list of "external type" known by this demo, other external type will be addressed as UNKNWON_TYPE */ + M24SR_DISCOVERY_APP_TYPE, + BT_TYPE, + BLE_TYPE, + URI_WIFITOKEN_TYPE } NDEF_TypeDef; typedef struct sRecordInfo sRecordInfo_t; struct sRecordInfo { - uint8_t RecordFlags; - uint8_t TypeLength; - uint32_t PayloadLength; - uint8_t IDLength; - uint8_t Type[20]; - uint8_t ID[20]; - uint16_t PayloadOffset; - uint8_t *PayloadBufferAdd; /* add where payload content has been stored */ - NDEF_TypeDef NDEF_Type; /* to store identification ID for application */ - sRecordInfo_t *SPRecordStructAdd[SP_MAX_RECORD]; /*in case of smart poster array to store add of other sRecordInfo struct */ - uint8_t NbOfRecordInSPPayload; + uint8_t RecordFlags; + uint8_t TypeLength; + uint32_t PayloadLength; + uint8_t IDLength; + uint8_t Type[20]; + uint8_t ID[20]; + uint16_t PayloadOffset; + uint8_t *PayloadBufferAdd; /* add where payload content has been stored */ + NDEF_TypeDef NDEF_Type; /* to store identification ID for application */ + sRecordInfo_t *SPRecordStructAdd[SP_MAX_RECORD]; /*in case of smart poster array to store add of other sRecordInfo struct */ + uint8_t NbOfRecordInSPPayload; }; #endif /* __LIB_NDEF_H */ diff --git a/src/libNDEF/lib_NDEF_AAR.cpp b/src/libNDEF/lib_NDEF_AAR.cpp index f84c3ce..a34e5c1 100755 --- a/src/libNDEF/lib_NDEF_AAR.cpp +++ b/src/libNDEF/lib_NDEF_AAR.cpp @@ -70,48 +70,48 @@ */ uint16_t NDEF::NDEF_AddAAR(const sAARInfo *pAARStruct) { - uint16_t status = NDEF_ERROR; - - /* AAR: External Type Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- IL=0, CF=0 and SR=1 TNF=4 NFC Forum external type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ /* android.com:pkg */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* Do we have to add AAR to an existing NDEF message */ - /* retrieve current NDEF size and current record flag*/ - sRecordInfo_t AARrecord; - - /* fill AAR record header */ - AARrecord.RecordFlags = SR_Mask | TNF_NFCForumExternal; - AARrecord.TypeLength = AAR_TYPE_STRING_LENGTH; - - memcpy(AARrecord.Type, AAR_TYPE_STRING, AAR_TYPE_STRING_LENGTH); - - /* fill AAR payload */ - AARrecord.PayloadBufferAdd = (uint8_t *)pAARStruct->PackageName; - AARrecord.PayloadLength = strlen(pAARStruct->PackageName) ; - - status = NDEF_AppendRecord(&AARrecord); - - return status; + uint16_t status = NDEF_ERROR; + + /* AAR: External Type Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- IL=0, CF=0 and SR=1 TNF=4 NFC Forum external type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ /* android.com:pkg */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* Do we have to add AAR to an existing NDEF message */ + /* retrieve current NDEF size and current record flag*/ + sRecordInfo_t AARrecord; + + /* fill AAR record header */ + AARrecord.RecordFlags = SR_Mask | TNF_NFCForumExternal; + AARrecord.TypeLength = AAR_TYPE_STRING_LENGTH; + + memcpy(AARrecord.Type, AAR_TYPE_STRING, AAR_TYPE_STRING_LENGTH); + + /* fill AAR payload */ + AARrecord.PayloadBufferAdd = (uint8_t *)pAARStruct->PackageName; + AARrecord.PayloadLength = strlen(pAARStruct->PackageName) ; + + status = NDEF_AppendRecord(&AARrecord); + + return status; } diff --git a/src/libNDEF/lib_NDEF_AAR.h b/src/libNDEF/lib_NDEF_AAR.h index b9fdf47..2069c66 100755 --- a/src/libNDEF/lib_NDEF_AAR.h +++ b/src/libNDEF/lib_NDEF_AAR.h @@ -35,7 +35,7 @@ #include "lib_NDEF.h" typedef struct { - char PackageName[80]; + char PackageName[80]; } sAARInfo; diff --git a/src/libNDEF/lib_NDEF_Bluetooth.cpp b/src/libNDEF/lib_NDEF_Bluetooth.cpp index 3b05773..89b3e30 100755 --- a/src/libNDEF/lib_NDEF_Bluetooth.cpp +++ b/src/libNDEF/lib_NDEF_Bluetooth.cpp @@ -109,11 +109,11 @@ */ uint8_t *NDEF::NDEF_BluetoothCopy(uint8_t *dst, uint8_t *src, uint32_t length) { - uint32_t index; - for (index = 0 ; index < length; index++) { - dst[index] = src[length - index - 1]; - } - return dst; + uint32_t index; + for (index = 0 ; index < length; index++) { + dst[index] = src[length - index - 1]; + } + return dst; } /** @@ -125,150 +125,150 @@ uint8_t *NDEF::NDEF_BluetoothCopy(uint8_t *dst, uint8_t *src, uint32_t length) */ uint16_t NDEF::NDEF_ReadBluetoothOOB(sRecordInfo_t *pRecord, Ndef_Bluetooth_OOB_t *pBluetooth) { - uint8_t *pData = pRecord->PayloadBufferAdd; - uint8_t *OOBEnd = pRecord->PayloadBufferAdd + pRecord->PayloadLength; - - pBluetooth->OptionalMask = 0; - pBluetooth->nbServiceData = 0; - pBluetooth->Role = NDEF_BLE_ROLE_UNDEF; - pBluetooth->DeviceAddressType = NDEF_BLE_UNDEF_ADDRESS_TYPE; - pBluetooth->nbUUID16 = 0; - pBluetooth->nbUUID32 = 0; - pBluetooth->nbUUID128 = 0; - pBluetooth->nbServiceSolicitation16 = 0; - pBluetooth->nbServiceSolicitation128 = 0; - - if ((pRecord->TypeLength == strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE)) && - !memcmp(pRecord->Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE))) { - pBluetooth->Type = NDEF_BLUETOOTH_BREDR; - /* Retrieve mandatory OOB data: */ - /* 2 bytes for length and 6 bytes for device addr */ - NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceAddress, &pData[2], sizeof(pBluetooth->DeviceAddress)); - pData += 8; - } else if ((pRecord->TypeLength == strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE)) && - !memcmp(pRecord->Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE))) { - pBluetooth->Type = NDEF_BLUETOOTH_BLE; - /* for BLE, mandatory fields are in EIR */ - } else { - /* This is an unknown MIME type */ - return NDEF_ERROR; - } - - /* EIR format: 1 byte for length, 1 byte for type, n bytes for data */ - while (pData < OOBEnd) { - NDEF_EIR_t *rEIR = (NDEF_EIR_t *)pData; - /* +1 for EIR length byte */ - pData += rEIR->length + 1; - - /* keep track of all EIR found */ - if (rEIR->type < 0x20) { - NDEF_BLUETOOTH_SET_OPTIONAL_MASK(pBluetooth, rEIR->type); + uint8_t *pData = pRecord->PayloadBufferAdd; + uint8_t *OOBEnd = pRecord->PayloadBufferAdd + pRecord->PayloadLength; + + pBluetooth->OptionalMask = 0; + pBluetooth->nbServiceData = 0; + pBluetooth->Role = NDEF_BLE_ROLE_UNDEF; + pBluetooth->DeviceAddressType = NDEF_BLE_UNDEF_ADDRESS_TYPE; + pBluetooth->nbUUID16 = 0; + pBluetooth->nbUUID32 = 0; + pBluetooth->nbUUID128 = 0; + pBluetooth->nbServiceSolicitation16 = 0; + pBluetooth->nbServiceSolicitation128 = 0; + + if ((pRecord->TypeLength == strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE)) && + !memcmp(pRecord->Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE))) { + pBluetooth->Type = NDEF_BLUETOOTH_BREDR; + /* Retrieve mandatory OOB data: */ + /* 2 bytes for length and 6 bytes for device addr */ + NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceAddress, &pData[2], sizeof(pBluetooth->DeviceAddress)); + pData += 8; + } else if ((pRecord->TypeLength == strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE)) && + !memcmp(pRecord->Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE))) { + pBluetooth->Type = NDEF_BLUETOOTH_BLE; + /* for BLE, mandatory fields are in EIR */ + } else { + /* This is an unknown MIME type */ + return NDEF_ERROR; + } + + /* EIR format: 1 byte for length, 1 byte for type, n bytes for data */ + while (pData < OOBEnd) { + NDEF_EIR_t *rEIR = (NDEF_EIR_t *)pData; + /* +1 for EIR length byte */ + pData += rEIR->length + 1; + + /* keep track of all EIR found */ + if (rEIR->type < 0x20) { + NDEF_BLUETOOTH_SET_OPTIONAL_MASK(pBluetooth, rEIR->type); + } + + switch (rEIR->type) { + case BLUETOOTH_EIR_FLAGS: + pBluetooth->Flags = *rEIR->value; + break; + + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16: + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16: + pBluetooth->nbUUID16 = (rEIR->length - 1) / 2 ; + NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID16, rEIR->value, rEIR->length - 1); + break; + + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32: + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32: + pBluetooth->nbUUID32 = (rEIR->length - 1) / 4 ; + NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID32, rEIR->value, rEIR->length - 1); + break; + + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128: + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128: + pBluetooth->nbUUID128 = (rEIR->length - 1) / 16 ; + NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID128, rEIR->value, rEIR->length - 1); + break; + + case BLUETOOTH_EIR_SHORT_LOCAL_NAME: + case BLUETOOTH_EIR_COMPLETE_LOCAL_NAME: + /* No worry about name length as max EIR length is 0xff using 1 byte for the type metadata */ + memcpy(pBluetooth->LocalName, rEIR->value, rEIR->length - 1); + pBluetooth->LocalName[rEIR->length] = '\0'; + break; + + case BLUETOOTH_EIR_TX_POWER_LEVEL: + pBluetooth->TxPowerLevel = *rEIR->value; + break; + + case BLUETOOTH_EIR_DEVICE_CLASS: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceClass, rEIR->value, sizeof(pBluetooth->DeviceClass)); + break; + + case BLUETOOTH_EIR_SIMPLE_PAIRING_HASH: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->SimplePairingHash, rEIR->value, sizeof(pBluetooth->SimplePairingHash)); + break; + + case BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->SimplePairingRandomizer, rEIR->value, sizeof(pBluetooth->SimplePairingRandomizer)); + break; + + case BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->SecureManagerTK, rEIR->value, sizeof(pBluetooth->SecureManagerTK)); + break; + + case BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS: + pBluetooth->SMFlags = *rEIR->value; + break; + + case BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->SlaveConnIntervalRange, rEIR->value, sizeof(pBluetooth->SlaveConnIntervalRange)); + break; + + case BLUETOOTH_EIR_SERVICE_SOLICITATION_16: + pBluetooth->nbServiceSolicitation16 = (rEIR->length - 1) / 2 ; + NDEF_BluetoothCopy((uint8_t *)pBluetooth->ServiceSolicitation16, rEIR->value, rEIR->length - 1); + break; + + case BLUETOOTH_EIR_SERVICE_SOLICITATION_128: + pBluetooth->nbServiceSolicitation128 = (rEIR->length - 1) / 16 ; + NDEF_BluetoothCopy((uint8_t *)pBluetooth->ServiceSolicitation128, rEIR->value, rEIR->length - 1); + break; + + case BLUETOOTH_EIR_SERVICE_DATA: + /* a specific function should be used for this EIR */ + pBluetooth->nbServiceData++; + break; + + case BLUETOOTH_EIR_MANUFACTURER_DATA: + /* a specific function should be used for this EIR */ + pBluetooth->nbManufacturerData++; + break; + + case BLUETOOTH_EIR_APPEARANCE: + pBluetooth->Appearance = *(uint16_t *)rEIR->value; + break; + + case BLUETOOTH_EIR_BLE_DEVICE_ADDRESS: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceAddress, rEIR->value, sizeof(pBluetooth->DeviceAddress)); + pBluetooth->DeviceAddressType = (Ndef_BLE_Address_Type_t)rEIR->value[sizeof(pBluetooth->DeviceAddress)]; + break; + + case BLUETOOTH_EIR_BLE_ROLE: + pBluetooth->Role = (Ndef_BLE_Role_t) * rEIR->value; + break; + + default: + pBluetooth->nbUnknown++; + break; + } /* switch rEIR->type */ + } /* while (pData < OOBEnd) */ + /* Check that BLE mandatory fields are there */ + if ((pBluetooth->Type == NDEF_BLUETOOTH_BLE) && + (!NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_BLE_DEVICE_ADDRESS) || + !NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_BLE_ROLE))) { + return NDEF_ERROR; } - switch (rEIR->type) { - case BLUETOOTH_EIR_FLAGS: - pBluetooth->Flags = *rEIR->value; - break; - - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16: - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16: - pBluetooth->nbUUID16 = (rEIR->length - 1) / 2 ; - NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID16, rEIR->value, rEIR->length - 1); - break; - - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32: - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32: - pBluetooth->nbUUID32 = (rEIR->length - 1) / 4 ; - NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID32, rEIR->value, rEIR->length - 1); - break; - - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128: - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128: - pBluetooth->nbUUID128 = (rEIR->length - 1) / 16 ; - NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID128, rEIR->value, rEIR->length - 1); - break; - - case BLUETOOTH_EIR_SHORT_LOCAL_NAME: - case BLUETOOTH_EIR_COMPLETE_LOCAL_NAME: - /* No worry about name length as max EIR length is 0xff using 1 byte for the type metadata */ - memcpy(pBluetooth->LocalName, rEIR->value, rEIR->length - 1); - pBluetooth->LocalName[rEIR->length] = '\0'; - break; - - case BLUETOOTH_EIR_TX_POWER_LEVEL: - pBluetooth->TxPowerLevel = *rEIR->value; - break; - - case BLUETOOTH_EIR_DEVICE_CLASS: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceClass, rEIR->value, sizeof(pBluetooth->DeviceClass)); - break; - - case BLUETOOTH_EIR_SIMPLE_PAIRING_HASH: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->SimplePairingHash, rEIR->value, sizeof(pBluetooth->SimplePairingHash)); - break; - - case BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->SimplePairingRandomizer, rEIR->value, sizeof(pBluetooth->SimplePairingRandomizer)); - break; - - case BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->SecureManagerTK, rEIR->value, sizeof(pBluetooth->SecureManagerTK)); - break; - - case BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS: - pBluetooth->SMFlags = *rEIR->value; - break; - - case BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->SlaveConnIntervalRange, rEIR->value, sizeof(pBluetooth->SlaveConnIntervalRange)); - break; - - case BLUETOOTH_EIR_SERVICE_SOLICITATION_16: - pBluetooth->nbServiceSolicitation16 = (rEIR->length - 1) / 2 ; - NDEF_BluetoothCopy((uint8_t *)pBluetooth->ServiceSolicitation16, rEIR->value, rEIR->length - 1); - break; - - case BLUETOOTH_EIR_SERVICE_SOLICITATION_128: - pBluetooth->nbServiceSolicitation128 = (rEIR->length - 1) / 16 ; - NDEF_BluetoothCopy((uint8_t *)pBluetooth->ServiceSolicitation128, rEIR->value, rEIR->length - 1); - break; - - case BLUETOOTH_EIR_SERVICE_DATA: - /* a specific function should be used for this EIR */ - pBluetooth->nbServiceData++; - break; - - case BLUETOOTH_EIR_MANUFACTURER_DATA: - /* a specific function should be used for this EIR */ - pBluetooth->nbManufacturerData++; - break; - - case BLUETOOTH_EIR_APPEARANCE: - pBluetooth->Appearance = *(uint16_t *)rEIR->value; - break; - - case BLUETOOTH_EIR_BLE_DEVICE_ADDRESS: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceAddress, rEIR->value, sizeof(pBluetooth->DeviceAddress)); - pBluetooth->DeviceAddressType = (Ndef_BLE_Address_Type_t)rEIR->value[sizeof(pBluetooth->DeviceAddress)]; - break; - - case BLUETOOTH_EIR_BLE_ROLE: - pBluetooth->Role = (Ndef_BLE_Role_t) * rEIR->value; - break; - - default: - pBluetooth->nbUnknown++; - break; - } /* switch rEIR->type */ - } /* while (pData < OOBEnd) */ - /* Check that BLE mandatory fields are there */ - if ((pBluetooth->Type == NDEF_BLUETOOTH_BLE) && - (!NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_BLE_DEVICE_ADDRESS) || - !NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_BLE_ROLE))) { - return NDEF_ERROR; - } - - return NDEF_OK; + return NDEF_OK; } /** @@ -281,224 +281,224 @@ uint16_t NDEF::NDEF_ReadBluetoothOOB(sRecordInfo_t *pRecord, Ndef_Bluetooth_OOB_ */ uint16_t NDEF::NDEF_AppendBluetoothOOB(Ndef_Bluetooth_OOB_t *pBluetooth, char *RecordID) { - sRecordInfo_t Record; - uint16_t status; - - Record.RecordFlags = TNF_MediaType; - Record.RecordFlags |= (RecordID != NULL) ? IL_Mask : 0; - Record.IDLength = strlen(RecordID); - memcpy(Record.ID, RecordID, Record.IDLength); - - if (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) { - Record.TypeLength = strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE); - memcpy(Record.Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, Record.TypeLength); - } else if (pBluetooth->Type == NDEF_BLUETOOTH_BLE) { - Record.TypeLength = strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE); - memcpy(Record.Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, Record.TypeLength); - } else { - return NDEF_ERROR; - } - - /* Generate OOB payload */ - Record.PayloadLength = NDEF_GetBluetoothOOBLength(pBluetooth); - Record.PayloadBufferAdd = NDEF_Record_Buffer; - if (Record.PayloadLength > NDEF_RECORD_MAX_SIZE) { - return NDEF_ERROR_MEMORY_INTERNAL; - } - - /* pData: pointer to ease increment of record buffer address (byte granularity) */ - uint8_t *pData = Record.PayloadBufferAdd; - - /* for BR-EDR Device address & length are managed outside EIR */ - if (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) { - *pData = Record.PayloadLength; - pData += 2; - NDEF_BluetoothCopy(pData, (uint8_t *)pBluetooth->DeviceAddress, sizeof(pBluetooth->DeviceAddress)); - pData += sizeof(pBluetooth->DeviceAddress); - } - - /* wEIR: pointer to ease write to the buffer. - * length always set with an additional +1 corresponding to the EIR type byte. - * pData increment is always done with an additional +1 corresponding to the EIR length byte. - */ - NDEF_EIR_t *wEIR; - - - if (pBluetooth->Type == NDEF_BLUETOOTH_BLE) { - /* following EIR are mandatory for BLE */ - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->DeviceAddress) + sizeof(pBluetooth->DeviceAddressType) + 1; - wEIR->type = BLUETOOTH_EIR_BLE_DEVICE_ADDRESS; - NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->DeviceAddress, sizeof(pBluetooth->DeviceAddress)); - wEIR->value[sizeof(pBluetooth->DeviceAddress)] = pBluetooth->DeviceAddressType; - pData += wEIR->length + 1; - - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->Role) + 1; - wEIR->type = BLUETOOTH_EIR_BLE_ROLE; - wEIR->value[0] = pBluetooth->Role; - pData += wEIR->length + 1; - - } - - /* Rely on the optional mask to know if a EIR is required or not */ - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_FLAGS)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->Flags) + 1; - wEIR->type = BLUETOOTH_EIR_FLAGS; - wEIR->value[0] = pBluetooth->Flags; - pData += wEIR->length + 1; - } - - if (pBluetooth->nbUUID16 > 0) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = 2 * pBluetooth->nbUUID16 + 1; - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16)) { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16; + sRecordInfo_t Record; + uint16_t status; + + Record.RecordFlags = TNF_MediaType; + Record.RecordFlags |= (RecordID != NULL) ? IL_Mask : 0; + Record.IDLength = strlen(RecordID); + memcpy(Record.ID, RecordID, Record.IDLength); + + if (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) { + Record.TypeLength = strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE); + memcpy(Record.Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, Record.TypeLength); + } else if (pBluetooth->Type == NDEF_BLUETOOTH_BLE) { + Record.TypeLength = strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE); + memcpy(Record.Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, Record.TypeLength); } else { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16; + return NDEF_ERROR; } - NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ClassUUID16, 2 * pBluetooth->nbUUID16); - pData += wEIR->length + 1; - } + /* Generate OOB payload */ + Record.PayloadLength = NDEF_GetBluetoothOOBLength(pBluetooth); + Record.PayloadBufferAdd = NDEF_Record_Buffer; + if (Record.PayloadLength > NDEF_RECORD_MAX_SIZE) { + return NDEF_ERROR_MEMORY_INTERNAL; + } - if (pBluetooth->nbUUID32 > 0) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = 4 * pBluetooth->nbUUID32 + 1; - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32)) { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32; - } else { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32; + /* pData: pointer to ease increment of record buffer address (byte granularity) */ + uint8_t *pData = Record.PayloadBufferAdd; + + /* for BR-EDR Device address & length are managed outside EIR */ + if (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) { + *pData = Record.PayloadLength; + pData += 2; + NDEF_BluetoothCopy(pData, (uint8_t *)pBluetooth->DeviceAddress, sizeof(pBluetooth->DeviceAddress)); + pData += sizeof(pBluetooth->DeviceAddress); } - NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->ClassUUID32, 4 * pBluetooth->nbUUID32); - pData += wEIR->length + 1; - } + /* wEIR: pointer to ease write to the buffer. + * length always set with an additional +1 corresponding to the EIR type byte. + * pData increment is always done with an additional +1 corresponding to the EIR length byte. + */ + NDEF_EIR_t *wEIR; + + + if (pBluetooth->Type == NDEF_BLUETOOTH_BLE) { + /* following EIR are mandatory for BLE */ + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->DeviceAddress) + sizeof(pBluetooth->DeviceAddressType) + 1; + wEIR->type = BLUETOOTH_EIR_BLE_DEVICE_ADDRESS; + NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->DeviceAddress, sizeof(pBluetooth->DeviceAddress)); + wEIR->value[sizeof(pBluetooth->DeviceAddress)] = pBluetooth->DeviceAddressType; + pData += wEIR->length + 1; + + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->Role) + 1; + wEIR->type = BLUETOOTH_EIR_BLE_ROLE; + wEIR->value[0] = pBluetooth->Role; + pData += wEIR->length + 1; - if (pBluetooth->nbUUID128 > 0) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = 16 * pBluetooth->nbUUID128 + 1; - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128)) { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128; - } else { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128; } - NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ClassUUID128, 16 * pBluetooth->nbUUID128); - pData += wEIR->length + 1; - } + /* Rely on the optional mask to know if a EIR is required or not */ + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_FLAGS)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->Flags) + 1; + wEIR->type = BLUETOOTH_EIR_FLAGS; + wEIR->value[0] = pBluetooth->Flags; + pData += wEIR->length + 1; + } + + if (pBluetooth->nbUUID16 > 0) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = 2 * pBluetooth->nbUUID16 + 1; + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16)) { + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16; + } else { + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16; + } + NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ClassUUID16, 2 * pBluetooth->nbUUID16); + pData += wEIR->length + 1; + + } + + if (pBluetooth->nbUUID32 > 0) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = 4 * pBluetooth->nbUUID32 + 1; + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32)) { + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32; + } else { + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32; + } + NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->ClassUUID32, 4 * pBluetooth->nbUUID32); + pData += wEIR->length + 1; + + } + + if (pBluetooth->nbUUID128 > 0) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = 16 * pBluetooth->nbUUID128 + 1; + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128)) { + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128; + } else { + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128; + } + NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ClassUUID128, 16 * pBluetooth->nbUUID128); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME) || + NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_COMPLETE_LOCAL_NAME)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = strlen(pBluetooth->LocalName) + 1; + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME)) { + wEIR->type = BLUETOOTH_EIR_SHORT_LOCAL_NAME; + } else { + wEIR->type = BLUETOOTH_EIR_COMPLETE_LOCAL_NAME; + } + memcpy(wEIR->value, pBluetooth->LocalName, strlen(pBluetooth->LocalName)); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_TX_POWER_LEVEL)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->TxPowerLevel) + 1; + wEIR->type = BLUETOOTH_EIR_TX_POWER_LEVEL; + wEIR->value[0] = pBluetooth->TxPowerLevel; + pData += wEIR->length + 1; + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_DEVICE_CLASS)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->DeviceClass) + 1; + wEIR->type = BLUETOOTH_EIR_DEVICE_CLASS; + NDEF_BluetoothCopy(wEIR->value, pBluetooth->DeviceClass, sizeof(pBluetooth->DeviceClass)); + pData += wEIR->length + 1; - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME) || - NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_COMPLETE_LOCAL_NAME)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = strlen(pBluetooth->LocalName) + 1; - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME)) { - wEIR->type = BLUETOOTH_EIR_SHORT_LOCAL_NAME; - } else { - wEIR->type = BLUETOOTH_EIR_COMPLETE_LOCAL_NAME; } - memcpy(wEIR->value, pBluetooth->LocalName, strlen(pBluetooth->LocalName)); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_TX_POWER_LEVEL)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->TxPowerLevel) + 1; - wEIR->type = BLUETOOTH_EIR_TX_POWER_LEVEL; - wEIR->value[0] = pBluetooth->TxPowerLevel; - pData += wEIR->length + 1; - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_DEVICE_CLASS)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->DeviceClass) + 1; - wEIR->type = BLUETOOTH_EIR_DEVICE_CLASS; - NDEF_BluetoothCopy(wEIR->value, pBluetooth->DeviceClass, sizeof(pBluetooth->DeviceClass)); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_HASH)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->SimplePairingHash) + 1; - wEIR->type = BLUETOOTH_EIR_SIMPLE_PAIRING_HASH; - NDEF_BluetoothCopy(wEIR->value, pBluetooth->SimplePairingHash, sizeof(pBluetooth->SimplePairingHash)); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->SimplePairingRandomizer) + 1; - wEIR->type = BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER; - NDEF_BluetoothCopy(wEIR->value, pBluetooth->SimplePairingRandomizer, sizeof(pBluetooth->SimplePairingRandomizer)); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->SecureManagerTK) + 1; - wEIR->type = BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE; - NDEF_BluetoothCopy(wEIR->value, pBluetooth->SecureManagerTK, sizeof(pBluetooth->SecureManagerTK)); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->SMFlags) + 1; - wEIR->type = BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS; - wEIR->value[0] = pBluetooth->SMFlags; - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->SlaveConnIntervalRange) + 1; - wEIR->type = BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE; - NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->SlaveConnIntervalRange, sizeof(pBluetooth->SlaveConnIntervalRange)); - pData += wEIR->length + 1; - - } - - if (pBluetooth->nbServiceSolicitation16 > 0) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = 2 * pBluetooth->nbServiceSolicitation16 + 1; - wEIR->type = BLUETOOTH_EIR_SERVICE_SOLICITATION_16; - NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->ServiceSolicitation16, 16 * pBluetooth->nbServiceSolicitation16); - pData += wEIR->length + 1; - - } - - if (pBluetooth->nbServiceSolicitation128 > 0) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = 16 * pBluetooth->nbServiceSolicitation128 + 1; - wEIR->type = BLUETOOTH_EIR_SERVICE_SOLICITATION_128; - NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ServiceSolicitation128, 16 * pBluetooth->nbServiceSolicitation128); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_APPEARANCE)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->Appearance) + 1; - wEIR->type = BLUETOOTH_EIR_APPEARANCE; - wEIR->value[0] = pBluetooth->Appearance; - pData += wEIR->length + 1; - - } - - - status = NDEF_AppendRecord(&Record); - if (status != NDEF_OK) { - return status; - } - - return NDEF_OK; + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_HASH)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->SimplePairingHash) + 1; + wEIR->type = BLUETOOTH_EIR_SIMPLE_PAIRING_HASH; + NDEF_BluetoothCopy(wEIR->value, pBluetooth->SimplePairingHash, sizeof(pBluetooth->SimplePairingHash)); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->SimplePairingRandomizer) + 1; + wEIR->type = BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER; + NDEF_BluetoothCopy(wEIR->value, pBluetooth->SimplePairingRandomizer, sizeof(pBluetooth->SimplePairingRandomizer)); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->SecureManagerTK) + 1; + wEIR->type = BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE; + NDEF_BluetoothCopy(wEIR->value, pBluetooth->SecureManagerTK, sizeof(pBluetooth->SecureManagerTK)); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->SMFlags) + 1; + wEIR->type = BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS; + wEIR->value[0] = pBluetooth->SMFlags; + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->SlaveConnIntervalRange) + 1; + wEIR->type = BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE; + NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->SlaveConnIntervalRange, sizeof(pBluetooth->SlaveConnIntervalRange)); + pData += wEIR->length + 1; + + } + + if (pBluetooth->nbServiceSolicitation16 > 0) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = 2 * pBluetooth->nbServiceSolicitation16 + 1; + wEIR->type = BLUETOOTH_EIR_SERVICE_SOLICITATION_16; + NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->ServiceSolicitation16, 16 * pBluetooth->nbServiceSolicitation16); + pData += wEIR->length + 1; + + } + + if (pBluetooth->nbServiceSolicitation128 > 0) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = 16 * pBluetooth->nbServiceSolicitation128 + 1; + wEIR->type = BLUETOOTH_EIR_SERVICE_SOLICITATION_128; + NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ServiceSolicitation128, 16 * pBluetooth->nbServiceSolicitation128); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_APPEARANCE)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->Appearance) + 1; + wEIR->type = BLUETOOTH_EIR_APPEARANCE; + wEIR->value[0] = pBluetooth->Appearance; + pData += wEIR->length + 1; + + } + + + status = NDEF_AppendRecord(&Record); + if (status != NDEF_OK) { + return status; + } + + return NDEF_OK; } /** @@ -508,27 +508,27 @@ uint16_t NDEF::NDEF_AppendBluetoothOOB(Ndef_Bluetooth_OOB_t *pBluetooth, char *R */ uint32_t NDEF::NDEF_GetBluetoothOOBLength(Ndef_Bluetooth_OOB_t *pBluetooth) { - uint32_t length = (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) ? sizeof(pBluetooth->DeviceAddress) + 2 : 0; // +2 is for BR/EDR mandatory length - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_FLAGS) ? sizeof(pBluetooth->Flags) + 2 : 0 ; - length += pBluetooth->nbUUID16 ? pBluetooth->nbUUID16 * 2 + 2 : 0; - length += pBluetooth->nbUUID32 ? pBluetooth->nbUUID32 * 4 + 2 : 0; - length += pBluetooth->nbUUID128 ? pBluetooth->nbUUID128 * 16 + 2 : 0; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME) ? strlen(pBluetooth->LocalName) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_COMPLETE_LOCAL_NAME) ? strlen(pBluetooth->LocalName) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_TX_POWER_LEVEL) ? sizeof(pBluetooth->TxPowerLevel + 2) : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_DEVICE_CLASS) ? sizeof(pBluetooth->DeviceClass) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_HASH) ? sizeof(pBluetooth->SimplePairingHash) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER) ? sizeof(pBluetooth->SimplePairingRandomizer) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE) ? sizeof(pBluetooth->SecureManagerTK) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS) ? sizeof(pBluetooth->SMFlags) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE) ? sizeof(pBluetooth->SlaveConnIntervalRange) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_SOLICITATION_16) ? pBluetooth->nbServiceSolicitation16 * 2 + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_SOLICITATION_128) ? pBluetooth->nbServiceSolicitation128 * 16 + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_APPEARANCE) ? sizeof(pBluetooth->Appearance) + 2 : 0 ; - length += (pBluetooth->Type == NDEF_BLUETOOTH_BLE) ? sizeof(pBluetooth->DeviceAddress) + sizeof(pBluetooth->DeviceAddressType) + 2 : 0 ; - length += (pBluetooth->Type == NDEF_BLUETOOTH_BLE) ? sizeof(pBluetooth->Role) + 2 : 0; - - return length; + uint32_t length = (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) ? sizeof(pBluetooth->DeviceAddress) + 2 : 0; // +2 is for BR/EDR mandatory length + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_FLAGS) ? sizeof(pBluetooth->Flags) + 2 : 0 ; + length += pBluetooth->nbUUID16 ? pBluetooth->nbUUID16 * 2 + 2 : 0; + length += pBluetooth->nbUUID32 ? pBluetooth->nbUUID32 * 4 + 2 : 0; + length += pBluetooth->nbUUID128 ? pBluetooth->nbUUID128 * 16 + 2 : 0; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME) ? strlen(pBluetooth->LocalName) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_COMPLETE_LOCAL_NAME) ? strlen(pBluetooth->LocalName) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_TX_POWER_LEVEL) ? sizeof(pBluetooth->TxPowerLevel + 2) : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_DEVICE_CLASS) ? sizeof(pBluetooth->DeviceClass) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_HASH) ? sizeof(pBluetooth->SimplePairingHash) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER) ? sizeof(pBluetooth->SimplePairingRandomizer) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE) ? sizeof(pBluetooth->SecureManagerTK) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS) ? sizeof(pBluetooth->SMFlags) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE) ? sizeof(pBluetooth->SlaveConnIntervalRange) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_SOLICITATION_16) ? pBluetooth->nbServiceSolicitation16 * 2 + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_SOLICITATION_128) ? pBluetooth->nbServiceSolicitation128 * 16 + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_APPEARANCE) ? sizeof(pBluetooth->Appearance) + 2 : 0 ; + length += (pBluetooth->Type == NDEF_BLUETOOTH_BLE) ? sizeof(pBluetooth->DeviceAddress) + sizeof(pBluetooth->DeviceAddressType) + 2 : 0 ; + length += (pBluetooth->Type == NDEF_BLUETOOTH_BLE) ? sizeof(pBluetooth->Role) + 2 : 0; + + return length; } /** * @} diff --git a/src/libNDEF/lib_NDEF_Bluetooth.h b/src/libNDEF/lib_NDEF_Bluetooth.h index 7f7e1bb..91bfabd 100755 --- a/src/libNDEF/lib_NDEF_Bluetooth.h +++ b/src/libNDEF/lib_NDEF_Bluetooth.h @@ -46,40 +46,40 @@ /** @brief Enumerates the Extended Inquiry Responses, as defined in the Bluetooth v4.0 core specification. */ typedef enum { - BLUETOOTH_EIR_FLAGS = 0x01, /**< Bluetooth flags:\n + BLUETOOTH_EIR_FLAGS = 0x01, /**< Bluetooth flags:\n b0: LE limited Discoverable Mode,\n b1: LE general Discoverable Mode,\n b2: BR/EDR not supported,\n b3: Simultaneous LE & BR/EDR Controller,\n b4: Simultaneous LE & BR/EDR Host */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16 = 0x02, /**< Bluetooth service UUID on 16-bits (partial list) */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16 = 0x03, /**< Bluetooth service UUID on 16-bits (complete list) */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32 = 0x04, /**< Bluetooth service UUID on 32-bits (partial list) */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32 = 0x05, /**< Bluetooth service UUID on 32-bits (complete list) */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128 = 0x06, /**< Bluetooth service UUID on 128-bits (partial list) */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128 = 0x07, /**< Bluetooth service UUID on 128-bits (complete list) */ - BLUETOOTH_EIR_SHORT_LOCAL_NAME = 0x08, /**< Shortened local name */ - BLUETOOTH_EIR_COMPLETE_LOCAL_NAME = 0x09, /**< Complete local name */ - BLUETOOTH_EIR_TX_POWER_LEVEL = 0x0A, /**< TX Power Level (1 byte): 0xXX:-127 to +127dBm */ - BLUETOOTH_EIR_DEVICE_CLASS = 0x0D, /**< Class of device, Format defined in Assigned Numbers */ - BLUETOOTH_EIR_SIMPLE_PAIRING_HASH = 0x0E, /**< Simple Pairing Hash C (16 octets), Format defined in [Vol. 2], Part H Section 7.2.2*/ - BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER = 0x0F, /**< Simple Pairing Randomizer R (16 octets), Format defined in[Vol. 2], Part H Section 7.2.2 */ - BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE = 0x10, /**< TK Value: Value as used in pairing over LE Physical channel. Format defined in [Vol. 3], Part H Section 2.3*/ - BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS = 0x11, /**< Flags (1 octet):\n + BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16 = 0x02, /**< Bluetooth service UUID on 16-bits (partial list) */ + BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16 = 0x03, /**< Bluetooth service UUID on 16-bits (complete list) */ + BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32 = 0x04, /**< Bluetooth service UUID on 32-bits (partial list) */ + BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32 = 0x05, /**< Bluetooth service UUID on 32-bits (complete list) */ + BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128 = 0x06, /**< Bluetooth service UUID on 128-bits (partial list) */ + BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128 = 0x07, /**< Bluetooth service UUID on 128-bits (complete list) */ + BLUETOOTH_EIR_SHORT_LOCAL_NAME = 0x08, /**< Shortened local name */ + BLUETOOTH_EIR_COMPLETE_LOCAL_NAME = 0x09, /**< Complete local name */ + BLUETOOTH_EIR_TX_POWER_LEVEL = 0x0A, /**< TX Power Level (1 byte): 0xXX:-127 to +127dBm */ + BLUETOOTH_EIR_DEVICE_CLASS = 0x0D, /**< Class of device, Format defined in Assigned Numbers */ + BLUETOOTH_EIR_SIMPLE_PAIRING_HASH = 0x0E, /**< Simple Pairing Hash C (16 octets), Format defined in [Vol. 2], Part H Section 7.2.2*/ + BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER = 0x0F, /**< Simple Pairing Randomizer R (16 octets), Format defined in[Vol. 2], Part H Section 7.2.2 */ + BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE = 0x10, /**< TK Value: Value as used in pairing over LE Physical channel. Format defined in [Vol. 3], Part H Section 2.3*/ + BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS = 0x11, /**< Flags (1 octet):\n b0: OOB Flags Field (0 = OOB data not present, 1 = OOB data present),\n b1: LE supported (Host) (i.e. bit 65 of LMP Extended Feature bits Page 1),\n b2: Simultaneous LE and BR/EDR to Same Device Capable (Host) (i.e. bit 66 of LMP Extended Feature bits Page 1)\n b3: Address type (0 = Public Address, 1 = Random Address) */ - BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE = 0x12, /**< Slave Connection Interval Range: The first 2 octets defines the minimum value for the connection interval, The second 2 octets defines the maximum value for the connection interval */ - BLUETOOTH_EIR_SERVICE_SOLICITATION_16 = 0x14, /**< Service UUIDs: List of 16 bit Service UUIDs*/ - BLUETOOTH_EIR_SERVICE_SOLICITATION_128 = 0x15, /**< Service UUIDs: List of 128 bit Service UUID*/ - BLUETOOTH_EIR_SERVICE_DATA = 0x16, /**< Service Data (2 or more octets): The first 2 octets contain the 16 bit Service UUID followed by additional service data */ - BLUETOOTH_EIR_APPEARANCE = 0x19, /**< UUID for `Appearance`: The Appearance characteristic value shall be the enumerated value as defined by Bluetooth Assigned Numbers document. */ - BLUETOOTH_EIR_BLE_DEVICE_ADDRESS = 0x1B, /**< 6 LSB bytes: Device address, 7th byte: Address type (Public/Random) */ - BLUETOOTH_EIR_BLE_ROLE = 0x1C, /**< Device Role: Periph only, Central only, Periph preferred, Central preferred */ - BLUETOOTH_EIR_MANUFACTURER_DATA = 0xFF /**< Manufacturer Specific Data (2 or more octets): The first 2 octets contain the Company Identifier Code followed by additional manufacturer specific data */ + BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE = 0x12, /**< Slave Connection Interval Range: The first 2 octets defines the minimum value for the connection interval, The second 2 octets defines the maximum value for the connection interval */ + BLUETOOTH_EIR_SERVICE_SOLICITATION_16 = 0x14, /**< Service UUIDs: List of 16 bit Service UUIDs*/ + BLUETOOTH_EIR_SERVICE_SOLICITATION_128 = 0x15, /**< Service UUIDs: List of 128 bit Service UUID*/ + BLUETOOTH_EIR_SERVICE_DATA = 0x16, /**< Service Data (2 or more octets): The first 2 octets contain the 16 bit Service UUID followed by additional service data */ + BLUETOOTH_EIR_APPEARANCE = 0x19, /**< UUID for `Appearance`: The Appearance characteristic value shall be the enumerated value as defined by Bluetooth Assigned Numbers document. */ + BLUETOOTH_EIR_BLE_DEVICE_ADDRESS = 0x1B, /**< 6 LSB bytes: Device address, 7th byte: Address type (Public/Random) */ + BLUETOOTH_EIR_BLE_ROLE = 0x1C, /**< Device Role: Periph only, Central only, Periph preferred, Central preferred */ + BLUETOOTH_EIR_MANUFACTURER_DATA = 0xFF /**< Manufacturer Specific Data (2 or more octets): The first 2 octets contain the Company Identifier Code followed by additional manufacturer specific data */ } Ndef_Bluetooth_Eir_Types_t; @@ -94,24 +94,24 @@ typedef enum { /** @brief Enumerates the Bluetooth LE address types. */ typedef enum { - NDEF_BLE_PUBLIC_ADDRESS_TYPE = 0x0, /**< Public Device Address. */ - NDEF_BLE_RANDOM_ADDRESS_TYPE = 0x1, /**< Random Device Address. */ - NDEF_BLE_UNDEF_ADDRESS_TYPE = 0xff /**< Device Address is undefined. */ + NDEF_BLE_PUBLIC_ADDRESS_TYPE = 0x0, /**< Public Device Address. */ + NDEF_BLE_RANDOM_ADDRESS_TYPE = 0x1, /**< Random Device Address. */ + NDEF_BLE_UNDEF_ADDRESS_TYPE = 0xff /**< Device Address is undefined. */ } Ndef_BLE_Address_Type_t; /** @brief Enumerates Bluetooth LE Roles */ typedef enum { - NDEF_BLE_ROLE_PERIPH_ONLY = 0x0, /**< Only Peripheral Role supported. */ - NDEF_BLE_ROLE_CENTRAL_ONLY = 0x1, /**< Only Central Role supported. */ - NDEF_BLE_ROLE_PERIPH_PREFERRED = 0x2, /**< Peripheral and Central Role supported, Peripheral Role preferred for connection establishment. */ - NDEF_BLE_ROLE_CENTRAL_PREFERRED = 0x3, /**< Peripheral and Central Role supported, Central Role preferred for connection establishment. */ - NDEF_BLE_ROLE_UNDEF = 0xff /**< LE Role is undefined. */ + NDEF_BLE_ROLE_PERIPH_ONLY = 0x0, /**< Only Peripheral Role supported. */ + NDEF_BLE_ROLE_CENTRAL_ONLY = 0x1, /**< Only Central Role supported. */ + NDEF_BLE_ROLE_PERIPH_PREFERRED = 0x2, /**< Peripheral and Central Role supported, Peripheral Role preferred for connection establishment. */ + NDEF_BLE_ROLE_CENTRAL_PREFERRED = 0x3, /**< Peripheral and Central Role supported, Central Role preferred for connection establishment. */ + NDEF_BLE_ROLE_UNDEF = 0xff /**< LE Role is undefined. */ } Ndef_BLE_Role_t; /** @brief Enumerates Bluetooth protocols */ typedef enum { - NDEF_BLUETOOTH_BREDR, /**< Standard bluetooth */ - NDEF_BLUETOOTH_BLE /**< Bluetooth Low Energy */ + NDEF_BLUETOOTH_BREDR, /**< Standard bluetooth */ + NDEF_BLUETOOTH_BLE /**< Bluetooth Low Energy */ } Ndef_Bluetooth_type_t; /** @brief Helper macro to set a particular EIR in the EIR mask of a `Ndef_Bluetooth_OOB_t` instance. @@ -138,53 +138,53 @@ typedef enum { * No union used here to comply with the Cube coding guidelines, despite the fact that it could have save memory space. */ typedef struct { - /* Mandatory fields */ - Ndef_Bluetooth_type_t Type; /**< *Mandatory*: Bluetooth type (Br/Edr or LE). */ - char DeviceAddress[6]; /**< *Mandatory*: Device address. For LE: 6 LSB of Device Address EIR. */ - /* Optional common fields */ - uint32_t OptionalMask; /**< This Mask is used to keep track of EIRs present in the OOB: each bit index corresponds to a `Ndef_Bluetooth_Eir_Types_t` value. */ - uint8_t Flags; /**< Flags from BLUETOOTH_EIR_FLAGS. */ - - uint16_t ClassUUID16[0xff / 2]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16. */ - uint32_t ClassUUID32[0xff / 4]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32. */ - uint32_t ClassUUID128[0xff / 16][4]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128. */ - uint8_t nbUUID16; /**< Number of UUIDs specified in ClassUUID16. */ - uint8_t nbUUID32; /**< Number of UUIDs specified in ClassUUID32. */ - uint8_t nbUUID128; /**< Number of UUIDs specified in ClassUUID128. */ - - char LocalName[0xff]; /**< Device local name from BLUETOOTH_EIR_SHORT_LOCAL_NAME or BLUETOOTH_EIR_COMPLETE_LOCAL_NAME. */ - uint8_t DeviceClass[3]; /**< Class of device from BLUETOOTH_EIR_DEVICE_CLASS. */ - // if no TPL, TPL is unknown - uint8_t TxPowerLevel; /**< TX power Level from BLUETOOTH_EIR_TX_POWER_LEVEL. */ - - uint8_t SMFlags; /**< Security Manager Flags from BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS. */ - uint16_t SlaveConnIntervalRange[2]; /**< Slave Connection Interval Range from BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE. */ - uint16_t ServiceSolicitation16[0xff / 2]; /**< Service Solicitation from BLUETOOTH_EIR_SERVICE_SOLICITATION_16. */ - uint32_t ServiceSolicitation128[0xff / 16][4]; /**< Service Solicitation from BLUETOOTH_EIR_SERVICE_SOLICITATION_128. */ - uint8_t nbServiceSolicitation16; /**< Number of UUIDs in ServiceSolicitation16. */ - uint8_t nbServiceSolicitation128; /**< Number of UUIDs in ServiceSolicitation128. */ - /* for br/edr only */ - uint8_t SimplePairingHash[16]; /**< *For Br/Edr only*: Simple Pairing Hash from BLUETOOTH_EIR_SIMPLE_PAIRING_HASH. */ - uint8_t SimplePairingRandomizer[16]; /**< *For Br/Edr only*: Simple Pairing Randomizer from BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER. */ - /* BLE mandatory fields */ - Ndef_BLE_Address_Type_t DeviceAddressType; /**< *For LE only*, *Mandatory*: Address Type, MSB of the Device Address EIR (Public or Random) */ - Ndef_BLE_Role_t Role; /**< *For LE only*, *Mandatory*: LE Role from BLUETOOTH_EIR_BLE_ROLE and defined in `Ndef_BLE_Role_t`. */ - /* BLE optional fields */ - uint8_t SecureManagerTK[16]; /**< *For LE only*: Security Manager TK from BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE. */ - uint16_t Appearance; /**< *For LE only*: Appearance from BLUETOOTH_EIR_APPEARANCE. */ - /* track number of unparsed EIR */ - uint8_t nbUnknown; /**< Number of EIRs not parsed because of an unknown EIR type. */ - uint8_t nbServiceData; /**< Number of EIRs not parsed because being of type BLUETOOTH_EIR_SERVICE_DATA. */ - uint8_t nbManufacturerData; /**< Number of EIRs not parsed because being of type BLUETOOTH_EIR_MANUFACTURER_DATA. */ + /* Mandatory fields */ + Ndef_Bluetooth_type_t Type; /**< *Mandatory*: Bluetooth type (Br/Edr or LE). */ + char DeviceAddress[6]; /**< *Mandatory*: Device address. For LE: 6 LSB of Device Address EIR. */ + /* Optional common fields */ + uint32_t OptionalMask; /**< This Mask is used to keep track of EIRs present in the OOB: each bit index corresponds to a `Ndef_Bluetooth_Eir_Types_t` value. */ + uint8_t Flags; /**< Flags from BLUETOOTH_EIR_FLAGS. */ + + uint16_t ClassUUID16[0xff / 2]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16. */ + uint32_t ClassUUID32[0xff / 4]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32. */ + uint32_t ClassUUID128[0xff / 16][4]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128. */ + uint8_t nbUUID16; /**< Number of UUIDs specified in ClassUUID16. */ + uint8_t nbUUID32; /**< Number of UUIDs specified in ClassUUID32. */ + uint8_t nbUUID128; /**< Number of UUIDs specified in ClassUUID128. */ + + char LocalName[0xff]; /**< Device local name from BLUETOOTH_EIR_SHORT_LOCAL_NAME or BLUETOOTH_EIR_COMPLETE_LOCAL_NAME. */ + uint8_t DeviceClass[3]; /**< Class of device from BLUETOOTH_EIR_DEVICE_CLASS. */ + // if no TPL, TPL is unknown + uint8_t TxPowerLevel; /**< TX power Level from BLUETOOTH_EIR_TX_POWER_LEVEL. */ + + uint8_t SMFlags; /**< Security Manager Flags from BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS. */ + uint16_t SlaveConnIntervalRange[2]; /**< Slave Connection Interval Range from BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE. */ + uint16_t ServiceSolicitation16[0xff / 2]; /**< Service Solicitation from BLUETOOTH_EIR_SERVICE_SOLICITATION_16. */ + uint32_t ServiceSolicitation128[0xff / 16][4]; /**< Service Solicitation from BLUETOOTH_EIR_SERVICE_SOLICITATION_128. */ + uint8_t nbServiceSolicitation16; /**< Number of UUIDs in ServiceSolicitation16. */ + uint8_t nbServiceSolicitation128; /**< Number of UUIDs in ServiceSolicitation128. */ + /* for br/edr only */ + uint8_t SimplePairingHash[16]; /**< *For Br/Edr only*: Simple Pairing Hash from BLUETOOTH_EIR_SIMPLE_PAIRING_HASH. */ + uint8_t SimplePairingRandomizer[16]; /**< *For Br/Edr only*: Simple Pairing Randomizer from BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER. */ + /* BLE mandatory fields */ + Ndef_BLE_Address_Type_t DeviceAddressType; /**< *For LE only*, *Mandatory*: Address Type, MSB of the Device Address EIR (Public or Random) */ + Ndef_BLE_Role_t Role; /**< *For LE only*, *Mandatory*: LE Role from BLUETOOTH_EIR_BLE_ROLE and defined in `Ndef_BLE_Role_t`. */ + /* BLE optional fields */ + uint8_t SecureManagerTK[16]; /**< *For LE only*: Security Manager TK from BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE. */ + uint16_t Appearance; /**< *For LE only*: Appearance from BLUETOOTH_EIR_APPEARANCE. */ + /* track number of unparsed EIR */ + uint8_t nbUnknown; /**< Number of EIRs not parsed because of an unknown EIR type. */ + uint8_t nbServiceData; /**< Number of EIRs not parsed because being of type BLUETOOTH_EIR_SERVICE_DATA. */ + uint8_t nbManufacturerData; /**< Number of EIRs not parsed because being of type BLUETOOTH_EIR_MANUFACTURER_DATA. */ } Ndef_Bluetooth_OOB_t ; /** @brief Extended Inquiry Response format. * @details This structure is used to parse/build EIRs in the Bluetooth OOB. */ typedef struct { - uint8_t length; /**< Length of the EIRs, including the type field (1 byte). */ - uint8_t type; /**< EIR type as defined in `Ndef_Bluetooth_Eir_Types_t`. */ - uint8_t value[1]; /**< single-element array, to keep track of the address of the EIR data */ + uint8_t length; /**< Length of the EIRs, including the type field (1 byte). */ + uint8_t type; /**< EIR type as defined in `Ndef_Bluetooth_Eir_Types_t`. */ + uint8_t value[1]; /**< single-element array, to keep track of the address of the EIR data */ } NDEF_EIR_t ; /** @} diff --git a/src/libNDEF/lib_NDEF_Email.cpp b/src/libNDEF/lib_NDEF_Email.cpp index 26080f2..1ced864 100755 --- a/src/libNDEF/lib_NDEF_Email.cpp +++ b/src/libNDEF/lib_NDEF_Email.cpp @@ -66,94 +66,94 @@ */ void NDEF::NDEF_FillEmailStruct(uint8_t *pPayload, uint32_t PayloadSize, sEmailInfo *pEmailStruct) { - uint8_t *pLastByteAdd, *pLook4Word, *pEndString; - uint32_t SizeOfKeyWord = 0; + uint8_t *pLastByteAdd, *pLook4Word, *pEndString; + uint32_t SizeOfKeyWord = 0; - pEndString = 0; + pEndString = 0; - /* First character force to NULL in case not matching found */ + /* First character force to NULL in case not matching found */ #ifdef NDEF_DYN_ALLOC - pEmailStruct->EmailAdd = NULL; - pEmailStruct->Subject = NULL; - pEmailStruct->Message = NULL; - pEmailStruct->Information = NULL; + pEmailStruct->EmailAdd = NULL; + pEmailStruct->Subject = NULL; + pEmailStruct->Message = NULL; + pEmailStruct->Information = NULL; #else - *pEmailStruct->EmailAdd = 0; - *pEmailStruct->Subject = 0; - *pEmailStruct->Message = 0; + *pEmailStruct->EmailAdd = 0; + *pEmailStruct->Subject = 0; + *pEmailStruct->Message = 0; #endif - /* Interesting information are stored before picture if any */ - /* Moreover picture is not used in this demonstration SW */ - pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); + /* Interesting information are stored before picture if any */ + /* Moreover picture is not used in this demonstration SW */ + pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); - /* first byte should be the "mailto:" well know URI type, skip it */ - pLook4Word = ++pPayload; + /* first byte should be the "mailto:" well know URI type, skip it */ + pLook4Word = ++pPayload; - /* Retrieve email add */ - if (pLook4Word != pLastByteAdd) { - pEndString = pLook4Word; - while (memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { - pEndString++; - } - if ((!memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH)) || (pEndString == pLastByteAdd)) { + /* Retrieve email add */ + if (pLook4Word != pLastByteAdd) { + pEndString = pLook4Word; + while (memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { + pEndString++; + } + if ((!memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH)) || (pEndString == pLastByteAdd)) { #ifdef NDEF_DYN_ALLOC - pEmailStruct->EmailAdd = malloc(pEndString - pLook4Word + 1); - if (pEmailStruct->EmailAdd != NULL) + pEmailStruct->EmailAdd = malloc(pEndString - pLook4Word + 1); + if (pEmailStruct->EmailAdd != NULL) #endif - { - memcpy(pEmailStruct->EmailAdd, pLook4Word, pEndString - pLook4Word); - /* add end of string character */ - pEmailStruct->EmailAdd[pEndString - pLook4Word] = 0; - } + { + memcpy(pEmailStruct->EmailAdd, pLook4Word, pEndString - pLook4Word); + /* add end of string character */ + pEmailStruct->EmailAdd[pEndString - pLook4Word] = 0; + } + } } - } - pEndString += URI_FIRST_DATA_END_LENGTH; - pLook4Word = pEndString; - - /* check if e-mail subject is present */ - if (!memcmp(pLook4Word, SUBJECT_BEGIN_STRING, SUBJECT_BEGIN_STRING_LENGTH)) { - SizeOfKeyWord = SUBJECT_BEGIN_STRING_LENGTH; - - /* Retrieve subject */ - if (pLook4Word != pLastByteAdd) { - pLook4Word += SizeOfKeyWord; - pEndString = pLook4Word; - while (memcmp(pEndString, URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { - pEndString++; - } - if ((!memcmp(pEndString, URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH)) || (pEndString == pLastByteAdd)) { + pEndString += URI_FIRST_DATA_END_LENGTH; + pLook4Word = pEndString; + + /* check if e-mail subject is present */ + if (!memcmp(pLook4Word, SUBJECT_BEGIN_STRING, SUBJECT_BEGIN_STRING_LENGTH)) { + SizeOfKeyWord = SUBJECT_BEGIN_STRING_LENGTH; + + /* Retrieve subject */ + if (pLook4Word != pLastByteAdd) { + pLook4Word += SizeOfKeyWord; + pEndString = pLook4Word; + while (memcmp(pEndString, URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { + pEndString++; + } + if ((!memcmp(pEndString, URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH)) || (pEndString == pLastByteAdd)) { #ifdef NDEF_DYN_ALLOC - pEmailStruct->Subject = malloc(pEndString - pLook4Word + 1); - if (pEmailStruct->Subject != NULL) + pEmailStruct->Subject = malloc(pEndString - pLook4Word + 1); + if (pEmailStruct->Subject != NULL) #endif - { - memcpy(pEmailStruct->Subject, pLook4Word, pEndString - pLook4Word); - /* add end of string character */ - pEmailStruct->Subject[pEndString - pLook4Word] = 0; + { + memcpy(pEmailStruct->Subject, pLook4Word, pEndString - pLook4Word); + /* add end of string character */ + pEmailStruct->Subject[pEndString - pLook4Word] = 0; + } + } + pEndString += URI_SECOND_DATA_END_LENGTH; } - } - pEndString += URI_SECOND_DATA_END_LENGTH; } - } - pLook4Word = pEndString; + pLook4Word = pEndString; - /* check if e-mail message is present */ - if (!memcmp(pLook4Word, MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH)) { - pEndString += MESSAGE_BEGIN_STRING_LENGTH; - /* Retrieve message */ + /* check if e-mail message is present */ + if (!memcmp(pLook4Word, MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH)) { + pEndString += MESSAGE_BEGIN_STRING_LENGTH; + /* Retrieve message */ #ifdef NDEF_DYN_ALLOC - pEmailStruct->Message = malloc(PayloadSize - (pEndString - pPayload + 1) + 1); - if (pEmailStruct->Message != NULL) + pEmailStruct->Message = malloc(PayloadSize - (pEndString - pPayload + 1) + 1); + if (pEmailStruct->Message != NULL) #endif - { - memcpy(pEmailStruct->Message, pEndString, PayloadSize - (pEndString - pPayload + 1)); - /* add end of string character */ - pEmailStruct->Message[PayloadSize - (pEndString - pPayload + 1)] = 0; + { + memcpy(pEmailStruct->Message, pEndString, PayloadSize - (pEndString - pPayload + 1)); + /* add end of string character */ + pEmailStruct->Message[PayloadSize - (pEndString - pPayload + 1)] = 0; + } } - } } /** @@ -163,17 +163,17 @@ void NDEF::NDEF_FillEmailStruct(uint8_t *pPayload, uint32_t PayloadSize, sEmailI */ void NDEF::NDEF_ReadURI_Email(sRecordInfo_t *pRecordStruct, sEmailInfo *pEmailStruct) { - uint8_t *pPayload; - uint32_t PayloadSize; + uint8_t *pPayload; + uint32_t PayloadSize; - PayloadSize = pRecordStruct->PayloadLength; + PayloadSize = pRecordStruct->PayloadLength; - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - if (pRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { - NDEF_FillEmailStruct(pPayload, PayloadSize, pEmailStruct); - } + if (pRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { + NDEF_FillEmailStruct(pPayload, PayloadSize, pEmailStruct); + } } @@ -195,36 +195,36 @@ void NDEF::NDEF_ReadURI_Email(sRecordInfo_t *pRecordStruct, sEmailInfo *pEmailSt */ uint16_t NDEF::NDEF_ReadEmail(sRecordInfo_t *pRecordStruct, sEmailInfo *pEmailStruct) { - uint16_t status = NDEF_ERROR; - sRecordInfo_t *pSPRecordStruct; - uint32_t PayloadSize, RecordPosition; - uint8_t *pData; - - - if (pRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { - NDEF_ReadURI_Email(pRecordStruct, pEmailStruct); - status = NDEF_OK; - } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { - for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { - pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; - if (pSPRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { - NDEF_ReadURI_Email(pSPRecordStruct, pEmailStruct); - status = NDEF_OK; - } - if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { - PayloadSize = pSPRecordStruct->PayloadLength; + uint16_t status = NDEF_ERROR; + sRecordInfo_t *pSPRecordStruct; + uint32_t PayloadSize, RecordPosition; + uint8_t *pData; - /* The instruction content the UTF-8 language code that is not used here */ - pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; - PayloadSize -= *pData + 1; /* remove not useful data */ - pData += *pData + 1; - memcpy(pEmailStruct->Information, pData, PayloadSize); - } + if (pRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { + NDEF_ReadURI_Email(pRecordStruct, pEmailStruct); + status = NDEF_OK; + } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { + for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { + pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; + if (pSPRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { + NDEF_ReadURI_Email(pSPRecordStruct, pEmailStruct); + status = NDEF_OK; + } + if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { + PayloadSize = pSPRecordStruct->PayloadLength; + + /* The instruction content the UTF-8 language code that is not used here */ + pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; + PayloadSize -= *pData + 1; /* remove not useful data */ + pData += *pData + 1; + + memcpy(pEmailStruct->Information, pData, PayloadSize); + } + } } - } - return status; + return status; } /** @@ -239,13 +239,13 @@ uint16_t NDEF::NDEF_ReadEmail(sRecordInfo_t *pRecordStruct, sEmailInfo *pEmailSt */ uint16_t NDEF::NDEF_WriteEmail(sEmailInfo *pEmailStruct) { - uint16_t status = NDEF_ERROR, Offset = 0; + uint16_t status = NDEF_ERROR, Offset = 0; - NDEF_PrepareEmailMessage(pEmailStruct, NDEF_Buffer, &Offset); + NDEF_PrepareEmailMessage(pEmailStruct, NDEF_Buffer, &Offset); - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); - return status; + return status; } /** @@ -256,139 +256,139 @@ uint16_t NDEF::NDEF_WriteEmail(sEmailInfo *pEmailStruct) */ void NDEF::NDEF_PrepareEmailMessage(sEmailInfo *pEmailStruct, uint8_t *pNDEFMessage, uint16_t *size) { - uint16_t Offset = 0; - uint32_t emailSize = 0; - uint32_t infoSize = 0; - uint32_t totalSize = 0; - - /* Email is an URI but can be included in a smart poster to add text to give instruction to user for instance */ - - /* Email (smart poster) Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* Email : 1+@+1+subject+1+message */ - emailSize = 1 + strlen(pEmailStruct->EmailAdd) + URI_FIRST_DATA_END_LENGTH + SUBJECT_BEGIN_STRING_LENGTH + - strlen(pEmailStruct->Subject) + URI_SECOND_DATA_END_LENGTH + MESSAGE_BEGIN_STRING_LENGTH + strlen(pEmailStruct->Message); - - /* Check if a Smart poster is needed */ - if (pEmailStruct->Information[0] != '\0') { - /* Info : 1+2+info */ - infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pEmailStruct->Information); - /* Total */ - totalSize = 4 + emailSize + 4 + infoSize; - if (emailSize > 255) { - totalSize += 3; /* Normal Email size */ - } - if (infoSize > 255) { - totalSize += 3; /* Normal Info size */ + uint16_t Offset = 0; + uint32_t emailSize = 0; + uint32_t infoSize = 0; + uint32_t totalSize = 0; + + /* Email is an URI but can be included in a smart poster to add text to give instruction to user for instance */ + + /* Email (smart poster) Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* Email : 1+@+1+subject+1+message */ + emailSize = 1 + strlen(pEmailStruct->EmailAdd) + URI_FIRST_DATA_END_LENGTH + SUBJECT_BEGIN_STRING_LENGTH + + strlen(pEmailStruct->Subject) + URI_SECOND_DATA_END_LENGTH + MESSAGE_BEGIN_STRING_LENGTH + strlen(pEmailStruct->Message); + + /* Check if a Smart poster is needed */ + if (pEmailStruct->Information[0] != '\0') { + /* Info : 1+2+info */ + infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pEmailStruct->Information); + /* Total */ + totalSize = 4 + emailSize + 4 + infoSize; + if (emailSize > 255) { + totalSize += 3; /* Normal Email size */ + } + if (infoSize > 255) { + totalSize += 3; /* Normal Info size */ + } + + /* SmartPoster header */ + if (totalSize > 255) { + pNDEFMessage[Offset++] = 0xC1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = totalSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = 0xD1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)totalSize; + } + memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); + Offset += SMART_POSTER_TYPE_STRING_LENGTH; } - /* SmartPoster header */ - if (totalSize > 255) { - pNDEFMessage[Offset++] = 0xC1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = totalSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0xD1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)totalSize; + /* Email header */ + pNDEFMessage[Offset] = 0x81; + if (emailSize < 256) { + pNDEFMessage[Offset] |= 0x10; // Set the SR bit } - memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); - Offset += SMART_POSTER_TYPE_STRING_LENGTH; - } - - /* Email header */ - pNDEFMessage[Offset] = 0x81; - if (emailSize < 256) { - pNDEFMessage[Offset] |= 0x10; // Set the SR bit - } - if (pEmailStruct->Information[0] == '\0') { - pNDEFMessage[Offset] |= 0x40; // Set the ME bit - } - Offset++; - - pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; - if (emailSize > 255) { - pNDEFMessage[Offset++] = (emailSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (emailSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (emailSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = emailSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = (uint8_t)emailSize; - } - memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); - Offset += URI_TYPE_STRING_LENGTH; - - /* Email pay load */ - pNDEFMessage[Offset++] = URI_ID_0x06; - memcpy(&pNDEFMessage[Offset], pEmailStruct->EmailAdd, strlen(pEmailStruct->EmailAdd)); - Offset += strlen(pEmailStruct->EmailAdd); - memcpy(&pNDEFMessage[Offset], URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH); - Offset += URI_FIRST_DATA_END_LENGTH; - - memcpy(&pNDEFMessage[Offset], SUBJECT_BEGIN_STRING, SUBJECT_BEGIN_STRING_LENGTH); - Offset += SUBJECT_BEGIN_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], pEmailStruct->Subject, strlen(pEmailStruct->Subject)); - Offset += strlen(pEmailStruct->Subject); - memcpy(&pNDEFMessage[Offset], URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH); - Offset += URI_SECOND_DATA_END_LENGTH; - - memcpy(&pNDEFMessage[Offset], MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH); - Offset += MESSAGE_BEGIN_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], pEmailStruct->Message, strlen(pEmailStruct->Message)); - Offset += strlen(pEmailStruct->Message); - - /* Information header */ - if (pEmailStruct->Information[0] != '\0') { - if (infoSize > 255) { - pNDEFMessage[Offset++] = 0x41; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = infoSize & 0x000000FF; + if (pEmailStruct->Information[0] == '\0') { + pNDEFMessage[Offset] |= 0x40; // Set the ME bit + } + Offset++; + + pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; + if (emailSize > 255) { + pNDEFMessage[Offset++] = (emailSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (emailSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (emailSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = emailSize & 0x000000FF; } else { - pNDEFMessage[Offset++] = 0x51; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)infoSize; + pNDEFMessage[Offset++] = (uint8_t)emailSize; } + memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); + Offset += URI_TYPE_STRING_LENGTH; + + /* Email pay load */ + pNDEFMessage[Offset++] = URI_ID_0x06; + memcpy(&pNDEFMessage[Offset], pEmailStruct->EmailAdd, strlen(pEmailStruct->EmailAdd)); + Offset += strlen(pEmailStruct->EmailAdd); + memcpy(&pNDEFMessage[Offset], URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH); + Offset += URI_FIRST_DATA_END_LENGTH; + + memcpy(&pNDEFMessage[Offset], SUBJECT_BEGIN_STRING, SUBJECT_BEGIN_STRING_LENGTH); + Offset += SUBJECT_BEGIN_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], pEmailStruct->Subject, strlen(pEmailStruct->Subject)); + Offset += strlen(pEmailStruct->Subject); + memcpy(&pNDEFMessage[Offset], URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH); + Offset += URI_SECOND_DATA_END_LENGTH; + + memcpy(&pNDEFMessage[Offset], MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH); + Offset += MESSAGE_BEGIN_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], pEmailStruct->Message, strlen(pEmailStruct->Message)); + Offset += strlen(pEmailStruct->Message); + + /* Information header */ + if (pEmailStruct->Information[0] != '\0') { + if (infoSize > 255) { + pNDEFMessage[Offset++] = 0x41; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = infoSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = 0x51; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)infoSize; + } - memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); - Offset += TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ - memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); - Offset += ISO_ENGLISH_CODE_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); + Offset += TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ + memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); + Offset += ISO_ENGLISH_CODE_STRING_LENGTH; - /* Information payload */ - memcpy(&pNDEFMessage[Offset], pEmailStruct->Information, strlen(pEmailStruct->Information)); - Offset += strlen(pEmailStruct->Information); + /* Information payload */ + memcpy(&pNDEFMessage[Offset], pEmailStruct->Information, strlen(pEmailStruct->Information)); + Offset += strlen(pEmailStruct->Information); - } + } - *size = (uint16_t)(Offset); + *size = (uint16_t)(Offset); } @@ -399,21 +399,21 @@ void NDEF::NDEF_PrepareEmailMessage(sEmailInfo *pEmailStruct, uint8_t *pNDEFMess void NDEF::NDEF_closeEmail(sEmailInfo *pEmailStruct) { #ifdef NDEF_DYN_ALLOC - if (pEmailStruct->EmailAdd != NULL) { - free(pEmailStruct->EmailAdd); - } - if (pEmailStruct->Information != NULL) { - free(pEmailStruct->Information); - } - if (pEmailStruct->Message != NULL) { - free(pEmailStruct->Message); - } - if (pEmailStruct->Subject != NULL) { - free(pEmailStruct->Subject); - } + if (pEmailStruct->EmailAdd != NULL) { + free(pEmailStruct->EmailAdd); + } + if (pEmailStruct->Information != NULL) { + free(pEmailStruct->Information); + } + if (pEmailStruct->Message != NULL) { + free(pEmailStruct->Message); + } + if (pEmailStruct->Subject != NULL) { + free(pEmailStruct->Subject); + } #else - // Unused parameter - (void)(pEmailStruct); + // Unused parameter + (void)(pEmailStruct); #endif } diff --git a/src/libNDEF/lib_NDEF_Email.h b/src/libNDEF/lib_NDEF_Email.h index 5b4df66..8da5561 100755 --- a/src/libNDEF/lib_NDEF_Email.h +++ b/src/libNDEF/lib_NDEF_Email.h @@ -38,17 +38,17 @@ #ifdef NDEF_DYN_ALLOC typedef struct { - char *EmailAdd; - char *Subject; - char *Message; - char *Information; + char *EmailAdd; + char *Subject; + char *Message; + char *Information; } sEmailInfo; #else typedef struct { - char EmailAdd[64]; - char Subject[100]; - char Message[2000]; - char Information[400]; + char EmailAdd[64]; + char Subject[100]; + char Message[2000]; + char Information[400]; } sEmailInfo; #endif diff --git a/src/libNDEF/lib_NDEF_Geo.cpp b/src/libNDEF/lib_NDEF_Geo.cpp index 022784f..dbadc0b 100755 --- a/src/libNDEF/lib_NDEF_Geo.cpp +++ b/src/libNDEF/lib_NDEF_Geo.cpp @@ -61,43 +61,43 @@ */ void NDEF::NDEF_FillGeoStruct(uint8_t *pPayload, uint32_t PayloadSize, sGeoInfo *pGeoStruct) { - uint8_t *pLastByteAdd, *pLook4Word, *pEndString; - const char *pKeyWord = GEO_TYPE_STRING; - uint32_t SizeOfKeyWord = GEO_TYPE_STRING_LENGTH; - pEndString = 0; - - /* First character force to NULL in case not matching found */ - *pGeoStruct->Latitude = 0; - *pGeoStruct->Longitude = 0; - - /* Interesting information are stored before picture if any */ - /* Moreover picture is not used in this demonstration SW */ - pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); - - pLook4Word = pPayload; - while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { - pLook4Word++; - } - - /* Retrieve phone number */ - if (pLook4Word != pLastByteAdd) { - pLook4Word += SizeOfKeyWord; - pEndString = pLook4Word; - while (memcmp(pEndString, URI_LATITUDE_END, URI_LATITUDE_END_LENGTH) && (pEndString < pLastByteAdd)) { - pEndString++; + uint8_t *pLastByteAdd, *pLook4Word, *pEndString; + const char *pKeyWord = GEO_TYPE_STRING; + uint32_t SizeOfKeyWord = GEO_TYPE_STRING_LENGTH; + pEndString = 0; + + /* First character force to NULL in case not matching found */ + *pGeoStruct->Latitude = 0; + *pGeoStruct->Longitude = 0; + + /* Interesting information are stored before picture if any */ + /* Moreover picture is not used in this demonstration SW */ + pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); + + pLook4Word = pPayload; + while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { + pLook4Word++; } - if (pEndString != pLastByteAdd) { - memcpy(pGeoStruct->Latitude, pLook4Word, pEndString - pLook4Word); - /* add end of string character */ - pGeoStruct->Latitude[pEndString - pLook4Word] = 0; + + /* Retrieve phone number */ + if (pLook4Word != pLastByteAdd) { + pLook4Word += SizeOfKeyWord; + pEndString = pLook4Word; + while (memcmp(pEndString, URI_LATITUDE_END, URI_LATITUDE_END_LENGTH) && (pEndString < pLastByteAdd)) { + pEndString++; + } + if (pEndString != pLastByteAdd) { + memcpy(pGeoStruct->Latitude, pLook4Word, pEndString - pLook4Word); + /* add end of string character */ + pGeoStruct->Latitude[pEndString - pLook4Word] = 0; + } } - } - pEndString += URI_LATITUDE_END_LENGTH; - pLook4Word = pEndString; + pEndString += URI_LATITUDE_END_LENGTH; + pLook4Word = pEndString; - memcpy(pGeoStruct->Longitude, pEndString, PayloadSize - (pEndString - pPayload)); - /* add end of string character */ - pGeoStruct->Longitude[PayloadSize - (pEndString - pPayload)] = 0; + memcpy(pGeoStruct->Longitude, pEndString, PayloadSize - (pEndString - pPayload)); + /* add end of string character */ + pGeoStruct->Longitude[PayloadSize - (pEndString - pPayload)] = 0; } @@ -108,17 +108,17 @@ void NDEF::NDEF_FillGeoStruct(uint8_t *pPayload, uint32_t PayloadSize, sGeoInfo */ void NDEF::NDEF_ReadURI_Geo(sRecordInfo_t *pRecordStruct, sGeoInfo *pGeoStruct) { - uint8_t *pPayload; - uint32_t PayloadSize; + uint8_t *pPayload; + uint32_t PayloadSize; - PayloadSize = pRecordStruct->PayloadLength; + PayloadSize = pRecordStruct->PayloadLength; - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - if (pRecordStruct->NDEF_Type == URI_GEO_TYPE) { - NDEF_FillGeoStruct(pPayload, PayloadSize, pGeoStruct); - } + if (pRecordStruct->NDEF_Type == URI_GEO_TYPE) { + NDEF_FillGeoStruct(pPayload, PayloadSize, pGeoStruct); + } } @@ -140,37 +140,37 @@ void NDEF::NDEF_ReadURI_Geo(sRecordInfo_t *pRecordStruct, sGeoInfo *pGeoStruct) */ uint16_t NDEF::NDEF_ReadGeo(sRecordInfo_t *pRecordStruct, sGeoInfo *pGeoStruct) { - uint16_t status = NDEF_ERROR; - sRecordInfo_t *pSPRecordStruct; - uint32_t PayloadSize, RecordPosition; - uint8_t *pData; - - if (pRecordStruct->NDEF_Type == URI_GEO_TYPE) { - NDEF_ReadURI_Geo(pRecordStruct, pGeoStruct); - status = NDEF_OK; - } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { - for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { - pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; - if (pSPRecordStruct->NDEF_Type == URI_GEO_TYPE) { - NDEF_ReadURI_Geo(pSPRecordStruct, pGeoStruct); + uint16_t status = NDEF_ERROR; + sRecordInfo_t *pSPRecordStruct; + uint32_t PayloadSize, RecordPosition; + uint8_t *pData; + + if (pRecordStruct->NDEF_Type == URI_GEO_TYPE) { + NDEF_ReadURI_Geo(pRecordStruct, pGeoStruct); status = NDEF_OK; - } - if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { - PayloadSize = pSPRecordStruct->PayloadLength; - - /* The instruction content the UTF-8 language code that is not used here */ - pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; - PayloadSize -= *pData + 1; /* remove not useful data */ - pData += *pData + 1; /* set pointer on useful data */ - - memcpy(pGeoStruct->Information, pData, PayloadSize); - /* add end of string character */ - pGeoStruct->Information[PayloadSize] = 0; - } + } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { + for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { + pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; + if (pSPRecordStruct->NDEF_Type == URI_GEO_TYPE) { + NDEF_ReadURI_Geo(pSPRecordStruct, pGeoStruct); + status = NDEF_OK; + } + if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { + PayloadSize = pSPRecordStruct->PayloadLength; + + /* The instruction content the UTF-8 language code that is not used here */ + pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; + PayloadSize -= *pData + 1; /* remove not useful data */ + pData += *pData + 1; /* set pointer on useful data */ + + memcpy(pGeoStruct->Information, pData, PayloadSize); + /* add end of string character */ + pGeoStruct->Information[PayloadSize] = 0; + } + } } - } - return status; + return status; } /** @@ -184,13 +184,13 @@ uint16_t NDEF::NDEF_ReadGeo(sRecordInfo_t *pRecordStruct, sGeoInfo *pGeoStruct) */ uint16_t NDEF::NDEF_WriteGeo(sGeoInfo *pGeoStruct) { - uint16_t status = NDEF_ERROR, Offset = 0; + uint16_t status = NDEF_ERROR, Offset = 0; - NDEF_PrepareGeoMessage(pGeoStruct, NDEF_Buffer, &Offset); + NDEF_PrepareGeoMessage(pGeoStruct, NDEF_Buffer, &Offset); - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); - return status; + return status; } /** @@ -201,129 +201,129 @@ uint16_t NDEF::NDEF_WriteGeo(sGeoInfo *pGeoStruct) */ void NDEF::NDEF_PrepareGeoMessage(sGeoInfo *pGeoStruct, uint8_t *pNDEFMessage, uint16_t *size) { - uint16_t Offset = 0; - uint32_t geoSize = 0; - uint32_t infoSize = 0; - uint32_t totalSize = 0; - - /* GEO is an URI but can be included in a smart poster to add text to give instruction to user for instance */ - - /* GEO (smart poster) Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* GEO : 1+geo:+latitude+1+longitude */ - geoSize = 1 + GEO_TYPE_STRING_LENGTH + strlen(pGeoStruct->Latitude) + URI_LATITUDE_END_LENGTH + strlen(pGeoStruct->Longitude); - - /* Check if a Smart poster is needed */ - if (pGeoStruct->Information[0] != '\0') { - /* Info : 1+2+info */ - infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pGeoStruct->Information); - /* Total */ - totalSize = 4 + geoSize + 4 + infoSize; - if (geoSize > 255) { - totalSize += 3; /* Normal Geo size */ + uint16_t Offset = 0; + uint32_t geoSize = 0; + uint32_t infoSize = 0; + uint32_t totalSize = 0; + + /* GEO is an URI but can be included in a smart poster to add text to give instruction to user for instance */ + + /* GEO (smart poster) Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* GEO : 1+geo:+latitude+1+longitude */ + geoSize = 1 + GEO_TYPE_STRING_LENGTH + strlen(pGeoStruct->Latitude) + URI_LATITUDE_END_LENGTH + strlen(pGeoStruct->Longitude); + + /* Check if a Smart poster is needed */ + if (pGeoStruct->Information[0] != '\0') { + /* Info : 1+2+info */ + infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pGeoStruct->Information); + /* Total */ + totalSize = 4 + geoSize + 4 + infoSize; + if (geoSize > 255) { + totalSize += 3; /* Normal Geo size */ + } + if (infoSize > 255) { + totalSize += 3; /* Normal Info size */ + } + + /* SmartPoster header */ + if (totalSize > 255) { + pNDEFMessage[Offset++] = 0xC1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = totalSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = 0xD1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)totalSize; + } + memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); + Offset += SMART_POSTER_TYPE_STRING_LENGTH; + } + + /* GEO header */ + pNDEFMessage[Offset] = 0x81; + if (geoSize < 256) { + pNDEFMessage[Offset] |= 0x10; // Set the SR bit } - if (infoSize > 255) { - totalSize += 3; /* Normal Info size */ + if (pGeoStruct->Information[0] == '\0') { + pNDEFMessage[Offset] |= 0x40; // Set the ME bit } + Offset++; - /* SmartPoster header */ - if (totalSize > 255) { - pNDEFMessage[Offset++] = 0xC1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = totalSize & 0x000000FF; + pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; + if (geoSize > 255) { + pNDEFMessage[Offset++] = (geoSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (geoSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (geoSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = geoSize & 0x000000FF; } else { - pNDEFMessage[Offset++] = 0xD1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)totalSize; + pNDEFMessage[Offset++] = (uint8_t)geoSize; } - memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); - Offset += SMART_POSTER_TYPE_STRING_LENGTH; - } - - /* GEO header */ - pNDEFMessage[Offset] = 0x81; - if (geoSize < 256) { - pNDEFMessage[Offset] |= 0x10; // Set the SR bit - } - if (pGeoStruct->Information[0] == '\0') { - pNDEFMessage[Offset] |= 0x40; // Set the ME bit - } - Offset++; - - pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; - if (geoSize > 255) { - pNDEFMessage[Offset++] = (geoSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (geoSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (geoSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = geoSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = (uint8_t)geoSize; - } - memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); - Offset += URI_TYPE_STRING_LENGTH; - - /* GEO payload */ - pNDEFMessage[Offset++] = URI_ID_0x00; /* URI identifier no abbreviation */ - memcpy(&pNDEFMessage[Offset], GEO_TYPE_STRING, GEO_TYPE_STRING_LENGTH); - Offset += GEO_TYPE_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], pGeoStruct->Latitude, strlen(pGeoStruct->Latitude)); - Offset += strlen(pGeoStruct->Latitude); - memcpy(&pNDEFMessage[Offset], URI_LATITUDE_END, URI_LATITUDE_END_LENGTH); - Offset += URI_LATITUDE_END_LENGTH; - memcpy(&pNDEFMessage[Offset], pGeoStruct->Longitude, strlen(pGeoStruct->Longitude)); - Offset += strlen(pGeoStruct->Longitude); - - /* Information header */ - if (pGeoStruct->Information[0] != '\0') { - if (infoSize > 255) { - pNDEFMessage[Offset++] = 0x41; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = infoSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0x51; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)infoSize; + memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); + Offset += URI_TYPE_STRING_LENGTH; + + /* GEO payload */ + pNDEFMessage[Offset++] = URI_ID_0x00; /* URI identifier no abbreviation */ + memcpy(&pNDEFMessage[Offset], GEO_TYPE_STRING, GEO_TYPE_STRING_LENGTH); + Offset += GEO_TYPE_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], pGeoStruct->Latitude, strlen(pGeoStruct->Latitude)); + Offset += strlen(pGeoStruct->Latitude); + memcpy(&pNDEFMessage[Offset], URI_LATITUDE_END, URI_LATITUDE_END_LENGTH); + Offset += URI_LATITUDE_END_LENGTH; + memcpy(&pNDEFMessage[Offset], pGeoStruct->Longitude, strlen(pGeoStruct->Longitude)); + Offset += strlen(pGeoStruct->Longitude); + + /* Information header */ + if (pGeoStruct->Information[0] != '\0') { + if (infoSize > 255) { + pNDEFMessage[Offset++] = 0x41; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = infoSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = 0x51; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)infoSize; + } + + memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); + Offset += TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ + memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); + Offset += ISO_ENGLISH_CODE_STRING_LENGTH; + + /* Information payload */ + memcpy(&pNDEFMessage[Offset], pGeoStruct->Information, strlen(pGeoStruct->Information)); + Offset += strlen(pGeoStruct->Information); } - memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); - Offset += TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ - memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); - Offset += ISO_ENGLISH_CODE_STRING_LENGTH; - - /* Information payload */ - memcpy(&pNDEFMessage[Offset], pGeoStruct->Information, strlen(pGeoStruct->Information)); - Offset += strlen(pGeoStruct->Information); - } - - *size = (uint16_t)(Offset); + *size = (uint16_t)(Offset); } /** diff --git a/src/libNDEF/lib_NDEF_Geo.h b/src/libNDEF/lib_NDEF_Geo.h index 2ba6569..346ea3b 100755 --- a/src/libNDEF/lib_NDEF_Geo.h +++ b/src/libNDEF/lib_NDEF_Geo.h @@ -35,9 +35,9 @@ #include "lib_NDEF.h" typedef struct { - char Latitude[GEO_LATITUDE_MAX_SIZE]; - char Longitude[GEO_LONGITUDE_MAX_SIZE]; - char Information[GEO_INFO_MAX_SIZE]; + char Latitude[GEO_LATITUDE_MAX_SIZE]; + char Longitude[GEO_LONGITUDE_MAX_SIZE]; + char Information[GEO_INFO_MAX_SIZE]; } sGeoInfo; #endif /* __LIB_NDEF_GEO_H */ diff --git a/src/libNDEF/lib_NDEF_Handover.cpp b/src/libNDEF/lib_NDEF_Handover.cpp index 91c8354..96e50e1 100755 --- a/src/libNDEF/lib_NDEF_Handover.cpp +++ b/src/libNDEF/lib_NDEF_Handover.cpp @@ -147,52 +147,52 @@ */ uint16_t NDEF::NDEF_ReadAuxData(uint8_t aux_data_nb, Ndef_Handover_alternative_carrier_t *pAC, sRecordInfo_t *pRecord) { - uint16_t status; - uint8_t *pData = pAC->aux_data_ref_start; - uint8_t current_aux = 0; - uint8_t *aux_id = NULL; - uint8_t aux_id_length = 0; - - if ((pAC->aux_data_ref_start == NULL) || - (pAC->aux_data_ref_end == NULL) || - (pAC->aux_data_ref_count == 0) || - (aux_data_nb >= pAC->aux_data_ref_count)) { + uint16_t status; + uint8_t *pData = pAC->aux_data_ref_start; + uint8_t current_aux = 0; + uint8_t *aux_id = NULL; + uint8_t aux_id_length = 0; + + if ((pAC->aux_data_ref_start == NULL) || + (pAC->aux_data_ref_end == NULL) || + (pAC->aux_data_ref_count == 0) || + (aux_data_nb >= pAC->aux_data_ref_count)) { + return NDEF_ERROR; + } + + + while ((current_aux < aux_data_nb) && (pData < pAC->aux_data_ref_end)) { + aux_id_length = *pData++; + aux_id = pData; + pData += aux_id_length; + current_aux++; + } + + pData = pAC->aux_data_ref_end; + /* if ac has been found */ + if (current_aux == aux_data_nb) { + /* let's now look for the corresponding record - must be after the Handover record */ + do { + status = NDEF_IdentifyBuffer(pRecord, pData); + if (status != NDEF_OK) { + return status; + } + pData = pAC->ac_record.PayloadBufferAdd; + + if ((pRecord->IDLength == aux_id_length) && + !memcmp(pRecord->ID, aux_id, aux_id_length)) { + /* this is the record we were looking for, so exit */ + return NDEF_OK; + } + + // go to next record + pData = pRecord->PayloadBufferAdd + pRecord->PayloadLength; + + } while (!(pRecord->RecordFlags & MB_Mask)); + + } + // if we go there, it means that the record ID is not found return NDEF_ERROR; - } - - - while ((current_aux < aux_data_nb) && (pData < pAC->aux_data_ref_end)) { - aux_id_length = *pData++; - aux_id = pData; - pData += aux_id_length; - current_aux++; - } - - pData = pAC->aux_data_ref_end; - /* if ac has been found */ - if (current_aux == aux_data_nb) { - /* let's now look for the corresponding record - must be after the Handover record */ - do { - status = NDEF_IdentifyBuffer(pRecord, pData); - if (status != NDEF_OK) { - return status; - } - pData = pAC->ac_record.PayloadBufferAdd; - - if ((pRecord->IDLength == aux_id_length) && - !memcmp(pRecord->ID, aux_id, aux_id_length)) { - /* this is the record we were looking for, so exit */ - return NDEF_OK; - } - - // go to next record - pData = pRecord->PayloadBufferAdd + pRecord->PayloadLength; - - } while (!(pRecord->RecordFlags & MB_Mask)); - - } - // if we go there, it means that the record ID is not found - return NDEF_ERROR; } @@ -207,73 +207,73 @@ uint16_t NDEF::NDEF_ReadAuxData(uint8_t aux_data_nb, Ndef_Handover_alternative_c */ uint16_t NDEF::NDEF_ReadAC(uint8_t ac_nb, Ndef_Handover_t *pHandover, Ndef_Handover_alternative_carrier_t *pAC) { - uint16_t status; - uint8_t *pData = pHandover->ac_start; - uint8_t current_ac = 0; - uint8_t *ac_id; - uint8_t ac_id_length; - sRecordInfo_t NestedRecord; - uint8_t ac_found = 0; - - if ((pHandover->ac_start == NULL) || - (pHandover->ac_end == NULL) || - (pHandover->nb_alternative_carrier == 0) || - (ac_nb >= pHandover->nb_alternative_carrier)) { - return NDEF_ERROR; - } - - // Default handover init - pAC->aux_data_ref_count = 0; + uint16_t status; + uint8_t *pData = pHandover->ac_start; + uint8_t current_ac = 0; + uint8_t *ac_id; + uint8_t ac_id_length; + sRecordInfo_t NestedRecord; + uint8_t ac_found = 0; + + if ((pHandover->ac_start == NULL) || + (pHandover->ac_end == NULL) || + (pHandover->nb_alternative_carrier == 0) || + (ac_nb >= pHandover->nb_alternative_carrier)) { + return NDEF_ERROR; + } - while ((current_ac <= ac_nb) && (current_ac <= pHandover->nb_alternative_carrier) && (pData < pHandover->ac_end)) { - status = NDEF_IdentifyBuffer(&NestedRecord, pData); - if (status != NDEF_OK) { - return status; + // Default handover init + pAC->aux_data_ref_count = 0; + + while ((current_ac <= ac_nb) && (current_ac <= pHandover->nb_alternative_carrier) && (pData < pHandover->ac_end)) { + status = NDEF_IdentifyBuffer(&NestedRecord, pData); + if (status != NDEF_OK) { + return status; + } + // go to payload address + pData = NestedRecord.PayloadBufferAdd; + + if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR))) { + if (current_ac == ac_nb) { + // parse the AC now + pAC->cps = pData[0] & NDEF_HANDOVER_AC_CPS_MASK; + ac_id_length = pData[1]; + ac_id = &pData[2]; + pAC->aux_data_ref_count = pData[2 + ac_id_length]; + pAC->aux_data_ref_start = &pData[3 + ac_id_length]; + pAC->aux_data_ref_end = pData + NestedRecord.PayloadLength; + ac_found = 1; + } + current_ac++; + } + // go to next record + pData += NestedRecord.PayloadLength; } - // go to payload address - pData = NestedRecord.PayloadBufferAdd; - - if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR))) { - if (current_ac == ac_nb) { - // parse the AC now - pAC->cps = pData[0] & NDEF_HANDOVER_AC_CPS_MASK; - ac_id_length = pData[1]; - ac_id = &pData[2]; - pAC->aux_data_ref_count = pData[2 + ac_id_length]; - pAC->aux_data_ref_start = &pData[3 + ac_id_length]; - pAC->aux_data_ref_end = pData + NestedRecord.PayloadLength; - ac_found = 1; - } - current_ac++; + pData = pHandover->ac_end; + /* if ac has been found */ + if (ac_found) { + /* let's now look for the corresponding record - must be after the Handover record */ + do { + status = NDEF_IdentifyBuffer(&pAC->ac_record, pData); + if (status != NDEF_OK) { + return status; + } + pData = pAC->ac_record.PayloadBufferAdd; + + if ((pAC->ac_record.IDLength == ac_id_length) && + !memcmp(pAC->ac_record.ID, ac_id, ac_id_length)) { + /* this is the record we were looking for, so exit */ + return NDEF_OK; + } + + // go to next record + pData = pAC->ac_record.PayloadBufferAdd + pAC->ac_record.PayloadLength; + // TO DO: add a security condition to avoid infinite loop if NDEF file is corrupted + } while (!(pAC->ac_record.RecordFlags & ME_Mask)); + } - // go to next record - pData += NestedRecord.PayloadLength; - } - pData = pHandover->ac_end; - /* if ac has been found */ - if (ac_found) { - /* let's now look for the corresponding record - must be after the Handover record */ - do { - status = NDEF_IdentifyBuffer(&pAC->ac_record, pData); - if (status != NDEF_OK) { - return status; - } - pData = pAC->ac_record.PayloadBufferAdd; - - if ((pAC->ac_record.IDLength == ac_id_length) && - !memcmp(pAC->ac_record.ID, ac_id, ac_id_length)) { - /* this is the record we were looking for, so exit */ - return NDEF_OK; - } - - // go to next record - pData = pAC->ac_record.PayloadBufferAdd + pAC->ac_record.PayloadLength; - // TO DO: add a security condition to avoid infinite loop if NDEF file is corrupted - } while (!(pAC->ac_record.RecordFlags & ME_Mask)); - - } - // if we go there, it means that the record ID is not found - return NDEF_ERROR; + // if we go there, it means that the record ID is not found + return NDEF_ERROR; } @@ -286,71 +286,71 @@ uint16_t NDEF::NDEF_ReadAC(uint8_t ac_nb, Ndef_Handover_t *pHandover, Ndef_Hando */ uint16_t NDEF::NDEF_ReadHandover(sRecordInfo_t *pRecord, Ndef_Handover_t *pHandover) { - uint16_t status; - uint8_t *pData = pRecord->PayloadBufferAdd; - uint8_t *pEnd = pData + pRecord->PayloadLength; - sRecordInfo_t NestedRecord; - - /* Default Handover Structure init */ - pHandover->version = 0; - pHandover->nb_alternative_carrier = 0; - pHandover->has_cr = 0; - pHandover->ac_start = NULL; - pHandover->ac_end = NULL; - - /* A Handover record should never be the end of the NDEF message */ - if (pRecord->RecordFlags & ME_Mask) { - return NDEF_ERROR; - } - - if (!memcmp(pRecord->Type, NDEF_HANDOVER_REQUEST_TYPE_STR, strlen(NDEF_HANDOVER_REQUEST_TYPE_STR))) { - pHandover->type = NDEF_HANDOVER_REQUEST_TYPE; - } else if (!memcmp(pRecord->Type, NDEF_HANDOVER_SELECT_TYPE_STR, strlen(NDEF_HANDOVER_SELECT_TYPE_STR))) { - pHandover->type = NDEF_HANDOVER_SELECT_TYPE; - } else { - /* This is not a Handover record! */ - return NDEF_ERROR; - } - - pHandover->version = *pData++; - - /* Following records are nested into Hr/s record */ - while (pData < pEnd) { - status = NDEF_IdentifyBuffer(&NestedRecord, pData); - if (status != NDEF_OK) { - return status; - } - /* save record address */ - uint8_t *pACRecord = pData; - /* go to payload address */ - pData = NestedRecord.PayloadBufferAdd; - - /* Parse Collision Resolution if Handover request */ - if (pHandover->type == NDEF_HANDOVER_REQUEST_TYPE) { - - if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_COLLISION_RESOLUTION_TYPE_STR, strlen(NDEF_HANDOVER_COLLISION_RESOLUTION_TYPE_STR))) { - pHandover->has_cr = 1; - pHandover->cr_random_number = *(uint16_t *)pData; - } + uint16_t status; + uint8_t *pData = pRecord->PayloadBufferAdd; + uint8_t *pEnd = pData + pRecord->PayloadLength; + sRecordInfo_t NestedRecord; + + /* Default Handover Structure init */ + pHandover->version = 0; + pHandover->nb_alternative_carrier = 0; + pHandover->has_cr = 0; + pHandover->ac_start = NULL; + pHandover->ac_end = NULL; + + /* A Handover record should never be the end of the NDEF message */ + if (pRecord->RecordFlags & ME_Mask) { + return NDEF_ERROR; } - /* Parse AlternativeCarriers just to know how many they are */ - else if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR))) { - pHandover->nb_alternative_carrier++; - if (pHandover->ac_start == NULL) { - pHandover->ac_start = pACRecord; - } - pHandover->ac_end = pData + NestedRecord.PayloadLength; - /* don't parse the AC now */ + if (!memcmp(pRecord->Type, NDEF_HANDOVER_REQUEST_TYPE_STR, strlen(NDEF_HANDOVER_REQUEST_TYPE_STR))) { + pHandover->type = NDEF_HANDOVER_REQUEST_TYPE; + } else if (!memcmp(pRecord->Type, NDEF_HANDOVER_SELECT_TYPE_STR, strlen(NDEF_HANDOVER_SELECT_TYPE_STR))) { + pHandover->type = NDEF_HANDOVER_SELECT_TYPE; } else { - /* this is an unexpected type, just ignore it */ + /* This is not a Handover record! */ + return NDEF_ERROR; } - /* go to next record */ - pData += NestedRecord.PayloadLength; - } + pHandover->version = *pData++; + + /* Following records are nested into Hr/s record */ + while (pData < pEnd) { + status = NDEF_IdentifyBuffer(&NestedRecord, pData); + if (status != NDEF_OK) { + return status; + } + /* save record address */ + uint8_t *pACRecord = pData; + /* go to payload address */ + pData = NestedRecord.PayloadBufferAdd; + + /* Parse Collision Resolution if Handover request */ + if (pHandover->type == NDEF_HANDOVER_REQUEST_TYPE) { + + if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_COLLISION_RESOLUTION_TYPE_STR, strlen(NDEF_HANDOVER_COLLISION_RESOLUTION_TYPE_STR))) { + pHandover->has_cr = 1; + pHandover->cr_random_number = *(uint16_t *)pData; + } + } + + /* Parse AlternativeCarriers just to know how many they are */ + else if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR))) { + pHandover->nb_alternative_carrier++; + if (pHandover->ac_start == NULL) { + pHandover->ac_start = pACRecord; + } + pHandover->ac_end = pData + NestedRecord.PayloadLength; + /* don't parse the AC now */ + } else { + /* this is an unexpected type, just ignore it */ + } + /* go to next record */ + pData += NestedRecord.PayloadLength; - return NDEF_OK; + } + + return NDEF_OK; } /** @@ -362,34 +362,34 @@ uint16_t NDEF::NDEF_ReadHandover(sRecordInfo_t *pRecord, Ndef_Handover_t *pHand */ uint16_t NDEF::NDEF_CreateHandover(Ndef_Handover_t *pHandover, sRecordInfo_t *pRecord) { - uint16_t status = NDEF_ERROR; - - /* Use a static buffer to prepare the Handover record */ - pRecord->PayloadBufferAdd = NDEF_Record_Buffer; - /* Alternative, where the user must first allocate the Payload buffer in the record: - * if (pRecord->PayloadBufferAdd == NULL) - * return NDEF_ERROR; - */ - - /* Handover MUST be the first record (SR mask to be updated when actually writing the record) */ - pRecord->RecordFlags = MB_Mask | ME_Mask | TNF_WellKnown; - - if (pHandover->type == NDEF_HANDOVER_SELECT_TYPE) { - pRecord->TypeLength = strlen(NDEF_HANDOVER_SELECT_TYPE_STR); - memcpy(pRecord->Type, NDEF_HANDOVER_SELECT_TYPE_STR, pRecord->TypeLength); - } else if (pHandover->type == NDEF_HANDOVER_REQUEST_TYPE) { - pRecord->TypeLength = strlen(NDEF_HANDOVER_SELECT_TYPE_STR); - memcpy(pRecord->Type, NDEF_HANDOVER_REQUEST_TYPE_STR, pRecord->TypeLength); - } else { - return NDEF_ERROR; - } + uint16_t status = NDEF_ERROR; + + /* Use a static buffer to prepare the Handover record */ + pRecord->PayloadBufferAdd = NDEF_Record_Buffer; + /* Alternative, where the user must first allocate the Payload buffer in the record: + * if (pRecord->PayloadBufferAdd == NULL) + * return NDEF_ERROR; + */ + + /* Handover MUST be the first record (SR mask to be updated when actually writing the record) */ + pRecord->RecordFlags = MB_Mask | ME_Mask | TNF_WellKnown; + + if (pHandover->type == NDEF_HANDOVER_SELECT_TYPE) { + pRecord->TypeLength = strlen(NDEF_HANDOVER_SELECT_TYPE_STR); + memcpy(pRecord->Type, NDEF_HANDOVER_SELECT_TYPE_STR, pRecord->TypeLength); + } else if (pHandover->type == NDEF_HANDOVER_REQUEST_TYPE) { + pRecord->TypeLength = strlen(NDEF_HANDOVER_SELECT_TYPE_STR); + memcpy(pRecord->Type, NDEF_HANDOVER_REQUEST_TYPE_STR, pRecord->TypeLength); + } else { + return NDEF_ERROR; + } - pRecord->PayloadLength = sizeof(pHandover->version); - *pRecord->PayloadBufferAdd = pHandover->version; + pRecord->PayloadLength = sizeof(pHandover->version); + *pRecord->PayloadBufferAdd = pHandover->version; - /* Don't write the record for now, additional Alternative Carriers to come as nested records. */ + /* Don't write the record for now, additional Alternative Carriers to come as nested records. */ - return status; + return status; } @@ -405,50 +405,50 @@ uint16_t NDEF::NDEF_CreateHandover(Ndef_Handover_t *pHandover, sRecordInfo_t *p */ uint16_t NDEF::NDEF_AddAlternativeCarrier(Ndef_Handover_alternative_carrier_t *pAC, char *CarrierDataRef, char **AuxDataRefID, sRecordInfo_t *pRecord) { - memset(NDEF_AlternativeCarrier_Buffer, 0x0, ((sizeof(uint8_t))*NDEF_AC_BUFFER_SIZE)); - - /* check that there is enough space in the buffers */ - pAC->ac_record.PayloadLength = NDEF_GetACDataLength(pAC, CarrierDataRef, AuxDataRefID); - if (((pRecord->PayloadLength + pAC->ac_record.PayloadLength) > NDEF_RECORD_MAX_SIZE) || - (pAC->ac_record.PayloadLength > NDEF_AC_BUFFER_SIZE)) { - return NDEF_ERROR_MEMORY_INTERNAL; - } - - /* Use specific buffer to prepare the nested record */ - uint8_t *pData = NDEF_AlternativeCarrier_Buffer; - pAC->ac_record.PayloadBufferAdd = pData; - /* Following line is an alternative where the user must allocate the payload buffer of the ac_record: - * uint8_t* pData = pAC->ac_record.PayloadBufferAdd ; - */ - - if ((pRecord->PayloadBufferAdd == NULL) || - (pRecord->PayloadLength == 0)) { - return NDEF_ERROR; - } - - /* AC is not the first record */ - pAC->ac_record.RecordFlags = TNF_WellKnown; - - pAC->ac_record.TypeLength = strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR); - memcpy(pAC->ac_record.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, pAC->ac_record.TypeLength); - - /* Length : cps byte + data ref length byte + auxiliary data ref count byte + data ref length */ - *pData++ = pAC->cps & NDEF_HANDOVER_AC_CPS_MASK; - *pData++ = strlen(CarrierDataRef); - memcpy(pData, CarrierDataRef, strlen(CarrierDataRef)); - pData += strlen(CarrierDataRef); - *pData++ = pAC->aux_data_ref_count; - - uint8_t AuxDataIndex; - for (AuxDataIndex = 0; AuxDataIndex < pAC->aux_data_ref_count; AuxDataIndex++) { - *pData++ = strlen(AuxDataRefID[AuxDataIndex]); - memcpy(pData, AuxDataRefID[AuxDataIndex], strlen(AuxDataRefID[AuxDataIndex])); - pData += strlen(AuxDataRefID[AuxDataIndex]); - } - - /* Append the nested record right after the Handover record - increase its length accordingly */ - pRecord->PayloadLength += NDEF_WriteRecord(&pAC->ac_record, pRecord->PayloadBufferAdd + pRecord->PayloadLength); - return NDEF_OK; + memset(NDEF_AlternativeCarrier_Buffer, 0x0, ((sizeof(uint8_t))*NDEF_AC_BUFFER_SIZE)); + + /* check that there is enough space in the buffers */ + pAC->ac_record.PayloadLength = NDEF_GetACDataLength(pAC, CarrierDataRef, AuxDataRefID); + if (((pRecord->PayloadLength + pAC->ac_record.PayloadLength) > NDEF_RECORD_MAX_SIZE) || + (pAC->ac_record.PayloadLength > NDEF_AC_BUFFER_SIZE)) { + return NDEF_ERROR_MEMORY_INTERNAL; + } + + /* Use specific buffer to prepare the nested record */ + uint8_t *pData = NDEF_AlternativeCarrier_Buffer; + pAC->ac_record.PayloadBufferAdd = pData; + /* Following line is an alternative where the user must allocate the payload buffer of the ac_record: + * uint8_t* pData = pAC->ac_record.PayloadBufferAdd ; + */ + + if ((pRecord->PayloadBufferAdd == NULL) || + (pRecord->PayloadLength == 0)) { + return NDEF_ERROR; + } + + /* AC is not the first record */ + pAC->ac_record.RecordFlags = TNF_WellKnown; + + pAC->ac_record.TypeLength = strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR); + memcpy(pAC->ac_record.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, pAC->ac_record.TypeLength); + + /* Length : cps byte + data ref length byte + auxiliary data ref count byte + data ref length */ + *pData++ = pAC->cps & NDEF_HANDOVER_AC_CPS_MASK; + *pData++ = strlen(CarrierDataRef); + memcpy(pData, CarrierDataRef, strlen(CarrierDataRef)); + pData += strlen(CarrierDataRef); + *pData++ = pAC->aux_data_ref_count; + + uint8_t AuxDataIndex; + for (AuxDataIndex = 0; AuxDataIndex < pAC->aux_data_ref_count; AuxDataIndex++) { + *pData++ = strlen(AuxDataRefID[AuxDataIndex]); + memcpy(pData, AuxDataRefID[AuxDataIndex], strlen(AuxDataRefID[AuxDataIndex])); + pData += strlen(AuxDataRefID[AuxDataIndex]); + } + + /* Append the nested record right after the Handover record - increase its length accordingly */ + pRecord->PayloadLength += NDEF_WriteRecord(&pAC->ac_record, pRecord->PayloadBufferAdd + pRecord->PayloadLength); + return NDEF_OK; } @@ -461,21 +461,21 @@ uint16_t NDEF::NDEF_AddAlternativeCarrier(Ndef_Handover_alternative_carrier_t *p */ uint32_t NDEF::NDEF_GetACDataLength(Ndef_Handover_alternative_carrier_t *pAC, char *CarrierDataRef, char **AuxDataRefID) { - uint8_t AuxDataIndex; - - /* First compute the Data length */ - uint32_t length = 1 + // cps - 1 + // Carrier data ref length - strlen(CarrierDataRef) + // Carrier data ref - 1 + // auxiliary data count - pAC->aux_data_ref_count * 1; // auxiliary data lengths - - /* Then adds the length of the Auxiliary Data */ - for (AuxDataIndex = 0; AuxDataIndex < pAC->aux_data_ref_count; AuxDataIndex++) { - length += strlen(AuxDataRefID[AuxDataIndex]); - } + uint8_t AuxDataIndex; + + /* First compute the Data length */ + uint32_t length = 1 + // cps + 1 + // Carrier data ref length + strlen(CarrierDataRef) + // Carrier data ref + 1 + // auxiliary data count + pAC->aux_data_ref_count * 1; // auxiliary data lengths + + /* Then adds the length of the Auxiliary Data */ + for (AuxDataIndex = 0; AuxDataIndex < pAC->aux_data_ref_count; AuxDataIndex++) { + length += strlen(AuxDataRefID[AuxDataIndex]); + } - return length; + return length; } /** @@ -490,10 +490,10 @@ uint32_t NDEF::NDEF_GetACDataLength(Ndef_Handover_alternative_carrier_t *pAC, ch */ uint16_t NDEF::NDEF_WriteHandover(sRecordInfo_t *pRecord, uint8_t *pNdef) { - /* Note: in case of Handover Select for no matching alternative carrier, the ME bit flag must be set by the caller */ + /* Note: in case of Handover Select for no matching alternative carrier, the ME bit flag must be set by the caller */ - uint32_t Size = NDEF_WriteRecord(pRecord, pNdef); - return NDEF_WriteNDEF(Size, pNdef); + uint32_t Size = NDEF_WriteRecord(pRecord, pNdef); + return NDEF_WriteNDEF(Size, pNdef); } /** diff --git a/src/libNDEF/lib_NDEF_Handover.h b/src/libNDEF/lib_NDEF_Handover.h index 6b7fcfb..6d5b3b6 100755 --- a/src/libNDEF/lib_NDEF_Handover.h +++ b/src/libNDEF/lib_NDEF_Handover.h @@ -64,33 +64,33 @@ #define NDEF_HANDOVER_AC_CPS_MASK (0x3) /** @brief Enumerates the NFC Forum Power States possible values */ typedef enum { - NDEF_HANDOVER_AC_CPS_INACTIVE = 0x0, /**< The HW for this Alternative Carrier has to be switch on before proceeding. */ - NDEF_HANDOVER_AC_CPS_ACTIVE = 0x1, /**< The HW for this Alternative Carrier is currently running. */ - NDEF_HANDOVER_AC_CPS_ACTIVATING = 0x2, /**< The HW for this Alternative Carrier is being activated. */ - NDEF_HANDOVER_AC_CPS_UNKNOWN = 0x3 /**< The HW for this Alternative Carrier is unknown. */ + NDEF_HANDOVER_AC_CPS_INACTIVE = 0x0, /**< The HW for this Alternative Carrier has to be switch on before proceeding. */ + NDEF_HANDOVER_AC_CPS_ACTIVE = 0x1, /**< The HW for this Alternative Carrier is currently running. */ + NDEF_HANDOVER_AC_CPS_ACTIVATING = 0x2, /**< The HW for this Alternative Carrier is being activated. */ + NDEF_HANDOVER_AC_CPS_UNKNOWN = 0x3 /**< The HW for this Alternative Carrier is unknown. */ } Ndef_Handover_ac_cps_t; typedef struct { - uint8_t cps; /**< Current Power State for this Alternative Carrier Hardware. */ - sRecordInfo_t ac_record; /**< The record structure used to store/build the Alternative Carrier record. */ - uint8_t aux_data_ref_count; /**< The number of Auxiliary Data Reference for this Alternative Carrier. */ - /* following fields are only used when reading NDEF */ - uint8_t *aux_data_ref_start; /**< Internal field, managed by the library, to keep track of the Auxiliary Data Reference start address in the AC record. */ - uint8_t *aux_data_ref_end; /**< Internal field, managed by the library, to keep track of the Auxiliary Data Reference end address in the AC record. */ + uint8_t cps; /**< Current Power State for this Alternative Carrier Hardware. */ + sRecordInfo_t ac_record; /**< The record structure used to store/build the Alternative Carrier record. */ + uint8_t aux_data_ref_count; /**< The number of Auxiliary Data Reference for this Alternative Carrier. */ + /* following fields are only used when reading NDEF */ + uint8_t *aux_data_ref_start; /**< Internal field, managed by the library, to keep track of the Auxiliary Data Reference start address in the AC record. */ + uint8_t *aux_data_ref_end; /**< Internal field, managed by the library, to keep track of the Auxiliary Data Reference end address in the AC record. */ } Ndef_Handover_alternative_carrier_t; typedef struct { - uint16_t type; /**< Handover type: could be Select or Request. */ - uint8_t version; /**< Version of the Handover record. */ - /* following fields are only used when reading NDEF */ - uint8_t has_cr; /**< Boolean, if true this Handover has a Collision Resolution nested record. */ - uint16_t cr_random_number; /**< Random number for the Collision Resolution. */ - uint8_t nb_alternative_carrier; /**< Number of Alternative Carrier nested records un this Handover. */ - uint8_t *ac_start; /**< Internal field, managed by the library, to keep track of the Alternative Carrier Reference Data start address in the Handover record. */ - uint8_t *ac_end; /**< Internal field, managed by the library, to keep track of the Alternative Carrier Reference Data end address in the Handover record. */ + uint16_t type; /**< Handover type: could be Select or Request. */ + uint8_t version; /**< Version of the Handover record. */ + /* following fields are only used when reading NDEF */ + uint8_t has_cr; /**< Boolean, if true this Handover has a Collision Resolution nested record. */ + uint16_t cr_random_number; /**< Random number for the Collision Resolution. */ + uint8_t nb_alternative_carrier; /**< Number of Alternative Carrier nested records un this Handover. */ + uint8_t *ac_start; /**< Internal field, managed by the library, to keep track of the Alternative Carrier Reference Data start address in the Handover record. */ + uint8_t *ac_end; /**< Internal field, managed by the library, to keep track of the Alternative Carrier Reference Data end address in the Handover record. */ } Ndef_Handover_t; /** @} diff --git a/src/libNDEF/lib_NDEF_MyApp.cpp b/src/libNDEF/lib_NDEF_MyApp.cpp index 973a812..ff61bc8 100755 --- a/src/libNDEF/lib_NDEF_MyApp.cpp +++ b/src/libNDEF/lib_NDEF_MyApp.cpp @@ -62,53 +62,53 @@ */ void NDEF::NDEF_Extract_M24SRDiscoveryApp_Input(sRecordInfo_t *pRecordStruct, sMyAppInfo *pMyAppStruct) { - uint8_t *pPayload; - uint8_t *pLook4Word; - uint16_t BackGroundColor, FontColor; - uint8_t i; - - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - - /* initialize struct in case not matching found */ - for (i = 0; i < 8; i++) { - /* Set the Back Color */ - pMyAppStruct->LineX[i].BackGroundColor = 0xFFFF; - /* Set the Text Color */ - pMyAppStruct->LineX[i].FontColor = 0x0000; - /* Set the line number */ - pMyAppStruct->LineX[i].LineNb = i + 1; - /* Set the line content */ - memcpy(pMyAppStruct->LineX[i].String, " ", 20); - } - - pLook4Word = pPayload; - - for (i = 0; i < 4; i++) { - pMyAppStruct->LedBlinkConf.LedConf[i] = *pLook4Word; + uint8_t *pPayload; + uint8_t *pLook4Word; + uint16_t BackGroundColor, FontColor; + uint8_t i; + + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + + /* initialize struct in case not matching found */ + for (i = 0; i < 8; i++) { + /* Set the Back Color */ + pMyAppStruct->LineX[i].BackGroundColor = 0xFFFF; + /* Set the Text Color */ + pMyAppStruct->LineX[i].FontColor = 0x0000; + /* Set the line number */ + pMyAppStruct->LineX[i].LineNb = i + 1; + /* Set the line content */ + memcpy(pMyAppStruct->LineX[i].String, " ", 20); + } + + pLook4Word = pPayload; + + for (i = 0; i < 4; i++) { + pMyAppStruct->LedBlinkConf.LedConf[i] = *pLook4Word; + pLook4Word++; + } + pMyAppStruct->LedBlinkConf.Speed = *pLook4Word; pLook4Word++; - } - pMyAppStruct->LedBlinkConf.Speed = *pLook4Word; - pLook4Word++; - for (i = 0; i < 8; i++) { - /* Set the line number */ - pMyAppStruct->LineX[i].LineNb = *pLook4Word; - pLook4Word++; - /* Set the Back Color */ - BackGroundColor = (uint16_t)(*pLook4Word << 8); - BackGroundColor = BackGroundColor | (uint16_t)(*++pLook4Word); - pMyAppStruct->LineX[i].BackGroundColor = BackGroundColor; - pLook4Word++; - /* Set the Text Color */ - FontColor = (uint16_t)(*pLook4Word << 8); - FontColor = FontColor | (uint16_t)(*++pLook4Word); - pMyAppStruct->LineX[i].FontColor = FontColor; - pLook4Word++; - /* Set the line content */ - memcpy(pMyAppStruct->LineX[i].String, (char *)pLook4Word, 20); - pLook4Word += 20; - } + for (i = 0; i < 8; i++) { + /* Set the line number */ + pMyAppStruct->LineX[i].LineNb = *pLook4Word; + pLook4Word++; + /* Set the Back Color */ + BackGroundColor = (uint16_t)(*pLook4Word << 8); + BackGroundColor = BackGroundColor | (uint16_t)(*++pLook4Word); + pMyAppStruct->LineX[i].BackGroundColor = BackGroundColor; + pLook4Word++; + /* Set the Text Color */ + FontColor = (uint16_t)(*pLook4Word << 8); + FontColor = FontColor | (uint16_t)(*++pLook4Word); + pMyAppStruct->LineX[i].FontColor = FontColor; + pLook4Word++; + /* Set the line content */ + memcpy(pMyAppStruct->LineX[i].String, (char *)pLook4Word, 20); + pLook4Word += 20; + } } @@ -130,16 +130,16 @@ void NDEF::NDEF_Extract_M24SRDiscoveryApp_Input(sRecordInfo_t *pRecordStruct, sM */ uint16_t NDEF::NDEF_ReadMyApp(sRecordInfo_t *pRecordStruct, sMyAppInfo *pMyAppStruct) { - uint16_t status = NDEF_ERROR; + uint16_t status = NDEF_ERROR; - if (pRecordStruct->NDEF_Type == M24SR_DISCOVERY_APP_TYPE) { - NDEF_Extract_M24SRDiscoveryApp_Input(pRecordStruct, pMyAppStruct); - status = NDEF_OK; - } else { - status = NDEF_ERROR; - } + if (pRecordStruct->NDEF_Type == M24SR_DISCOVERY_APP_TYPE) { + NDEF_Extract_M24SRDiscoveryApp_Input(pRecordStruct, pMyAppStruct); + status = NDEF_OK; + } else { + status = NDEF_ERROR; + } - return status; + return status; } /** @@ -155,105 +155,105 @@ uint16_t NDEF::NDEF_ReadMyApp(sRecordInfo_t *pRecordStruct, sMyAppInfo *pMyAppSt */ uint16_t NDEF::NDEF_WriteMyApp(sMyAppInfo *pMyAppStruct) { - uint16_t status = NDEF_ERROR; - uint16_t DataSize; - uint32_t PayloadSize; - uint8_t i; - uint8_t *pPayload; - - // Unused parameter - (void)(pMyAppStruct); - - /* External Type Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- IL=0, CF=0 and SR=1 TNF=4 NFC Forum external type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ /* The payload will always be 5 + 25*8=205 bytes for this application */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ /* st.com:m24sr_discovery_democtrl */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - - /* fill URI record header */ - NDEF_Buffer[0] = 0xD4; /* Record Flag */ - NDEF_Buffer[1] = M24SR_DISCOVERY_APP_STRING_LENGTH; - NDEF_Buffer[2] = 0x00; /* Will be filled at the end when payload size is known */ - - memcpy(&NDEF_Buffer[3], M24SR_DISCOVERY_APP_STRING, M24SR_DISCOVERY_APP_STRING_LENGTH); - - pPayload = &NDEF_Buffer[ 3 + M24SR_DISCOVERY_APP_STRING_LENGTH]; - PayloadSize = 0; - - /**************************************************************/ - /* BLINK CONFIG data */ - - /* led 1 blinking */ - *pPayload = 0x03; - pPayload++; - /* led 2 blinking */ - *pPayload = 0x02; - pPayload++; - /* led 3 blinking */ - *pPayload = 0x02; - pPayload++; - /* led 4 blinking */ - *pPayload = 0x03; - pPayload++; - /* speed */ - *pPayload = 0x03; - pPayload++; - - PayloadSize += 5; - - /**************************************************************/ - - /**************************************************************/ - /* SCREEN config data */ - for (i = 0; i < 8; i++) { - /* Line number */ - *pPayload = (uint8_t)(i + 1); + uint16_t status = NDEF_ERROR; + uint16_t DataSize; + uint32_t PayloadSize; + uint8_t i; + uint8_t *pPayload; + + // Unused parameter + (void)(pMyAppStruct); + + /* External Type Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- IL=0, CF=0 and SR=1 TNF=4 NFC Forum external type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ /* The payload will always be 5 + 25*8=205 bytes for this application */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ /* st.com:m24sr_discovery_democtrl */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + + /* fill URI record header */ + NDEF_Buffer[0] = 0xD4; /* Record Flag */ + NDEF_Buffer[1] = M24SR_DISCOVERY_APP_STRING_LENGTH; + NDEF_Buffer[2] = 0x00; /* Will be filled at the end when payload size is known */ + + memcpy(&NDEF_Buffer[3], M24SR_DISCOVERY_APP_STRING, M24SR_DISCOVERY_APP_STRING_LENGTH); + + pPayload = &NDEF_Buffer[ 3 + M24SR_DISCOVERY_APP_STRING_LENGTH]; + PayloadSize = 0; + + /**************************************************************/ + /* BLINK CONFIG data */ + + /* led 1 blinking */ + *pPayload = 0x03; pPayload++; - /* Background color */ - *pPayload = 0xFF - (0xFF / i); + /* led 2 blinking */ + *pPayload = 0x02; pPayload++; - *pPayload = 0xFF - (0xFF / i); + /* led 3 blinking */ + *pPayload = 0x02; pPayload++; - /* Font Color */ - *pPayload = 0xFF / i; + /* led 4 blinking */ + *pPayload = 0x03; pPayload++; - *pPayload = 0xFF / i; + /* speed */ + *pPayload = 0x03; pPayload++; - /* String */ - memcpy(pPayload, "ABCDEFGHIJKLMNOPQRST", 20); - pPayload += 20; - PayloadSize += 25; + PayloadSize += 5; + + /**************************************************************/ + + /**************************************************************/ + /* SCREEN config data */ + for (i = 0; i < 8; i++) { + /* Line number */ + *pPayload = (uint8_t)(i + 1); + pPayload++; + /* Background color */ + *pPayload = 0xFF - (0xFF / i); + pPayload++; + *pPayload = 0xFF - (0xFF / i); + pPayload++; + /* Font Color */ + *pPayload = 0xFF / i; + pPayload++; + *pPayload = 0xFF / i; + pPayload++; + /* String */ + memcpy(pPayload, "ABCDEFGHIJKLMNOPQRST", 20); + pPayload += 20; + + PayloadSize += 25; - } + } - NDEF_Buffer[2] = PayloadSize & 0x000000FF; + NDEF_Buffer[2] = PayloadSize & 0x000000FF; - DataSize = PayloadSize + 5 + M24SR_DISCOVERY_APP_STRING_LENGTH; + DataSize = PayloadSize + 5 + M24SR_DISCOVERY_APP_STRING_LENGTH; - /* Write NDEF */ - status = NfcTag_WriteNDEF(DataSize, NDEF_Buffer); + /* Write NDEF */ + status = NfcTag_WriteNDEF(DataSize, NDEF_Buffer); - return status; + return status; } diff --git a/src/libNDEF/lib_NDEF_MyApp.h b/src/libNDEF/lib_NDEF_MyApp.h index c280c49..adc1709 100755 --- a/src/libNDEF/lib_NDEF_MyApp.h +++ b/src/libNDEF/lib_NDEF_MyApp.h @@ -54,20 +54,20 @@ #define MYAPP_LED_CONF_BLINKING ((uint8_t) 0x2) typedef struct { - uint8_t LedConf[4]; - uint8_t Speed; + uint8_t LedConf[4]; + uint8_t Speed; } sLedBlinkConfig; typedef struct { - uint8_t LineNb; - uint16_t BackGroundColor; - uint16_t FontColor; - char String[20]; + uint8_t LineNb; + uint16_t BackGroundColor; + uint16_t FontColor; + char String[20]; } sLineConfig; typedef struct { - sLedBlinkConfig LedBlinkConf; - sLineConfig LineX[MYAPP_NB_LINES]; + sLedBlinkConfig LedBlinkConf; + sLineConfig LineX[MYAPP_NB_LINES]; } sMyAppInfo; #endif /* __LIB_NDEF_MYAPP_H */ diff --git a/src/libNDEF/lib_NDEF_SMS.cpp b/src/libNDEF/lib_NDEF_SMS.cpp index eac14bc..ff22c50 100755 --- a/src/libNDEF/lib_NDEF_SMS.cpp +++ b/src/libNDEF/lib_NDEF_SMS.cpp @@ -63,48 +63,48 @@ */ void NDEF::NDEF_FillSMSStruct(uint8_t *pPayload, uint32_t PayloadSize, sSMSInfo *pSMSStruct) { - uint8_t *pLastByteAdd, *pLook4Word, *pEndString; - const char *pKeyWord = SMS_TYPE_STRING; - uint32_t SizeOfKeyWord = SMS_TYPE_STRING_LENGTH; - pEndString = 0; - - /* First character force to NULL in case not matching found */ - *pSMSStruct->PhoneNumber = 0; - *pSMSStruct->Message = 0; - - /* Interesting information are stored before picture if any */ - /* Moreover picture is not used in this demonstration SW */ - pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); - - pLook4Word = pPayload; - while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { - pLook4Word++; - } - - /* Retrieve phone number */ - if (pLook4Word != pLastByteAdd) { - pLook4Word += SizeOfKeyWord; - pEndString = pLook4Word; - while (memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { - pEndString++; + uint8_t *pLastByteAdd, *pLook4Word, *pEndString; + const char *pKeyWord = SMS_TYPE_STRING; + uint32_t SizeOfKeyWord = SMS_TYPE_STRING_LENGTH; + pEndString = 0; + + /* First character force to NULL in case not matching found */ + *pSMSStruct->PhoneNumber = 0; + *pSMSStruct->Message = 0; + + /* Interesting information are stored before picture if any */ + /* Moreover picture is not used in this demonstration SW */ + pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); + + pLook4Word = pPayload; + while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { + pLook4Word++; } - if (pEndString != pLastByteAdd) { - memcpy(pSMSStruct->PhoneNumber, pLook4Word, pEndString - pLook4Word); - /* add end of string character */ - pSMSStruct->PhoneNumber[pEndString - pLook4Word] = 0; + + /* Retrieve phone number */ + if (pLook4Word != pLastByteAdd) { + pLook4Word += SizeOfKeyWord; + pEndString = pLook4Word; + while (memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { + pEndString++; + } + if (pEndString != pLastByteAdd) { + memcpy(pSMSStruct->PhoneNumber, pLook4Word, pEndString - pLook4Word); + /* add end of string character */ + pSMSStruct->PhoneNumber[pEndString - pLook4Word] = 0; + } + } + pEndString += URI_FIRST_DATA_END_LENGTH; + pLook4Word = pEndString; + + /* check if e-mail subject is present */ + if (!memcmp(pLook4Word, MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH)) { + pEndString += MESSAGE_BEGIN_STRING_LENGTH; + /* Retrieve message */ + memcpy(pSMSStruct->Message, pEndString, PayloadSize - (pEndString - pPayload)); + /* add end of string character */ + pSMSStruct->Message[PayloadSize - (pEndString - pPayload)] = 0; } - } - pEndString += URI_FIRST_DATA_END_LENGTH; - pLook4Word = pEndString; - - /* check if e-mail subject is present */ - if (!memcmp(pLook4Word, MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH)) { - pEndString += MESSAGE_BEGIN_STRING_LENGTH; - /* Retrieve message */ - memcpy(pSMSStruct->Message, pEndString, PayloadSize - (pEndString - pPayload)); - /* add end of string character */ - pSMSStruct->Message[PayloadSize - (pEndString - pPayload)] = 0; - } } /** @@ -114,17 +114,17 @@ void NDEF::NDEF_FillSMSStruct(uint8_t *pPayload, uint32_t PayloadSize, sSMSInfo */ void NDEF::NDEF_ReadURI_SMS(sRecordInfo_t *pRecordStruct, sSMSInfo *pSMSStruct) { - uint8_t *pPayload; - uint32_t PayloadSize; + uint8_t *pPayload; + uint32_t PayloadSize; - PayloadSize = pRecordStruct->PayloadLength; + PayloadSize = pRecordStruct->PayloadLength; - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - if (pRecordStruct->NDEF_Type == URI_SMS_TYPE) { - NDEF_FillSMSStruct(pPayload, PayloadSize, pSMSStruct); - } + if (pRecordStruct->NDEF_Type == URI_SMS_TYPE) { + NDEF_FillSMSStruct(pPayload, PayloadSize, pSMSStruct); + } } @@ -146,37 +146,37 @@ void NDEF::NDEF_ReadURI_SMS(sRecordInfo_t *pRecordStruct, sSMSInfo *pSMSStruct) */ uint16_t NDEF::NDEF_ReadSMS(sRecordInfo_t *pRecordStruct, sSMSInfo *pSMSStruct) { - uint16_t status = NDEF_ERROR; - sRecordInfo_t *pSPRecordStruct; - uint32_t PayloadSize, RecordPosition; - uint8_t *pData; - - if (pRecordStruct->NDEF_Type == URI_SMS_TYPE) { - NDEF_ReadURI_SMS(pRecordStruct, pSMSStruct); - status = NDEF_OK; - } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { - for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { - pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; - if (pSPRecordStruct->NDEF_Type == URI_SMS_TYPE) { - NDEF_ReadURI_SMS(pSPRecordStruct, pSMSStruct); - status = NDEF_OK; - } - if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { - PayloadSize = pSPRecordStruct->PayloadLength; - - /* The instruction content the UTF-8 language code that is not used here */ - pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; - PayloadSize -= *pData + 1; /* remove not useful data */ - pData += *pData + 1; /* set pointer on useful data */ + uint16_t status = NDEF_ERROR; + sRecordInfo_t *pSPRecordStruct; + uint32_t PayloadSize, RecordPosition; + uint8_t *pData; - memcpy(pSMSStruct->Information, pData, PayloadSize); - /* add end of string character */ - pSMSStruct->Information[PayloadSize] = 0; - } + if (pRecordStruct->NDEF_Type == URI_SMS_TYPE) { + NDEF_ReadURI_SMS(pRecordStruct, pSMSStruct); + status = NDEF_OK; + } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { + for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { + pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; + if (pSPRecordStruct->NDEF_Type == URI_SMS_TYPE) { + NDEF_ReadURI_SMS(pSPRecordStruct, pSMSStruct); + status = NDEF_OK; + } + if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { + PayloadSize = pSPRecordStruct->PayloadLength; + + /* The instruction content the UTF-8 language code that is not used here */ + pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; + PayloadSize -= *pData + 1; /* remove not useful data */ + pData += *pData + 1; /* set pointer on useful data */ + + memcpy(pSMSStruct->Information, pData, PayloadSize); + /* add end of string character */ + pSMSStruct->Information[PayloadSize] = 0; + } + } } - } - return status; + return status; } /** @@ -191,13 +191,13 @@ uint16_t NDEF::NDEF_ReadSMS(sRecordInfo_t *pRecordStruct, sSMSInfo *pSMSStruct) */ uint16_t NDEF::NDEF_WriteSMS(sSMSInfo *pSMSStruct) { - uint16_t status = NDEF_ERROR, Offset = 0; + uint16_t status = NDEF_ERROR, Offset = 0; - NDEF_PrepareSMSMessage(pSMSStruct, NDEF_Buffer, &Offset); + NDEF_PrepareSMSMessage(pSMSStruct, NDEF_Buffer, &Offset); - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); - return status; + return status; } /** @@ -208,133 +208,133 @@ uint16_t NDEF::NDEF_WriteSMS(sSMSInfo *pSMSStruct) */ void NDEF::NDEF_PrepareSMSMessage(sSMSInfo *pSMSStruct, uint8_t *pNDEFMessage, uint16_t *size) { - uint16_t Offset = 0; - uint32_t smsSize = 0; - uint32_t infoSize = 0; - uint32_t totalSize = 0; - - /* SMS is an URI but can be included in a smart poster to add text to give instruction to user for instance */ - - /* SMS (smart poster) Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* SMS : 1+sms:+tel+1+body=+message */ - smsSize = 1 + SMS_TYPE_STRING_LENGTH + strlen(pSMSStruct->PhoneNumber) + URI_FIRST_DATA_END_LENGTH + - MESSAGE_BEGIN_STRING_LENGTH + strlen(pSMSStruct->Message); - - /* Check if a Smart poster is needed */ - if (pSMSStruct->Information[0] != '\0') { - /* Info : 1+2+info */ - infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pSMSStruct->Information); - /* Total */ - totalSize = 4 + smsSize + 4 + infoSize; - if (smsSize > 255) { - totalSize += 3; /* Normal Email size */ + uint16_t Offset = 0; + uint32_t smsSize = 0; + uint32_t infoSize = 0; + uint32_t totalSize = 0; + + /* SMS is an URI but can be included in a smart poster to add text to give instruction to user for instance */ + + /* SMS (smart poster) Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* SMS : 1+sms:+tel+1+body=+message */ + smsSize = 1 + SMS_TYPE_STRING_LENGTH + strlen(pSMSStruct->PhoneNumber) + URI_FIRST_DATA_END_LENGTH + + MESSAGE_BEGIN_STRING_LENGTH + strlen(pSMSStruct->Message); + + /* Check if a Smart poster is needed */ + if (pSMSStruct->Information[0] != '\0') { + /* Info : 1+2+info */ + infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pSMSStruct->Information); + /* Total */ + totalSize = 4 + smsSize + 4 + infoSize; + if (smsSize > 255) { + totalSize += 3; /* Normal Email size */ + } + if (infoSize > 255) { + totalSize += 3; /* Normal Info size */ + } + + /* SmartPoster header */ + if (totalSize > 255) { + pNDEFMessage[Offset++] = 0xC1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = totalSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = 0xD1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)totalSize; + } + memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); + Offset += SMART_POSTER_TYPE_STRING_LENGTH; + } + + /* SMS header */ + pNDEFMessage[Offset] = 0x81; + if (smsSize < 256) { + pNDEFMessage[Offset] |= 0x10; // Set the SR bit } - if (infoSize > 255) { - totalSize += 3; /* Normal Info size */ + if (pSMSStruct->Information[0] == '\0') { + pNDEFMessage[Offset] |= 0x40; // Set the ME bit } + Offset++; - /* SmartPoster header */ - if (totalSize > 255) { - pNDEFMessage[Offset++] = 0xC1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = totalSize & 0x000000FF; + pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; + if (smsSize > 255) { + pNDEFMessage[Offset++] = (smsSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (smsSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (smsSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = smsSize & 0x000000FF; } else { - pNDEFMessage[Offset++] = 0xD1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)totalSize; + pNDEFMessage[Offset++] = (uint8_t)smsSize; } - memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); - Offset += SMART_POSTER_TYPE_STRING_LENGTH; - } - - /* SMS header */ - pNDEFMessage[Offset] = 0x81; - if (smsSize < 256) { - pNDEFMessage[Offset] |= 0x10; // Set the SR bit - } - if (pSMSStruct->Information[0] == '\0') { - pNDEFMessage[Offset] |= 0x40; // Set the ME bit - } - Offset++; - - pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; - if (smsSize > 255) { - pNDEFMessage[Offset++] = (smsSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (smsSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (smsSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = smsSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = (uint8_t)smsSize; - } - memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); - Offset += URI_TYPE_STRING_LENGTH; - - /* SMS payload */ - pNDEFMessage[Offset++] = URI_ID_0x00; - memcpy(&pNDEFMessage[Offset], SMS_TYPE_STRING, SMS_TYPE_STRING_LENGTH); - Offset += SMS_TYPE_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], pSMSStruct->PhoneNumber, strlen(pSMSStruct->PhoneNumber)); - Offset += strlen(pSMSStruct->PhoneNumber); - memcpy(&pNDEFMessage[Offset], URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH); - Offset += URI_FIRST_DATA_END_LENGTH; - - memcpy(&pNDEFMessage[Offset], MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH); - Offset += MESSAGE_BEGIN_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], pSMSStruct->Message, strlen(pSMSStruct->Message)); - Offset += strlen(pSMSStruct->Message); - - /* Information header */ - if (pSMSStruct->Information[0] != '\0') { - if (infoSize > 255) { - pNDEFMessage[Offset++] = 0x41; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = infoSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0x51; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)infoSize; + memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); + Offset += URI_TYPE_STRING_LENGTH; + + /* SMS payload */ + pNDEFMessage[Offset++] = URI_ID_0x00; + memcpy(&pNDEFMessage[Offset], SMS_TYPE_STRING, SMS_TYPE_STRING_LENGTH); + Offset += SMS_TYPE_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], pSMSStruct->PhoneNumber, strlen(pSMSStruct->PhoneNumber)); + Offset += strlen(pSMSStruct->PhoneNumber); + memcpy(&pNDEFMessage[Offset], URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH); + Offset += URI_FIRST_DATA_END_LENGTH; + + memcpy(&pNDEFMessage[Offset], MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH); + Offset += MESSAGE_BEGIN_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], pSMSStruct->Message, strlen(pSMSStruct->Message)); + Offset += strlen(pSMSStruct->Message); + + /* Information header */ + if (pSMSStruct->Information[0] != '\0') { + if (infoSize > 255) { + pNDEFMessage[Offset++] = 0x41; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = infoSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = 0x51; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)infoSize; + } + + memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); + Offset += TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ + memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); + Offset += ISO_ENGLISH_CODE_STRING_LENGTH; + + /* Information payload */ + memcpy(&pNDEFMessage[Offset], pSMSStruct->Information, strlen(pSMSStruct->Information)); + Offset += strlen(pSMSStruct->Information); } - memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); - Offset += TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ - memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); - Offset += ISO_ENGLISH_CODE_STRING_LENGTH; - - /* Information payload */ - memcpy(&pNDEFMessage[Offset], pSMSStruct->Information, strlen(pSMSStruct->Information)); - Offset += strlen(pSMSStruct->Information); - } - - *size = (uint16_t)(Offset); + *size = (uint16_t)(Offset); } diff --git a/src/libNDEF/lib_NDEF_SMS.h b/src/libNDEF/lib_NDEF_SMS.h index 2b86ef7..64f2548 100755 --- a/src/libNDEF/lib_NDEF_SMS.h +++ b/src/libNDEF/lib_NDEF_SMS.h @@ -36,9 +36,9 @@ typedef struct { - char PhoneNumber[SMS_PHONE_MAX_SIZE]; - char Message[SMS_MESSAGE_MAX_SIZE]; - char Information[SMS_INFO_MAX_SIZE]; + char PhoneNumber[SMS_PHONE_MAX_SIZE]; + char Message[SMS_MESSAGE_MAX_SIZE]; + char Information[SMS_INFO_MAX_SIZE]; } sSMSInfo; #endif /* __LIB_NDEF_SMS_H */ diff --git a/src/libNDEF/lib_NDEF_Text.cpp b/src/libNDEF/lib_NDEF_Text.cpp index afbe7fd..3e640d8 100755 --- a/src/libNDEF/lib_NDEF_Text.cpp +++ b/src/libNDEF/lib_NDEF_Text.cpp @@ -70,45 +70,45 @@ */ uint16_t NDEF::NDEF_WriteText(NDEF_Text_info_t *text_info) { - uint16_t status = NDEF_ERROR; - uint32_t textSize, Offset = 0; + uint16_t status = NDEF_ERROR; + uint32_t textSize, Offset = 0; - if(strlen(text_info->language_code) > 10) return status; + if(strlen(text_info->language_code) > 10) return status; - /* TEXT : 1+en+message */ - textSize = 1 + strlen(text_info->language_code) + strlen(text_info->text); + /* TEXT : 1+en+message */ + textSize = 1 + strlen(text_info->language_code) + strlen(text_info->text); - /* TEXT header */ - NDEF_Buffer[Offset] = 0xC1; - if (textSize < 256) { - NDEF_Buffer[Offset] |= 0x10; // Set the SR bit - } - Offset++; - - NDEF_Buffer[Offset++] = TEXT_TYPE_STRING_LENGTH; - if (textSize > 255) { - NDEF_Buffer[Offset++] = (textSize & 0xFF000000) >> 24; - NDEF_Buffer[Offset++] = (textSize & 0x00FF0000) >> 16; - NDEF_Buffer[Offset++] = (textSize & 0x0000FF00) >> 8; - NDEF_Buffer[Offset++] = textSize & 0x000000FF; - } else { - NDEF_Buffer[Offset++] = (uint8_t)textSize; - } - memcpy(&NDEF_Buffer[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); - Offset += TEXT_TYPE_STRING_LENGTH; + /* TEXT header */ + NDEF_Buffer[Offset] = 0xC1; + if (textSize < 256) { + NDEF_Buffer[Offset] |= 0x10; // Set the SR bit + } + Offset++; + + NDEF_Buffer[Offset++] = TEXT_TYPE_STRING_LENGTH; + if (textSize > 255) { + NDEF_Buffer[Offset++] = (textSize & 0xFF000000) >> 24; + NDEF_Buffer[Offset++] = (textSize & 0x00FF0000) >> 16; + NDEF_Buffer[Offset++] = (textSize & 0x0000FF00) >> 8; + NDEF_Buffer[Offset++] = textSize & 0x000000FF; + } else { + NDEF_Buffer[Offset++] = (uint8_t)textSize; + } + memcpy(&NDEF_Buffer[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); + Offset += TEXT_TYPE_STRING_LENGTH; - /* TEXT payload */ - NDEF_Buffer[Offset++] = strlen(text_info->language_code) | text_info->encoding << 7; + /* TEXT payload */ + NDEF_Buffer[Offset++] = strlen(text_info->language_code) | text_info->encoding << 7; - memcpy(&NDEF_Buffer[Offset], text_info->language_code, strlen(text_info->language_code)); - Offset += strlen(text_info->language_code); + memcpy(&NDEF_Buffer[Offset], text_info->language_code, strlen(text_info->language_code)); + Offset += strlen(text_info->language_code); - memcpy(&NDEF_Buffer[Offset], text_info->text, strlen(text_info->text)); - Offset += strlen(text_info->text); + memcpy(&NDEF_Buffer[Offset], text_info->text, strlen(text_info->text)); + Offset += strlen(text_info->text); - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); - return status; + return status; } @@ -122,40 +122,40 @@ uint16_t NDEF::NDEF_WriteText(NDEF_Text_info_t *text_info) */ uint16_t NDEF::NDEF_ReadText(sRecordInfo_t *pRecordStruct, NDEF_Text_info_t *pText) { - uint16_t status = NDEF_ERROR; + uint16_t status = NDEF_ERROR; - if (pRecordStruct->NDEF_Type == TEXT_TYPE) { - /* Get the text metadata (status byte (encoding & language code length) + language code) */ - NDEF_Text_metadata_t *text_record_info = (NDEF_Text_metadata_t *)pRecordStruct->PayloadBufferAdd; + if (pRecordStruct->NDEF_Type == TEXT_TYPE) { + /* Get the text metadata (status byte (encoding & language code length) + language code) */ + NDEF_Text_metadata_t *text_record_info = (NDEF_Text_metadata_t *)pRecordStruct->PayloadBufferAdd; - uint32_t text_length = pRecordStruct->PayloadLength /* record length */ - - text_record_info->language_length /* minus language code length */ - - sizeof(uint8_t); /* minus the status byte length */ + uint32_t text_length = pRecordStruct->PayloadLength /* record length */ + - text_record_info->language_length /* minus language code length */ + - sizeof(uint8_t); /* minus the status byte length */ - if ((text_record_info->language_length >= TEXT_LANGUAGE_CODE_MAX_SIZE) || - (text_length >= TEXT_MAX_SIZE)) { - /* One of the text info structure buffer is too small */ - return NDEF_ERROR_MEMORY_INTERNAL; - } + if ((text_record_info->language_length >= TEXT_LANGUAGE_CODE_MAX_SIZE) || + (text_length >= TEXT_MAX_SIZE)) { + /* One of the text info structure buffer is too small */ + return NDEF_ERROR_MEMORY_INTERNAL; + } - /* Retrieve the encoding */ - pText->encoding = (NDEF_Text_encoding_t)text_record_info->encoding; + /* Retrieve the encoding */ + pText->encoding = (NDEF_Text_encoding_t)text_record_info->encoding; - /* Save the language code string (adding null char at the end) */ - memcpy(&pText->language_code, text_record_info->language, text_record_info->language_length); - pText->language_code[text_record_info->language_length] = '\0'; + /* Save the language code string (adding null char at the end) */ + memcpy(&pText->language_code, text_record_info->language, text_record_info->language_length); + pText->language_code[text_record_info->language_length] = '\0'; - /* Copy the text string itself (adding null char at the end) */ - memcpy(&pText->text, text_record_info->language + text_record_info->language_length, text_length); - pText->text[text_length] = '\0'; + /* Copy the text string itself (adding null char at the end) */ + memcpy(&pText->text, text_record_info->language + text_record_info->language_length, text_length); + pText->text[text_length] = '\0'; - status = NDEF_OK; - } else { - /* Not a text record, exit in error */ - status = NDEF_ERROR; - } + status = NDEF_OK; + } else { + /* Not a text record, exit in error */ + status = NDEF_ERROR; + } - return status; + return status; } /** diff --git a/src/libNDEF/lib_NDEF_Text.h b/src/libNDEF/lib_NDEF_Text.h index 74d6e64..4fe2493 100755 --- a/src/libNDEF/lib_NDEF_Text.h +++ b/src/libNDEF/lib_NDEF_Text.h @@ -36,24 +36,24 @@ /** @brief NDEF Text encoding possible values. */ typedef enum { - NDEF_TEXT_UTF8 = 0, - NDEF_TEXT_UTF16 = 1 + NDEF_TEXT_UTF8 = 0, + NDEF_TEXT_UTF16 = 1 } NDEF_Text_encoding_t; /** @brief This structure is used to handle information from a NDEF Text record. */ typedef struct { - NDEF_Text_encoding_t encoding; /**< metadata: UTF-8 / UTF-16. */ - char language_code[TEXT_LANGUAGE_CODE_MAX_SIZE]; /**< metadata: Language code as specified by IANA. */ - char text[TEXT_MAX_SIZE]; /**< The text itself. */ + NDEF_Text_encoding_t encoding; /**< metadata: UTF-8 / UTF-16. */ + char language_code[TEXT_LANGUAGE_CODE_MAX_SIZE]; /**< metadata: Language code as specified by IANA. */ + char text[TEXT_MAX_SIZE]; /**< The text itself. */ } NDEF_Text_info_t; /** @brief This structure is used to parse the raw data from a text record and access its metadata. */ typedef struct { - uint8_t language_length: 4; /**< Language code length. */ - uint8_t rfu: 3; /**< reserved for futur usage */ - uint8_t encoding: 1; /**< UTF-8 (0) or UTF-16 (1) encoding. */ - char language[1]; /**< IANA language code. */ + uint8_t language_length: 4; /**< Language code length. */ + uint8_t rfu: 3; /**< reserved for futur usage */ + uint8_t encoding: 1; /**< UTF-8 (0) or UTF-16 (1) encoding. */ + char language[1]; /**< IANA language code. */ } NDEF_Text_metadata_t; #endif /* __LIB_NDEF_TEXT_H */ diff --git a/src/libNDEF/lib_NDEF_URI.cpp b/src/libNDEF/lib_NDEF_URI.cpp index 4e7c796..67630f9 100755 --- a/src/libNDEF/lib_NDEF_URI.cpp +++ b/src/libNDEF/lib_NDEF_URI.cpp @@ -60,203 +60,203 @@ */ void NDEF::NDEF_Parse_WellKnowType(sRecordInfo_t *pRecordStruct, sURI_Info *pURI) { - uint32_t PayloadSize; - uint8_t Offset; - uint8_t *pPayload; + uint32_t PayloadSize; + uint8_t Offset; + uint8_t *pPayload; - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - switch (*pPayload) { + switch (*pPayload) { case URI_ID_0x01: - memcpy(pURI->protocol, URI_ID_0x01_STRING, strlen(URI_ID_0x01_STRING)); - Offset = strlen(URI_ID_0x01_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x01_STRING, strlen(URI_ID_0x01_STRING)); + Offset = strlen(URI_ID_0x01_STRING); + break; case URI_ID_0x02: - memcpy(pURI->protocol, URI_ID_0x02_STRING, strlen(URI_ID_0x02_STRING)); - Offset = strlen(URI_ID_0x02_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x02_STRING, strlen(URI_ID_0x02_STRING)); + Offset = strlen(URI_ID_0x02_STRING); + break; case URI_ID_0x03: - memcpy(pURI->protocol, URI_ID_0x03_STRING, strlen(URI_ID_0x03_STRING)); - Offset = strlen(URI_ID_0x03_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x03_STRING, strlen(URI_ID_0x03_STRING)); + Offset = strlen(URI_ID_0x03_STRING); + break; case URI_ID_0x04: - memcpy(pURI->protocol, URI_ID_0x04_STRING, strlen(URI_ID_0x04_STRING)); - Offset = strlen(URI_ID_0x04_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x04_STRING, strlen(URI_ID_0x04_STRING)); + Offset = strlen(URI_ID_0x04_STRING); + break; case URI_ID_0x05: - memcpy(pURI->protocol, URI_ID_0x05_STRING, strlen(URI_ID_0x05_STRING)); - Offset = strlen(URI_ID_0x05_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x05_STRING, strlen(URI_ID_0x05_STRING)); + Offset = strlen(URI_ID_0x05_STRING); + break; case URI_ID_0x06: - memcpy(pURI->protocol, URI_ID_0x06_STRING, strlen(URI_ID_0x06_STRING)); - Offset = strlen(URI_ID_0x06_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x06_STRING, strlen(URI_ID_0x06_STRING)); + Offset = strlen(URI_ID_0x06_STRING); + break; case URI_ID_0x07: - memcpy(pURI->protocol, URI_ID_0x07_STRING, strlen(URI_ID_0x07_STRING)); - Offset = strlen(URI_ID_0x07_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x07_STRING, strlen(URI_ID_0x07_STRING)); + Offset = strlen(URI_ID_0x07_STRING); + break; case URI_ID_0x08: - memcpy(pURI->protocol, URI_ID_0x08_STRING, strlen(URI_ID_0x08_STRING)); - Offset = strlen(URI_ID_0x08_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x08_STRING, strlen(URI_ID_0x08_STRING)); + Offset = strlen(URI_ID_0x08_STRING); + break; case URI_ID_0x09: - memcpy(pURI->protocol, URI_ID_0x09_STRING, strlen(URI_ID_0x09_STRING)); - Offset = strlen(URI_ID_0x09_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x09_STRING, strlen(URI_ID_0x09_STRING)); + Offset = strlen(URI_ID_0x09_STRING); + break; case URI_ID_0x0A: - memcpy(pURI->protocol, URI_ID_0x0A_STRING, strlen(URI_ID_0x0A_STRING)); - Offset = strlen(URI_ID_0x0A_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0A_STRING, strlen(URI_ID_0x0A_STRING)); + Offset = strlen(URI_ID_0x0A_STRING); + break; case URI_ID_0x0B: - memcpy(pURI->protocol, URI_ID_0x0B_STRING, strlen(URI_ID_0x0B_STRING)); - Offset = strlen(URI_ID_0x0B_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0B_STRING, strlen(URI_ID_0x0B_STRING)); + Offset = strlen(URI_ID_0x0B_STRING); + break; case URI_ID_0x0C: - memcpy(pURI->protocol, URI_ID_0x0C_STRING, strlen(URI_ID_0x0C_STRING)); - Offset = strlen(URI_ID_0x0C_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0C_STRING, strlen(URI_ID_0x0C_STRING)); + Offset = strlen(URI_ID_0x0C_STRING); + break; case URI_ID_0x0D: - memcpy(pURI->protocol, URI_ID_0x0D_STRING, strlen(URI_ID_0x0D_STRING)); - Offset = strlen(URI_ID_0x0D_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0D_STRING, strlen(URI_ID_0x0D_STRING)); + Offset = strlen(URI_ID_0x0D_STRING); + break; case URI_ID_0x0E: - memcpy(pURI->protocol, URI_ID_0x0E_STRING, strlen(URI_ID_0x0E_STRING)); - Offset = strlen(URI_ID_0x0E_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0E_STRING, strlen(URI_ID_0x0E_STRING)); + Offset = strlen(URI_ID_0x0E_STRING); + break; case URI_ID_0x0F: - memcpy(pURI->protocol, URI_ID_0x0F_STRING, strlen(URI_ID_0x0F_STRING)); - Offset = strlen(URI_ID_0x0F_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0F_STRING, strlen(URI_ID_0x0F_STRING)); + Offset = strlen(URI_ID_0x0F_STRING); + break; case URI_ID_0x10: - memcpy(pURI->protocol, URI_ID_0x10_STRING, strlen(URI_ID_0x10_STRING)); - Offset = strlen(URI_ID_0x10_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x10_STRING, strlen(URI_ID_0x10_STRING)); + Offset = strlen(URI_ID_0x10_STRING); + break; case URI_ID_0x11: - memcpy(pURI->protocol, URI_ID_0x11_STRING, strlen(URI_ID_0x11_STRING)); - Offset = strlen(URI_ID_0x11_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x11_STRING, strlen(URI_ID_0x11_STRING)); + Offset = strlen(URI_ID_0x11_STRING); + break; case URI_ID_0x12: - memcpy(pURI->protocol, URI_ID_0x12_STRING, strlen(URI_ID_0x12_STRING)); - Offset = strlen(URI_ID_0x12_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x12_STRING, strlen(URI_ID_0x12_STRING)); + Offset = strlen(URI_ID_0x12_STRING); + break; case URI_ID_0x13: - memcpy(pURI->protocol, URI_ID_0x13_STRING, strlen(URI_ID_0x13_STRING)); - Offset = strlen(URI_ID_0x13_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x13_STRING, strlen(URI_ID_0x13_STRING)); + Offset = strlen(URI_ID_0x13_STRING); + break; case URI_ID_0x14: - memcpy(pURI->protocol, URI_ID_0x14_STRING, strlen(URI_ID_0x14_STRING)); - Offset = strlen(URI_ID_0x14_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x14_STRING, strlen(URI_ID_0x14_STRING)); + Offset = strlen(URI_ID_0x14_STRING); + break; case URI_ID_0x15: - memcpy(pURI->protocol, URI_ID_0x15_STRING, strlen(URI_ID_0x15_STRING)); - Offset = strlen(URI_ID_0x15_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x15_STRING, strlen(URI_ID_0x15_STRING)); + Offset = strlen(URI_ID_0x15_STRING); + break; case URI_ID_0x16: - memcpy(pURI->protocol, URI_ID_0x16_STRING, strlen(URI_ID_0x16_STRING)); - Offset = strlen(URI_ID_0x16_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x16_STRING, strlen(URI_ID_0x16_STRING)); + Offset = strlen(URI_ID_0x16_STRING); + break; case URI_ID_0x17: - memcpy(pURI->protocol, URI_ID_0x17_STRING, strlen(URI_ID_0x17_STRING)); - Offset = strlen(URI_ID_0x17_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x17_STRING, strlen(URI_ID_0x17_STRING)); + Offset = strlen(URI_ID_0x17_STRING); + break; case URI_ID_0x18: - memcpy(pURI->protocol, URI_ID_0x18_STRING, strlen(URI_ID_0x18_STRING)); - Offset = strlen(URI_ID_0x18_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x18_STRING, strlen(URI_ID_0x18_STRING)); + Offset = strlen(URI_ID_0x18_STRING); + break; case URI_ID_0x19: - memcpy(pURI->protocol, URI_ID_0x19_STRING, strlen(URI_ID_0x19_STRING)); - Offset = strlen(URI_ID_0x19_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x19_STRING, strlen(URI_ID_0x19_STRING)); + Offset = strlen(URI_ID_0x19_STRING); + break; case URI_ID_0x1A: - memcpy(pURI->protocol, URI_ID_0x1A_STRING, strlen(URI_ID_0x1A_STRING)); - Offset = strlen(URI_ID_0x1A_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1A_STRING, strlen(URI_ID_0x1A_STRING)); + Offset = strlen(URI_ID_0x1A_STRING); + break; case URI_ID_0x1B: - memcpy(pURI->protocol, URI_ID_0x1B_STRING, strlen(URI_ID_0x1B_STRING)); - Offset = strlen(URI_ID_0x1B_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1B_STRING, strlen(URI_ID_0x1B_STRING)); + Offset = strlen(URI_ID_0x1B_STRING); + break; case URI_ID_0x1C: - memcpy(pURI->protocol, URI_ID_0x1C_STRING, strlen(URI_ID_0x1C_STRING)); - Offset = strlen(URI_ID_0x1C_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1C_STRING, strlen(URI_ID_0x1C_STRING)); + Offset = strlen(URI_ID_0x1C_STRING); + break; case URI_ID_0x1D: - memcpy(pURI->protocol, URI_ID_0x1D_STRING, strlen(URI_ID_0x1D_STRING)); - Offset = strlen(URI_ID_0x1D_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1D_STRING, strlen(URI_ID_0x1D_STRING)); + Offset = strlen(URI_ID_0x1D_STRING); + break; case URI_ID_0x1E: - memcpy(pURI->protocol, URI_ID_0x1E_STRING, strlen(URI_ID_0x1E_STRING)); - Offset = strlen(URI_ID_0x1E_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1E_STRING, strlen(URI_ID_0x1E_STRING)); + Offset = strlen(URI_ID_0x1E_STRING); + break; case URI_ID_0x1F: - memcpy(pURI->protocol, URI_ID_0x1F_STRING, strlen(URI_ID_0x1F_STRING)); - Offset = strlen(URI_ID_0x1F_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1F_STRING, strlen(URI_ID_0x1F_STRING)); + Offset = strlen(URI_ID_0x1F_STRING); + break; case URI_ID_0x20: - memcpy(pURI->protocol, URI_ID_0x20_STRING, strlen(URI_ID_0x20_STRING)); - Offset = strlen(URI_ID_0x20_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x20_STRING, strlen(URI_ID_0x20_STRING)); + Offset = strlen(URI_ID_0x20_STRING); + break; case URI_ID_0x21: - memcpy(pURI->protocol, URI_ID_0x21_STRING, strlen(URI_ID_0x21_STRING)); - Offset = strlen(URI_ID_0x21_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x21_STRING, strlen(URI_ID_0x21_STRING)); + Offset = strlen(URI_ID_0x21_STRING); + break; case URI_ID_0x22: - memcpy(pURI->protocol, URI_ID_0x22_STRING, strlen(URI_ID_0x22_STRING)); - Offset = strlen(URI_ID_0x22_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x22_STRING, strlen(URI_ID_0x22_STRING)); + Offset = strlen(URI_ID_0x22_STRING); + break; case URI_ID_0x23: - memcpy(pURI->protocol, URI_ID_0x23_STRING, strlen(URI_ID_0x23_STRING)); - Offset = strlen(URI_ID_0x23_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x23_STRING, strlen(URI_ID_0x23_STRING)); + Offset = strlen(URI_ID_0x23_STRING); + break; default: - Offset = 0; - /* Should not happened */ - break; - } - /* add end of string character */ - pURI->protocol[Offset] = '\0'; + Offset = 0; + /* Should not happened */ + break; + } + /* add end of string character */ + pURI->protocol[Offset] = '\0'; - pPayload++; /* go after well know byte */ + pPayload++; /* go after well know byte */ - PayloadSize = pRecordStruct->PayloadLength; + PayloadSize = pRecordStruct->PayloadLength; - PayloadSize = PayloadSize - 1; /* remove well know byte */ + PayloadSize = PayloadSize - 1; /* remove well know byte */ - memcpy(pURI->URI_Message, pPayload, PayloadSize); - /* add end of string character */ - pURI->URI_Message[PayloadSize] = '\0'; + memcpy(pURI->URI_Message, pPayload, PayloadSize); + /* add end of string character */ + pURI->URI_Message[PayloadSize] = '\0'; } @@ -278,40 +278,40 @@ void NDEF::NDEF_Parse_WellKnowType(sRecordInfo_t *pRecordStruct, sURI_Info *pURI */ uint16_t NDEF::NDEF_ReadURI(sRecordInfo_t *pRecordStruct, sURI_Info *pURI) { - uint16_t status = NDEF_ERROR; - sRecordInfo_t *pSPRecordStruct; - uint32_t PayloadSize, RecordPosition; - uint8_t *pData; - - if (pRecordStruct->NDEF_Type == UNABRIDGED_URI_TYPE) { - NDEF_Parse_WellKnowType(pRecordStruct, pURI); - status = NDEF_OK; - } else if (pRecordStruct->NDEF_Type == WELL_KNOWN_ABRIDGED_URI_TYPE) { - NDEF_Parse_WellKnowType(pRecordStruct, pURI); - status = NDEF_OK; - } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { - for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { - pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; - if (pSPRecordStruct->NDEF_Type == WELL_KNOWN_ABRIDGED_URI_TYPE) { - NDEF_Parse_WellKnowType(pSPRecordStruct, pURI); - status = NDEF_OK; - } - if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { - PayloadSize = pSPRecordStruct->PayloadLength; + uint16_t status = NDEF_ERROR; + sRecordInfo_t *pSPRecordStruct; + uint32_t PayloadSize, RecordPosition; + uint8_t *pData; - /* The instruction content the UTF-8 language code that is not used here */ - pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; - PayloadSize -= *pData + 1; /* remove not useful data */ - pData += *pData + 1; - - memcpy(pURI->Information, pData, PayloadSize); - } + if (pRecordStruct->NDEF_Type == UNABRIDGED_URI_TYPE) { + NDEF_Parse_WellKnowType(pRecordStruct, pURI); + status = NDEF_OK; + } else if (pRecordStruct->NDEF_Type == WELL_KNOWN_ABRIDGED_URI_TYPE) { + NDEF_Parse_WellKnowType(pRecordStruct, pURI); + status = NDEF_OK; + } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { + for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { + pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; + if (pSPRecordStruct->NDEF_Type == WELL_KNOWN_ABRIDGED_URI_TYPE) { + NDEF_Parse_WellKnowType(pSPRecordStruct, pURI); + status = NDEF_OK; + } + if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { + PayloadSize = pSPRecordStruct->PayloadLength; + + /* The instruction content the UTF-8 language code that is not used here */ + pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; + PayloadSize -= *pData + 1; /* remove not useful data */ + pData += *pData + 1; + + memcpy(pURI->Information, pData, PayloadSize); + } + } + } else { + status = NDEF_ERROR; } - } else { - status = NDEF_ERROR; - } - return status; + return status; } /** @@ -322,133 +322,133 @@ uint16_t NDEF::NDEF_ReadURI(sRecordInfo_t *pRecordStruct, sURI_Info *pURI) */ void NDEF::NDEF_PrepareURIMessage(sURI_Info *pURI, uint8_t *pNDEFMessage, uint16_t *size) { - uint32_t uriSize, totalSize, Offset = 0; - uint32_t infoSize = 0; - char type; - - /* An URI can be included in a smart poster to add text to give instruction to user for instance */ - - /* URI (smart poster) Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* We need to know the URI type in order to define if an abbreviation is available */ - type = getUriType(pURI->protocol); - - /* URI : 1+URI for abbreviate protocol*/ - if (type != URI_ID_0x00) { - uriSize = 1 + strlen(pURI->URI_Message); - } else { /*: 1+protocol+URI else*/ - uriSize = 1 + strlen(pURI->protocol) + strlen(pURI->URI_Message); - } - - /* Check if a Smart poster is needed */ - if (pURI->Information[0] != '\0') { - /* Info : 1+2+info */ - infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pURI->Information); - /* Total */ - totalSize = 4 + uriSize + 4 + infoSize; - if (uriSize > 255) { - totalSize += 3; /* Normal URI size */ + uint32_t uriSize, totalSize, Offset = 0; + uint32_t infoSize = 0; + char type; + + /* An URI can be included in a smart poster to add text to give instruction to user for instance */ + + /* URI (smart poster) Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* We need to know the URI type in order to define if an abbreviation is available */ + type = getUriType(pURI->protocol); + + /* URI : 1+URI for abbreviate protocol*/ + if (type != URI_ID_0x00) { + uriSize = 1 + strlen(pURI->URI_Message); + } else { /*: 1+protocol+URI else*/ + uriSize = 1 + strlen(pURI->protocol) + strlen(pURI->URI_Message); } - if (infoSize > 255) { - totalSize += 3; /* Normal Info size */ + + /* Check if a Smart poster is needed */ + if (pURI->Information[0] != '\0') { + /* Info : 1+2+info */ + infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pURI->Information); + /* Total */ + totalSize = 4 + uriSize + 4 + infoSize; + if (uriSize > 255) { + totalSize += 3; /* Normal URI size */ + } + if (infoSize > 255) { + totalSize += 3; /* Normal Info size */ + } + + /* SmartPoster header */ + if (totalSize > 255) { + pNDEFMessage[Offset++] = 0xC1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = totalSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = 0xD1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)totalSize; + } + memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); + Offset += SMART_POSTER_TYPE_STRING_LENGTH; } - /* SmartPoster header */ - if (totalSize > 255) { - pNDEFMessage[Offset++] = 0xC1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = totalSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0xD1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)totalSize; + /* URI header */ + pNDEFMessage[Offset] = 0x81; + if (uriSize < 256) { + pNDEFMessage[Offset] |= 0x10; // Set the SR bit + } + if (pURI->Information[0] == '\0') { + pNDEFMessage[Offset] |= 0x40; // Set the ME bit } - memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); - Offset += SMART_POSTER_TYPE_STRING_LENGTH; - } - - /* URI header */ - pNDEFMessage[Offset] = 0x81; - if (uriSize < 256) { - pNDEFMessage[Offset] |= 0x10; // Set the SR bit - } - if (pURI->Information[0] == '\0') { - pNDEFMessage[Offset] |= 0x40; // Set the ME bit - } - Offset++; - - pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; - if (uriSize > 255) { - pNDEFMessage[Offset++] = (uriSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (uriSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (uriSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = uriSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = (uint8_t)uriSize; - } - memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); - Offset += URI_TYPE_STRING_LENGTH; - - pNDEFMessage[Offset++] = type; - if (type == URI_ID_0x00) { // No abbreviation - memcpy(&pNDEFMessage[Offset], pURI->protocol, strlen(pURI->protocol)); - Offset += strlen(pURI->protocol); - } - - memcpy(&pNDEFMessage[Offset], pURI->URI_Message, strlen(pURI->URI_Message)); - Offset += strlen(pURI->URI_Message); - - /* Information header */ - if (pURI->Information[0] != '\0') { - if (infoSize > 255) { - pNDEFMessage[Offset++] = 0x41; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = infoSize & 0x000000FF; + Offset++; + + pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; + if (uriSize > 255) { + pNDEFMessage[Offset++] = (uriSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (uriSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (uriSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = uriSize & 0x000000FF; } else { - pNDEFMessage[Offset++] = 0x51; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)infoSize; + pNDEFMessage[Offset++] = (uint8_t)uriSize; } + memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); + Offset += URI_TYPE_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); - Offset += TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ - memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); - Offset += ISO_ENGLISH_CODE_STRING_LENGTH; + pNDEFMessage[Offset++] = type; + if (type == URI_ID_0x00) { // No abbreviation + memcpy(&pNDEFMessage[Offset], pURI->protocol, strlen(pURI->protocol)); + Offset += strlen(pURI->protocol); + } - /* Information payload */ - memcpy(&pNDEFMessage[Offset], pURI->Information, strlen(pURI->Information)); - Offset += strlen(pURI->Information); - } + memcpy(&pNDEFMessage[Offset], pURI->URI_Message, strlen(pURI->URI_Message)); + Offset += strlen(pURI->URI_Message); + + /* Information header */ + if (pURI->Information[0] != '\0') { + if (infoSize > 255) { + pNDEFMessage[Offset++] = 0x41; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = infoSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = 0x51; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)infoSize; + } + + memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); + Offset += TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ + memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); + Offset += ISO_ENGLISH_CODE_STRING_LENGTH; + + /* Information payload */ + memcpy(&pNDEFMessage[Offset], pURI->Information, strlen(pURI->Information)); + Offset += strlen(pURI->Information); + } - *size = Offset; + *size = Offset; } /** @@ -463,90 +463,90 @@ void NDEF::NDEF_PrepareURIMessage(sURI_Info *pURI, uint8_t *pNDEFMessage, uint16 */ uint16_t NDEF::NDEF_WriteURI(sURI_Info *pURI) { - uint16_t status = NDEF_ERROR, Offset = 0; + uint16_t status = NDEF_ERROR, Offset = 0; - NDEF_PrepareURIMessage(pURI, NDEF_Buffer, &Offset); + NDEF_PrepareURIMessage(pURI, NDEF_Buffer, &Offset); - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); - return status; + return status; } char NDEF::getUriType(char *protocol) { - if (!memcmp(protocol, URI_ID_0x01_STRING, strlen(URI_ID_0x01_STRING))) { - return URI_ID_0x01; - } else if (!memcmp(protocol, URI_ID_0x02_STRING, strlen(URI_ID_0x02_STRING))) { - return URI_ID_0x02; - } else if (!memcmp(protocol, URI_ID_0x03_STRING, strlen(URI_ID_0x03_STRING))) { - return URI_ID_0x03; - } else if (!memcmp(protocol, URI_ID_0x04_STRING, strlen(URI_ID_0x04_STRING))) { - return URI_ID_0x04; - } else if (!memcmp(protocol, URI_ID_0x05_STRING, strlen(URI_ID_0x05_STRING))) { - return URI_ID_0x05; - } else if (!memcmp(protocol, URI_ID_0x06_STRING, strlen(URI_ID_0x06_STRING))) { - return URI_ID_0x06; - } else if (!memcmp(protocol, URI_ID_0x07_STRING, strlen(URI_ID_0x07_STRING))) { - return URI_ID_0x07; - } else if (!memcmp(protocol, URI_ID_0x08_STRING, strlen(URI_ID_0x08_STRING))) { - return URI_ID_0x08; - } else if (!memcmp(protocol, URI_ID_0x09_STRING, strlen(URI_ID_0x09_STRING))) { - return URI_ID_0x09; - } else if (!memcmp(protocol, URI_ID_0x0A_STRING, strlen(URI_ID_0x0A_STRING))) { - return URI_ID_0x0A; - } else if (!memcmp(protocol, URI_ID_0x0B_STRING, strlen(URI_ID_0x0B_STRING))) { - return URI_ID_0x0B; - } else if (!memcmp(protocol, URI_ID_0x0C_STRING, strlen(URI_ID_0x0C_STRING))) { - return URI_ID_0x0C; - } else if (!memcmp(protocol, URI_ID_0x0D_STRING, strlen(URI_ID_0x0D_STRING))) { - return URI_ID_0x0D; - } else if (!memcmp(protocol, URI_ID_0x0E_STRING, strlen(URI_ID_0x0E_STRING))) { - return URI_ID_0x0E; - } else if (!memcmp(protocol, URI_ID_0x0F_STRING, strlen(URI_ID_0x0F_STRING))) { - return URI_ID_0x0F; - } else if (!memcmp(protocol, URI_ID_0x10_STRING, strlen(URI_ID_0x10_STRING))) { - return URI_ID_0x10; - } else if (!memcmp(protocol, URI_ID_0x11_STRING, strlen(URI_ID_0x11_STRING))) { - return URI_ID_0x11; - } else if (!memcmp(protocol, URI_ID_0x12_STRING, strlen(URI_ID_0x12_STRING))) { - return URI_ID_0x12; - } else if (!memcmp(protocol, URI_ID_0x13_STRING, strlen(URI_ID_0x13_STRING))) { - return URI_ID_0x13; - } else if (!memcmp(protocol, URI_ID_0x14_STRING, strlen(URI_ID_0x14_STRING))) { - return URI_ID_0x14; - } else if (!memcmp(protocol, URI_ID_0x15_STRING, strlen(URI_ID_0x15_STRING))) { - return URI_ID_0x15; - } else if (!memcmp(protocol, URI_ID_0x16_STRING, strlen(URI_ID_0x16_STRING))) { - return URI_ID_0x16; - } else if (!memcmp(protocol, URI_ID_0x17_STRING, strlen(URI_ID_0x17_STRING))) { - return URI_ID_0x17; - } else if (!memcmp(protocol, URI_ID_0x18_STRING, strlen(URI_ID_0x18_STRING))) { - return URI_ID_0x18; - } else if (!memcmp(protocol, URI_ID_0x19_STRING, strlen(URI_ID_0x19_STRING))) { - return URI_ID_0x19; - } else if (!memcmp(protocol, URI_ID_0x1A_STRING, strlen(URI_ID_0x1A_STRING))) { - return URI_ID_0x1A; - } else if (!memcmp(protocol, URI_ID_0x1B_STRING, strlen(URI_ID_0x1B_STRING))) { - return URI_ID_0x1B; - } else if (!memcmp(protocol, URI_ID_0x1C_STRING, strlen(URI_ID_0x1C_STRING))) { - return URI_ID_0x1C; - } else if (!memcmp(protocol, URI_ID_0x1D_STRING, strlen(URI_ID_0x1D_STRING))) { - return URI_ID_0x1D; - } else if (!memcmp(protocol, URI_ID_0x1E_STRING, strlen(URI_ID_0x1E_STRING))) { - return URI_ID_0x1E; - } else if (!memcmp(protocol, URI_ID_0x1F_STRING, strlen(URI_ID_0x1F_STRING))) { - return URI_ID_0x1F; - } else if (!memcmp(protocol, URI_ID_0x20_STRING, strlen(URI_ID_0x20_STRING))) { - return URI_ID_0x20; - } else if (!memcmp(protocol, URI_ID_0x21_STRING, strlen(URI_ID_0x21_STRING))) { - return URI_ID_0x21; - } else if (!memcmp(protocol, URI_ID_0x22_STRING, strlen(URI_ID_0x22_STRING))) { - return URI_ID_0x22; - } else if (!memcmp(protocol, URI_ID_0x23_STRING, strlen(URI_ID_0x23_STRING))) { - return URI_ID_0x23; - } else { - return URI_ID_0x00; // No abbreviation for this protocol - } + if (!memcmp(protocol, URI_ID_0x01_STRING, strlen(URI_ID_0x01_STRING))) { + return URI_ID_0x01; + } else if (!memcmp(protocol, URI_ID_0x02_STRING, strlen(URI_ID_0x02_STRING))) { + return URI_ID_0x02; + } else if (!memcmp(protocol, URI_ID_0x03_STRING, strlen(URI_ID_0x03_STRING))) { + return URI_ID_0x03; + } else if (!memcmp(protocol, URI_ID_0x04_STRING, strlen(URI_ID_0x04_STRING))) { + return URI_ID_0x04; + } else if (!memcmp(protocol, URI_ID_0x05_STRING, strlen(URI_ID_0x05_STRING))) { + return URI_ID_0x05; + } else if (!memcmp(protocol, URI_ID_0x06_STRING, strlen(URI_ID_0x06_STRING))) { + return URI_ID_0x06; + } else if (!memcmp(protocol, URI_ID_0x07_STRING, strlen(URI_ID_0x07_STRING))) { + return URI_ID_0x07; + } else if (!memcmp(protocol, URI_ID_0x08_STRING, strlen(URI_ID_0x08_STRING))) { + return URI_ID_0x08; + } else if (!memcmp(protocol, URI_ID_0x09_STRING, strlen(URI_ID_0x09_STRING))) { + return URI_ID_0x09; + } else if (!memcmp(protocol, URI_ID_0x0A_STRING, strlen(URI_ID_0x0A_STRING))) { + return URI_ID_0x0A; + } else if (!memcmp(protocol, URI_ID_0x0B_STRING, strlen(URI_ID_0x0B_STRING))) { + return URI_ID_0x0B; + } else if (!memcmp(protocol, URI_ID_0x0C_STRING, strlen(URI_ID_0x0C_STRING))) { + return URI_ID_0x0C; + } else if (!memcmp(protocol, URI_ID_0x0D_STRING, strlen(URI_ID_0x0D_STRING))) { + return URI_ID_0x0D; + } else if (!memcmp(protocol, URI_ID_0x0E_STRING, strlen(URI_ID_0x0E_STRING))) { + return URI_ID_0x0E; + } else if (!memcmp(protocol, URI_ID_0x0F_STRING, strlen(URI_ID_0x0F_STRING))) { + return URI_ID_0x0F; + } else if (!memcmp(protocol, URI_ID_0x10_STRING, strlen(URI_ID_0x10_STRING))) { + return URI_ID_0x10; + } else if (!memcmp(protocol, URI_ID_0x11_STRING, strlen(URI_ID_0x11_STRING))) { + return URI_ID_0x11; + } else if (!memcmp(protocol, URI_ID_0x12_STRING, strlen(URI_ID_0x12_STRING))) { + return URI_ID_0x12; + } else if (!memcmp(protocol, URI_ID_0x13_STRING, strlen(URI_ID_0x13_STRING))) { + return URI_ID_0x13; + } else if (!memcmp(protocol, URI_ID_0x14_STRING, strlen(URI_ID_0x14_STRING))) { + return URI_ID_0x14; + } else if (!memcmp(protocol, URI_ID_0x15_STRING, strlen(URI_ID_0x15_STRING))) { + return URI_ID_0x15; + } else if (!memcmp(protocol, URI_ID_0x16_STRING, strlen(URI_ID_0x16_STRING))) { + return URI_ID_0x16; + } else if (!memcmp(protocol, URI_ID_0x17_STRING, strlen(URI_ID_0x17_STRING))) { + return URI_ID_0x17; + } else if (!memcmp(protocol, URI_ID_0x18_STRING, strlen(URI_ID_0x18_STRING))) { + return URI_ID_0x18; + } else if (!memcmp(protocol, URI_ID_0x19_STRING, strlen(URI_ID_0x19_STRING))) { + return URI_ID_0x19; + } else if (!memcmp(protocol, URI_ID_0x1A_STRING, strlen(URI_ID_0x1A_STRING))) { + return URI_ID_0x1A; + } else if (!memcmp(protocol, URI_ID_0x1B_STRING, strlen(URI_ID_0x1B_STRING))) { + return URI_ID_0x1B; + } else if (!memcmp(protocol, URI_ID_0x1C_STRING, strlen(URI_ID_0x1C_STRING))) { + return URI_ID_0x1C; + } else if (!memcmp(protocol, URI_ID_0x1D_STRING, strlen(URI_ID_0x1D_STRING))) { + return URI_ID_0x1D; + } else if (!memcmp(protocol, URI_ID_0x1E_STRING, strlen(URI_ID_0x1E_STRING))) { + return URI_ID_0x1E; + } else if (!memcmp(protocol, URI_ID_0x1F_STRING, strlen(URI_ID_0x1F_STRING))) { + return URI_ID_0x1F; + } else if (!memcmp(protocol, URI_ID_0x20_STRING, strlen(URI_ID_0x20_STRING))) { + return URI_ID_0x20; + } else if (!memcmp(protocol, URI_ID_0x21_STRING, strlen(URI_ID_0x21_STRING))) { + return URI_ID_0x21; + } else if (!memcmp(protocol, URI_ID_0x22_STRING, strlen(URI_ID_0x22_STRING))) { + return URI_ID_0x22; + } else if (!memcmp(protocol, URI_ID_0x23_STRING, strlen(URI_ID_0x23_STRING))) { + return URI_ID_0x23; + } else { + return URI_ID_0x00; // No abbreviation for this protocol + } } diff --git a/src/libNDEF/lib_NDEF_URI.h b/src/libNDEF/lib_NDEF_URI.h index 245eae0..a96d32a 100755 --- a/src/libNDEF/lib_NDEF_URI.h +++ b/src/libNDEF/lib_NDEF_URI.h @@ -35,12 +35,12 @@ #include "lib_NDEF.h" typedef struct { - // char protocol[80]; - // char URI_Message[400]; - // char Information[400]; - char protocol[URI_PROTOCOL_MAX_SIZE]; - char URI_Message[URI_MESSAGE_MAX_SIZE]; - char Information[URI_INFO_MAX_SIZE]; + // char protocol[80]; + // char URI_Message[400]; + // char Information[400]; + char protocol[URI_PROTOCOL_MAX_SIZE]; + char URI_Message[URI_MESSAGE_MAX_SIZE]; + char Information[URI_INFO_MAX_SIZE]; } sURI_Info; #endif /* __LIB_NDEF_URI_H */ diff --git a/src/libNDEF/lib_NDEF_Vcard.cpp b/src/libNDEF/lib_NDEF_Vcard.cpp index 756c559..997e121 100755 --- a/src/libNDEF/lib_NDEF_Vcard.cpp +++ b/src/libNDEF/lib_NDEF_Vcard.cpp @@ -52,37 +52,37 @@ */ void NDEF::NDEF_FillVcardStruct(uint8_t *pPayload, uint32_t PayloadSize, const char *pKeyWord, uint32_t SizeOfKeyWord, uint8_t *pString) { - uint8_t *pLastByteAdd, *pLook4Word, *pEndString; - - /* First character force to NULL in case not matching found */ - *pString = 0; - - /* Interesting information are stored before picture if any */ - /* Moreover picture is not used in this demonstration SW */ - pLastByteAdd = pPayload; - while (memcmp(pLastByteAdd, JPEG, JPEG_STRING_SIZE) && (pLastByteAdd < (pPayload + PayloadSize))) { - pLastByteAdd++; - } - - pLook4Word = pPayload; - while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { - pLook4Word++; - } - - /* Word found */ - if (pLook4Word != pLastByteAdd) { - pLook4Word += SizeOfKeyWord; - pEndString = pLook4Word; - while (memcmp(pEndString, LIMIT, LIMIT_STRING_SIZE) && (pEndString < pLastByteAdd)) { - pEndString++; - } - if (pEndString != pLastByteAdd) { - memcpy(pString, pLook4Word, pEndString - pLook4Word); - /* add end of string character */ - pString += pEndString - pLook4Word; - *pString = '\0'; - } - } + uint8_t *pLastByteAdd, *pLook4Word, *pEndString; + + /* First character force to NULL in case not matching found */ + *pString = 0; + + /* Interesting information are stored before picture if any */ + /* Moreover picture is not used in this demonstration SW */ + pLastByteAdd = pPayload; + while (memcmp(pLastByteAdd, JPEG, JPEG_STRING_SIZE) && (pLastByteAdd < (pPayload + PayloadSize))) { + pLastByteAdd++; + } + + pLook4Word = pPayload; + while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { + pLook4Word++; + } + + /* Word found */ + if (pLook4Word != pLastByteAdd) { + pLook4Word += SizeOfKeyWord; + pEndString = pLook4Word; + while (memcmp(pEndString, LIMIT, LIMIT_STRING_SIZE) && (pEndString < pLastByteAdd)) { + pEndString++; + } + if (pEndString != pLastByteAdd) { + memcpy(pString, pLook4Word, pEndString - pLook4Word); + /* add end of string character */ + pString += pEndString - pLook4Word; + *pString = '\0'; + } + } } /** @@ -92,34 +92,34 @@ void NDEF::NDEF_FillVcardStruct(uint8_t *pPayload, uint32_t PayloadSize, const c */ void NDEF::NDEF_ExtractVcard(sRecordInfo_t *pRecordStruct, sVcardInfo *pVcardStruct) { - uint32_t PayloadSize; - uint8_t *pPayload; - - - PayloadSize = pRecordStruct->PayloadLength; - - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - - NDEF_FillVcardStruct(pPayload, PayloadSize, VERSION, VERSION_STRING_SIZE, (uint8_t *)(pVcardStruct->Version)); - if (!memcmp(pVcardStruct->Version, VCARD_VERSION_2_1, VCARD_VERSION_2_1_SIZE)) { - NDEF_FillVcardStruct(pPayload, PayloadSize, FIRSTNAME, FIRSTNAME_STRING_SIZE, (uint8_t *)(pVcardStruct->FirstName)); - NDEF_FillVcardStruct(pPayload, PayloadSize, TITLE, TITLE_STRING_SIZE, (uint8_t *)(pVcardStruct->Title)); - NDEF_FillVcardStruct(pPayload, PayloadSize, ORG, ORG_STRING_SIZE, (uint8_t *)(pVcardStruct->Org)); - NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_ADDRESS, HOME_ADDRESS_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeAddress)); - NDEF_FillVcardStruct(pPayload, PayloadSize, GEN_ADDRESS, strlen(GEN_ADDRESS), (uint8_t *)(pVcardStruct->Address)); - NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_ADDRESS, WORK_ADDRESS_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkAddress)); - NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_TEL, HOME_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeTel)); - NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_TEL, WORK_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkTel)); - NDEF_FillVcardStruct(pPayload, PayloadSize, CELL_TEL, CELL_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->CellTel)); - NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_EMAIL, HOME_EMAIL_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeEmail)); - NDEF_FillVcardStruct(pPayload, PayloadSize, GEN_EMAIL, strlen(GEN_EMAIL), (uint8_t *)(pVcardStruct->Email)); - NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_EMAIL, WORK_EMAIL_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkEmail)); - } else if (!memcmp(pVcardStruct->Version, VCARD_VERSION_3_0, VCARD_VERSION_3_0_SIZE)) { - /* need to be implemented */ - } else { - /* maybe new version but not supported in this sw */ - } + uint32_t PayloadSize; + uint8_t *pPayload; + + + PayloadSize = pRecordStruct->PayloadLength; + + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + + NDEF_FillVcardStruct(pPayload, PayloadSize, VERSION, VERSION_STRING_SIZE, (uint8_t *)(pVcardStruct->Version)); + if (!memcmp(pVcardStruct->Version, VCARD_VERSION_2_1, VCARD_VERSION_2_1_SIZE)) { + NDEF_FillVcardStruct(pPayload, PayloadSize, FIRSTNAME, FIRSTNAME_STRING_SIZE, (uint8_t *)(pVcardStruct->FirstName)); + NDEF_FillVcardStruct(pPayload, PayloadSize, TITLE, TITLE_STRING_SIZE, (uint8_t *)(pVcardStruct->Title)); + NDEF_FillVcardStruct(pPayload, PayloadSize, ORG, ORG_STRING_SIZE, (uint8_t *)(pVcardStruct->Org)); + NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_ADDRESS, HOME_ADDRESS_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeAddress)); + NDEF_FillVcardStruct(pPayload, PayloadSize, GEN_ADDRESS, strlen(GEN_ADDRESS), (uint8_t *)(pVcardStruct->Address)); + NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_ADDRESS, WORK_ADDRESS_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkAddress)); + NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_TEL, HOME_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeTel)); + NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_TEL, WORK_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkTel)); + NDEF_FillVcardStruct(pPayload, PayloadSize, CELL_TEL, CELL_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->CellTel)); + NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_EMAIL, HOME_EMAIL_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeEmail)); + NDEF_FillVcardStruct(pPayload, PayloadSize, GEN_EMAIL, strlen(GEN_EMAIL), (uint8_t *)(pVcardStruct->Email)); + NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_EMAIL, WORK_EMAIL_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkEmail)); + } else if (!memcmp(pVcardStruct->Version, VCARD_VERSION_3_0, VCARD_VERSION_3_0_SIZE)) { + /* need to be implemented */ + } else { + /* maybe new version but not supported in this sw */ + } } @@ -132,14 +132,14 @@ void NDEF::NDEF_ExtractVcard(sRecordInfo_t *pRecordStruct, sVcardInfo *pVcardStr */ uint16_t NDEF::NDEF_ReadVcard(sRecordInfo_t *pRecordStruct, sVcardInfo *pVcardStruct) { - uint16_t status = NDEF_ERROR; + uint16_t status = NDEF_ERROR; - if (pRecordStruct->NDEF_Type == VCARD_TYPE) { - NDEF_ExtractVcard(pRecordStruct, pVcardStruct); - status = NDEF_OK; - } + if (pRecordStruct->NDEF_Type == VCARD_TYPE) { + NDEF_ExtractVcard(pRecordStruct, pVcardStruct); + status = NDEF_OK; + } - return status; + return status; } /** @@ -154,13 +154,13 @@ uint16_t NDEF::NDEF_ReadVcard(sRecordInfo_t *pRecordStruct, sVcardInfo *pVcardSt */ uint16_t NDEF::NDEF_WriteVcard(sVcardInfo *pVcardStruct) { - uint16_t status = NDEF_ERROR, Offset = 0; + uint16_t status = NDEF_ERROR, Offset = 0; - NDEF_PrepareVcardMessage(pVcardStruct, NDEF_Buffer, &Offset); + NDEF_PrepareVcardMessage(pVcardStruct, NDEF_Buffer, &Offset); - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); - return status; + return status; } /** @@ -171,96 +171,96 @@ uint16_t NDEF::NDEF_WriteVcard(sVcardInfo *pVcardStruct) uint32_t NDEF_GetVcardLength(sVcardInfo *pVcardStruct) { - uint32_t PayloadSize = 0; - - /* "BEGIN:VCARD\r\n" */ - PayloadSize += VCARD_BEGIN_STRING_SIZE; - PayloadSize += VCARD_STRING_SIZE; - PayloadSize += LIMIT_STRING_SIZE; + uint32_t PayloadSize = 0; - /* "VERSION:2.1\r\n" */ - PayloadSize += VERSION_STRING_SIZE; - PayloadSize += VCARD_VERSION_2_1_SIZE; - PayloadSize += LIMIT_STRING_SIZE; - - /* "N:\r\n" */ - if (*pVcardStruct->Name != '\0') { - PayloadSize += VCARD_NAME_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->Name); - PayloadSize += LIMIT_STRING_SIZE; - } - /* "FN:\r\n" */ - if (*pVcardStruct->FirstName != '\0') { - PayloadSize += FIRSTNAME_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->FirstName); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Title != '\0') { - /* "TITLE:\r\n" */ - PayloadSize += TITLE_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->Title); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Org != '\0') { - /* "ORG:\r\n" */ - PayloadSize += ORG_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->Org); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Url != '\0') { - /* "URL:\r\n" */ - PayloadSize += URL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->Url); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeAddress != '\0') { - /* "ADR;HOME:\r\n" */ - PayloadSize += HOME_ADDRESS_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->HomeAddress); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkAddress != '\0') { - /* "ADR;WORK:\r\n" */ - PayloadSize += WORK_ADDRESS_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->WorkAddress); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeTel != '\0') { - /* "TEL;HOME:\r\n" */ - PayloadSize += HOME_TEL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->HomeTel); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkTel != '\0') { - /* "TEL;WORK:\r\n" */ - PayloadSize += WORK_TEL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->WorkTel); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->CellTel != '\0') { - /* "TEL;CELL:\r\n" */ - PayloadSize += CELL_TEL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->CellTel); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeEmail != '\0') { - /* "EMAIL;HOME:\r\n" */ - PayloadSize += HOME_EMAIL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->HomeEmail); + /* "BEGIN:VCARD\r\n" */ + PayloadSize += VCARD_BEGIN_STRING_SIZE; + PayloadSize += VCARD_STRING_SIZE; PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkEmail != '\0') { - /* "EMAIL;WORK:\r\n" */ - PayloadSize += WORK_EMAIL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->WorkEmail); + + /* "VERSION:2.1\r\n" */ + PayloadSize += VERSION_STRING_SIZE; + PayloadSize += VCARD_VERSION_2_1_SIZE; PayloadSize += LIMIT_STRING_SIZE; - } - /* "END:VCARD\r\n" */ - PayloadSize += VCARD_END_STRING_SIZE; - PayloadSize += VCARD_STRING_SIZE; - /* PayloadSize += LIMIT_STRING_SIZE;*/ - return PayloadSize; + /* "N:\r\n" */ + if (*pVcardStruct->Name != '\0') { + PayloadSize += VCARD_NAME_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->Name); + PayloadSize += LIMIT_STRING_SIZE; + } + /* "FN:\r\n" */ + if (*pVcardStruct->FirstName != '\0') { + PayloadSize += FIRSTNAME_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->FirstName); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Title != '\0') { + /* "TITLE:\r\n" */ + PayloadSize += TITLE_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->Title); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Org != '\0') { + /* "ORG:\r\n" */ + PayloadSize += ORG_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->Org); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Url != '\0') { + /* "URL:\r\n" */ + PayloadSize += URL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->Url); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->HomeAddress != '\0') { + /* "ADR;HOME:\r\n" */ + PayloadSize += HOME_ADDRESS_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->HomeAddress); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkAddress != '\0') { + /* "ADR;WORK:\r\n" */ + PayloadSize += WORK_ADDRESS_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->WorkAddress); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->HomeTel != '\0') { + /* "TEL;HOME:\r\n" */ + PayloadSize += HOME_TEL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->HomeTel); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkTel != '\0') { + /* "TEL;WORK:\r\n" */ + PayloadSize += WORK_TEL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->WorkTel); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->CellTel != '\0') { + /* "TEL;CELL:\r\n" */ + PayloadSize += CELL_TEL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->CellTel); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->HomeEmail != '\0') { + /* "EMAIL;HOME:\r\n" */ + PayloadSize += HOME_EMAIL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->HomeEmail); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkEmail != '\0') { + /* "EMAIL;WORK:\r\n" */ + PayloadSize += WORK_EMAIL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->WorkEmail); + PayloadSize += LIMIT_STRING_SIZE; + } + /* "END:VCARD\r\n" */ + PayloadSize += VCARD_END_STRING_SIZE; + PayloadSize += VCARD_STRING_SIZE; + /* PayloadSize += LIMIT_STRING_SIZE;*/ + + return PayloadSize; } @@ -273,209 +273,209 @@ uint32_t NDEF_GetVcardLength(sVcardInfo *pVcardStruct) void NDEF::NDEF_PrepareVcardMessage(sVcardInfo *pVcardStruct, uint8_t *pNDEFMessage, uint16_t *size) { - uint32_t PayloadSize = 0; - - /* Vcard Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=0 TNF=2 NFC Forum Media type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* As we don't have embedded a jpeg encoder/decoder in this firmware */ - /* We have made the choice to manage only string content of the vCard */ - /* For demonstration purpose in order to fill the 8kB of the M24SR */ - /* We have embedded a NDEF vCard in the STM32 to be able to fill M24SR */ - - /* fill record header */ - uint32_t length = NDEF_GetVcardLength(pVcardStruct); - if (length >= 0xFF) { - pNDEFMessage[0] = 0xC2; /* Record Flag */ - pNDEFMessage[1] = XVCARD_TYPE_STRING_LENGTH; - pNDEFMessage[5] = length & 0xff; - pNDEFMessage[4] = (length >> 8) & 0xff; - pNDEFMessage[3] = (length >> 16) & 0xff; - pNDEFMessage[2] = length >> 24; - memcpy(&pNDEFMessage[6], XVCARD_TYPE_STRING, XVCARD_TYPE_STRING_LENGTH); - - /* Payload is positioned in the NDEF after record header */ - PayloadSize = 6 + XVCARD_TYPE_STRING_LENGTH; - } else { - pNDEFMessage[0] = 0xD2; /* Record Flag */ - pNDEFMessage[1] = XVCARD_TYPE_STRING_LENGTH; - pNDEFMessage[2] = length; - memcpy(&pNDEFMessage[3], XVCARD_TYPE_STRING, XVCARD_TYPE_STRING_LENGTH); - - /* Payload is positioned in the NDEF after record header */ - PayloadSize = 3 + XVCARD_TYPE_STRING_LENGTH; - } - - /* "BEGIN:VCARD\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], VCARD_BEGIN, VCARD_BEGIN_STRING_SIZE); - PayloadSize += VCARD_BEGIN_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], VCARD, VCARD_STRING_SIZE); - PayloadSize += VCARD_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - - /* "VERSION:2.1\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], VERSION, VERSION_STRING_SIZE); - PayloadSize += VERSION_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], VCARD_VERSION_2_1, VCARD_VERSION_2_1_SIZE); - PayloadSize += VCARD_VERSION_2_1_SIZE; - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - - /* "N:\r\n" */ - if (*pVcardStruct->Name != '\0') { - memcpy(&pNDEFMessage[PayloadSize], VCARD_NAME, VCARD_NAME_STRING_SIZE); - PayloadSize += VCARD_NAME_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Name, strlen(pVcardStruct->Name)); - PayloadSize += strlen(pVcardStruct->Name); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - /* "FN:\r\n" */ - if (*pVcardStruct->FirstName != '\0') { - memcpy(&pNDEFMessage[PayloadSize], FIRSTNAME, FIRSTNAME_STRING_SIZE); - PayloadSize += FIRSTNAME_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->FirstName, strlen(pVcardStruct->FirstName)); - PayloadSize += strlen(pVcardStruct->FirstName); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeTel != '\0') { - - /* "TEL;HOME:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], HOME_TEL, HOME_TEL_STRING_SIZE); - PayloadSize += HOME_TEL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeTel, strlen(pVcardStruct->HomeTel)); - PayloadSize += strlen(pVcardStruct->HomeTel); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkTel != '\0') { - - /* "TEL;WORK:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], WORK_TEL, WORK_TEL_STRING_SIZE); - PayloadSize += WORK_TEL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkTel, strlen(pVcardStruct->WorkTel)); - PayloadSize += strlen(pVcardStruct->WorkTel); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->CellTel != '\0') { - - /* "TEL;CELL:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], CELL_TEL, CELL_TEL_STRING_SIZE); - PayloadSize += CELL_TEL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->CellTel, strlen(pVcardStruct->CellTel)); - PayloadSize += strlen(pVcardStruct->CellTel); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeEmail != '\0') { - - /* "EMAIL;HOME:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], HOME_EMAIL, HOME_EMAIL_STRING_SIZE); - PayloadSize += HOME_EMAIL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeEmail, strlen(pVcardStruct->HomeEmail)); - PayloadSize += strlen(pVcardStruct->HomeEmail); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkEmail != '\0') { - - /* "EMAIL;WORK:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], WORK_EMAIL, WORK_EMAIL_STRING_SIZE); - PayloadSize += WORK_EMAIL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkEmail, strlen(pVcardStruct->WorkEmail)); - PayloadSize += strlen(pVcardStruct->WorkEmail); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeAddress != '\0') { - - /* "ADR;HOME:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], HOME_ADDRESS, HOME_ADDRESS_STRING_SIZE); - PayloadSize += HOME_ADDRESS_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeAddress, strlen(pVcardStruct->HomeAddress)); - PayloadSize += strlen(pVcardStruct->HomeAddress); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkAddress != '\0') { - - /* "ADR;WORK:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], WORK_ADDRESS, WORK_ADDRESS_STRING_SIZE); - PayloadSize += WORK_ADDRESS_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkAddress, strlen(pVcardStruct->WorkAddress)); - PayloadSize += strlen(pVcardStruct->WorkAddress); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Org != '\0') { - - /* "ORG:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], ORG, ORG_STRING_SIZE); - PayloadSize += ORG_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Org, strlen(pVcardStruct->Org)); - PayloadSize += strlen(pVcardStruct->Org); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Title != '\0') { - /* "TITLE:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], TITLE, TITLE_STRING_SIZE); - PayloadSize += TITLE_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Title, strlen(pVcardStruct->Title)); - PayloadSize += strlen(pVcardStruct->Title); + uint32_t PayloadSize = 0; + + /* Vcard Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=0 TNF=2 NFC Forum Media type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* As we don't have embedded a jpeg encoder/decoder in this firmware */ + /* We have made the choice to manage only string content of the vCard */ + /* For demonstration purpose in order to fill the 8kB of the M24SR */ + /* We have embedded a NDEF vCard in the STM32 to be able to fill M24SR */ + + /* fill record header */ + uint32_t length = NDEF_GetVcardLength(pVcardStruct); + if (length >= 0xFF) { + pNDEFMessage[0] = 0xC2; /* Record Flag */ + pNDEFMessage[1] = XVCARD_TYPE_STRING_LENGTH; + pNDEFMessage[5] = length & 0xff; + pNDEFMessage[4] = (length >> 8) & 0xff; + pNDEFMessage[3] = (length >> 16) & 0xff; + pNDEFMessage[2] = length >> 24; + memcpy(&pNDEFMessage[6], XVCARD_TYPE_STRING, XVCARD_TYPE_STRING_LENGTH); + + /* Payload is positioned in the NDEF after record header */ + PayloadSize = 6 + XVCARD_TYPE_STRING_LENGTH; + } else { + pNDEFMessage[0] = 0xD2; /* Record Flag */ + pNDEFMessage[1] = XVCARD_TYPE_STRING_LENGTH; + pNDEFMessage[2] = length; + memcpy(&pNDEFMessage[3], XVCARD_TYPE_STRING, XVCARD_TYPE_STRING_LENGTH); + + /* Payload is positioned in the NDEF after record header */ + PayloadSize = 3 + XVCARD_TYPE_STRING_LENGTH; + } + + /* "BEGIN:VCARD\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], VCARD_BEGIN, VCARD_BEGIN_STRING_SIZE); + PayloadSize += VCARD_BEGIN_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], VCARD, VCARD_STRING_SIZE); + PayloadSize += VCARD_STRING_SIZE; memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Url != '\0') { - /* "URL:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], URL, URL_STRING_SIZE); - PayloadSize += URL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Url, strlen(pVcardStruct->Url)); - PayloadSize += strlen(pVcardStruct->Url); + + /* "VERSION:2.1\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], VERSION, VERSION_STRING_SIZE); + PayloadSize += VERSION_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], VCARD_VERSION_2_1, VCARD_VERSION_2_1_SIZE); + PayloadSize += VCARD_VERSION_2_1_SIZE; memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); PayloadSize += LIMIT_STRING_SIZE; - } - - /* "END:VCARD\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], VCARD_END, VCARD_END_STRING_SIZE); - PayloadSize += VCARD_END_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], VCARD, VCARD_STRING_SIZE); - PayloadSize += VCARD_STRING_SIZE; - // memcpy( &pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE ); - // PayloadSize += LIMIT_STRING_SIZE; - - *size = (uint16_t)(PayloadSize); /* Must not count the 2 byte that represent the NDEF size */ - /* - PayloadSize -= 6 + VCARD_TYPE_STRING_LENGTH; - - pNDEFMessage[2] = (PayloadSize & 0xFF000000) >> 24; - pNDEFMessage[3] = (PayloadSize & 0x00FF0000) >> 16; - pNDEFMessage[4] = (PayloadSize & 0x0000FF00) >> 8; - pNDEFMessage[5] = PayloadSize & 0x000000FF; - */ + + /* "N:\r\n" */ + if (*pVcardStruct->Name != '\0') { + memcpy(&pNDEFMessage[PayloadSize], VCARD_NAME, VCARD_NAME_STRING_SIZE); + PayloadSize += VCARD_NAME_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Name, strlen(pVcardStruct->Name)); + PayloadSize += strlen(pVcardStruct->Name); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + /* "FN:\r\n" */ + if (*pVcardStruct->FirstName != '\0') { + memcpy(&pNDEFMessage[PayloadSize], FIRSTNAME, FIRSTNAME_STRING_SIZE); + PayloadSize += FIRSTNAME_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->FirstName, strlen(pVcardStruct->FirstName)); + PayloadSize += strlen(pVcardStruct->FirstName); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->HomeTel != '\0') { + + /* "TEL;HOME:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], HOME_TEL, HOME_TEL_STRING_SIZE); + PayloadSize += HOME_TEL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeTel, strlen(pVcardStruct->HomeTel)); + PayloadSize += strlen(pVcardStruct->HomeTel); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkTel != '\0') { + + /* "TEL;WORK:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], WORK_TEL, WORK_TEL_STRING_SIZE); + PayloadSize += WORK_TEL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkTel, strlen(pVcardStruct->WorkTel)); + PayloadSize += strlen(pVcardStruct->WorkTel); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->CellTel != '\0') { + + /* "TEL;CELL:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], CELL_TEL, CELL_TEL_STRING_SIZE); + PayloadSize += CELL_TEL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->CellTel, strlen(pVcardStruct->CellTel)); + PayloadSize += strlen(pVcardStruct->CellTel); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->HomeEmail != '\0') { + + /* "EMAIL;HOME:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], HOME_EMAIL, HOME_EMAIL_STRING_SIZE); + PayloadSize += HOME_EMAIL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeEmail, strlen(pVcardStruct->HomeEmail)); + PayloadSize += strlen(pVcardStruct->HomeEmail); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkEmail != '\0') { + + /* "EMAIL;WORK:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], WORK_EMAIL, WORK_EMAIL_STRING_SIZE); + PayloadSize += WORK_EMAIL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkEmail, strlen(pVcardStruct->WorkEmail)); + PayloadSize += strlen(pVcardStruct->WorkEmail); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->HomeAddress != '\0') { + + /* "ADR;HOME:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], HOME_ADDRESS, HOME_ADDRESS_STRING_SIZE); + PayloadSize += HOME_ADDRESS_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeAddress, strlen(pVcardStruct->HomeAddress)); + PayloadSize += strlen(pVcardStruct->HomeAddress); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkAddress != '\0') { + + /* "ADR;WORK:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], WORK_ADDRESS, WORK_ADDRESS_STRING_SIZE); + PayloadSize += WORK_ADDRESS_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkAddress, strlen(pVcardStruct->WorkAddress)); + PayloadSize += strlen(pVcardStruct->WorkAddress); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Org != '\0') { + + /* "ORG:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], ORG, ORG_STRING_SIZE); + PayloadSize += ORG_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Org, strlen(pVcardStruct->Org)); + PayloadSize += strlen(pVcardStruct->Org); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Title != '\0') { + /* "TITLE:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], TITLE, TITLE_STRING_SIZE); + PayloadSize += TITLE_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Title, strlen(pVcardStruct->Title)); + PayloadSize += strlen(pVcardStruct->Title); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Url != '\0') { + /* "URL:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], URL, URL_STRING_SIZE); + PayloadSize += URL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Url, strlen(pVcardStruct->Url)); + PayloadSize += strlen(pVcardStruct->Url); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + + /* "END:VCARD\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], VCARD_END, VCARD_END_STRING_SIZE); + PayloadSize += VCARD_END_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], VCARD, VCARD_STRING_SIZE); + PayloadSize += VCARD_STRING_SIZE; + // memcpy( &pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE ); + // PayloadSize += LIMIT_STRING_SIZE; + + *size = (uint16_t)(PayloadSize); /* Must not count the 2 byte that represent the NDEF size */ + /* + PayloadSize -= 6 + VCARD_TYPE_STRING_LENGTH; + + pNDEFMessage[2] = (PayloadSize & 0xFF000000) >> 24; + pNDEFMessage[3] = (PayloadSize & 0x00FF0000) >> 16; + pNDEFMessage[4] = (PayloadSize & 0x0000FF00) >> 8; + pNDEFMessage[5] = PayloadSize & 0x000000FF; + */ } @@ -487,37 +487,37 @@ void NDEF::NDEF_PrepareVcardMessage(sVcardInfo *pVcardStruct, uint8_t *pNDEFMess */ static uint8_t *from_base64(uint8_t *input64, uint32_t *binary) { - /* Read 4 base64 character & translate them into 3 bytes binary */ - *binary = 0; - uint8_t base64_6bits; - int i = 0; - while (i < 4) { - - if ((*input64 >= 'A') && (*input64 <= 'Z')) { - base64_6bits = *(input64++) - 'A'; - } else if ((*input64 >= 'a') && (*input64 <= 'z')) { - base64_6bits = *(input64++) - 'a' + 26; - } else if ((*input64 >= '0') && (*input64 <= '9')) { - base64_6bits = *(input64++) - '0' + 52; - } else if (*input64 == '+') { - base64_6bits = 62; - input64++; - } else if (*input64 == '/') { - base64_6bits = 63; - input64++; - } else if (*input64 == '=') { - base64_6bits = 0; - input64++; - } else { - input64++; - continue; + /* Read 4 base64 character & translate them into 3 bytes binary */ + *binary = 0; + uint8_t base64_6bits; + int i = 0; + while (i < 4) { + + if ((*input64 >= 'A') && (*input64 <= 'Z')) { + base64_6bits = *(input64++) - 'A'; + } else if ((*input64 >= 'a') && (*input64 <= 'z')) { + base64_6bits = *(input64++) - 'a' + 26; + } else if ((*input64 >= '0') && (*input64 <= '9')) { + base64_6bits = *(input64++) - '0' + 52; + } else if (*input64 == '+') { + base64_6bits = 62; + input64++; + } else if (*input64 == '/') { + base64_6bits = 63; + input64++; + } else if (*input64 == '=') { + base64_6bits = 0; + input64++; + } else { + input64++; + continue; + } + + *binary |= base64_6bits << (6 * (3 - i)); + i++; } - - *binary |= base64_6bits << (6 * (3 - i)); - i++; - } - *binary = ((*binary & 0xFF0000) >> 16) | ((*binary & 0xFF) << 16) | (*binary & 0xFF00); - return input64; + *binary = ((*binary & 0xFF0000) >> 16) | ((*binary & 0xFF) << 16) | (*binary & 0xFF00); + return input64; } @@ -529,41 +529,41 @@ static uint8_t *from_base64(uint8_t *input64, uint32_t *binary) */ int NDEF::NDEF_getVcardPicture(uint8_t *pPayload, uint32_t PayloadSize, uint8_t *pPict) { - uint8_t *pSrcPict; + uint8_t *pSrcPict; - /* Let's find the picture */ - pSrcPict = pPayload; - while (memcmp(pSrcPict, JPEG, JPEG_STRING_SIZE) && (pSrcPict < (pPayload + PayloadSize))) { - pSrcPict++; - } - while ((*pSrcPict != ':') && (pSrcPict < (pPayload + PayloadSize))) { + /* Let's find the picture */ + pSrcPict = pPayload; + while (memcmp(pSrcPict, JPEG, JPEG_STRING_SIZE) && (pSrcPict < (pPayload + PayloadSize))) { + pSrcPict++; + } + while ((*pSrcPict != ':') && (pSrcPict < (pPayload + PayloadSize))) { + pSrcPict++; + } + /* Picture start at next char */ pSrcPict++; - } - /* Picture start at next char */ - pSrcPict++; - - - /* Word found */ - while (memcmp(pSrcPict, LIMIT, LIMIT_STRING_SIZE) && (pSrcPict < (pPayload + PayloadSize))) { - uint32_t binary24; - pSrcPict = from_base64(pSrcPict, &binary24); - /* copy the 3 bytes read from the base64 data */ - memcpy(pPict, &binary24, 3); - pPict += 3; - /* Ignore any line breaks */ - while (*pSrcPict == 0x0A) { - pSrcPict++; - } - } - - if (pSrcPict >= (pPayload + PayloadSize)) { - /* problem when parsing the picture */ - return 1; - } else { - /* picture found */ - return 0; - } + + + /* Word found */ + while (memcmp(pSrcPict, LIMIT, LIMIT_STRING_SIZE) && (pSrcPict < (pPayload + PayloadSize))) { + uint32_t binary24; + pSrcPict = from_base64(pSrcPict, &binary24); + /* copy the 3 bytes read from the base64 data */ + memcpy(pPict, &binary24, 3); + pPict += 3; + /* Ignore any line breaks */ + while (*pSrcPict == 0x0A) { + pSrcPict++; + } + } + + if (pSrcPict >= (pPayload + PayloadSize)) { + /* problem when parsing the picture */ + return 1; + } else { + /* picture found */ + return 0; + } } /** diff --git a/src/libNDEF/lib_NDEF_Vcard.h b/src/libNDEF/lib_NDEF_Vcard.h index be8a40d..7ee9b03 100755 --- a/src/libNDEF/lib_NDEF_Vcard.h +++ b/src/libNDEF/lib_NDEF_Vcard.h @@ -87,22 +87,22 @@ #define LIMIT_STRING_SIZE 2 typedef struct { - char Version [10]; - char Name[80]; - // TODO: rename FirstName into FormattedName - char FirstName[80]; - char Title[80]; - char Org[80]; - char HomeAddress[80]; - char WorkAddress[80]; - char Address[80]; - char HomeTel[40]; - char WorkTel[40]; - char CellTel[40]; - char HomeEmail[80]; - char WorkEmail[80]; - char Email[80]; - char Url[80]; + char Version [10]; + char Name[80]; + // TODO: rename FirstName into FormattedName + char FirstName[80]; + char Title[80]; + char Org[80]; + char HomeAddress[80]; + char WorkAddress[80]; + char Address[80]; + char HomeTel[40]; + char WorkTel[40]; + char CellTel[40]; + char HomeEmail[80]; + char WorkEmail[80]; + char Email[80]; + char Url[80]; } sVcardInfo; #endif /* __LIB_NDEF_VCARD_H */ diff --git a/src/libNDEF/lib_NDEF_Wifi.cpp b/src/libNDEF/lib_NDEF_Wifi.cpp index edc0ea8..143a6e1 100755 --- a/src/libNDEF/lib_NDEF_Wifi.cpp +++ b/src/libNDEF/lib_NDEF_Wifi.cpp @@ -105,55 +105,55 @@ */ void NDEF::NDEF_FillWifiTokenStruct(uint8_t *pPayload, uint32_t PayloadSize, sWifiTokenInfo *pWifiTokenStruct) { - uint8_t *pLastByteAdd, data1, data2, *temp, *temp_br ; - uint16_t SSIDLen, NetWorkKeyLen; - uint8_t *dbg, dbg1; - - - pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); - pPayload--; - - while (pPayload++ != pLastByteAdd) { - uint8_t attribute = *pPayload; - temp_br = pPayload; - switch (attribute) { - - case ATTRIBUTE_ID_SSID_LSB: - temp = pPayload; - dbg = temp; - dbg1 = *++dbg; - if (dbg1 == ATTRIBUTE_ID_SSID_MSB) { - data1 = *++dbg; - data2 = *++dbg; - SSIDLen = data1; - SSIDLen = SSIDLen << 8; - SSIDLen |= data2; - pPayload += 4; - memcpy(pWifiTokenStruct->NetworkSSID, pPayload, SSIDLen); - /* add end of string character */ - pWifiTokenStruct->NetworkSSID[SSIDLen] = '\0'; - pPayload += SSIDLen - 1; - } else if (dbg1 == ATTRIBUTE_ID_NETWORK_MSB) { - data1 = *++dbg; - data2 = *++dbg; - NetWorkKeyLen = data1; - NetWorkKeyLen = NetWorkKeyLen << 8; - NetWorkKeyLen |= data2; - pPayload += 4; - memcpy(pWifiTokenStruct->NetworkKey, pPayload, NetWorkKeyLen); - /* add end of string character */ - pWifiTokenStruct->NetworkKey[NetWorkKeyLen] = '\0'; - pPayload += NetWorkKeyLen - 1; - } else { - pPayload = temp_br; + uint8_t *pLastByteAdd, data1, data2, *temp, *temp_br ; + uint16_t SSIDLen, NetWorkKeyLen; + uint8_t *dbg, dbg1; + + + pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); + pPayload--; + + while (pPayload++ != pLastByteAdd) { + uint8_t attribute = *pPayload; + temp_br = pPayload; + switch (attribute) { + + case ATTRIBUTE_ID_SSID_LSB: + temp = pPayload; + dbg = temp; + dbg1 = *++dbg; + if (dbg1 == ATTRIBUTE_ID_SSID_MSB) { + data1 = *++dbg; + data2 = *++dbg; + SSIDLen = data1; + SSIDLen = SSIDLen << 8; + SSIDLen |= data2; + pPayload += 4; + memcpy(pWifiTokenStruct->NetworkSSID, pPayload, SSIDLen); + /* add end of string character */ + pWifiTokenStruct->NetworkSSID[SSIDLen] = '\0'; + pPayload += SSIDLen - 1; + } else if (dbg1 == ATTRIBUTE_ID_NETWORK_MSB) { + data1 = *++dbg; + data2 = *++dbg; + NetWorkKeyLen = data1; + NetWorkKeyLen = NetWorkKeyLen << 8; + NetWorkKeyLen |= data2; + pPayload += 4; + memcpy(pWifiTokenStruct->NetworkKey, pPayload, NetWorkKeyLen); + /* add end of string character */ + pWifiTokenStruct->NetworkKey[NetWorkKeyLen] = '\0'; + pPayload += NetWorkKeyLen - 1; + } else { + pPayload = temp_br; + } + + break; + + default : + ; } - - break; - - default : - ; } - } } @@ -165,17 +165,17 @@ void NDEF::NDEF_FillWifiTokenStruct(uint8_t *pPayload, uint32_t PayloadSize, sWi */ void NDEF::NDEF_Read_WifiToken(struct sRecordInfo *pRecordStruct, sWifiTokenInfo *pWifiTokenStruct) { - uint8_t *pPayload; - uint32_t PayloadSize; + uint8_t *pPayload; + uint32_t PayloadSize; - PayloadSize = pRecordStruct->PayloadLength; + PayloadSize = pRecordStruct->PayloadLength; - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - if (pRecordStruct->NDEF_Type == URI_WIFITOKEN_TYPE) { - NDEF_FillWifiTokenStruct(pPayload, PayloadSize, pWifiTokenStruct); - } + if (pRecordStruct->NDEF_Type == URI_WIFITOKEN_TYPE) { + NDEF_FillWifiTokenStruct(pPayload, PayloadSize, pWifiTokenStruct); + } } @@ -189,14 +189,14 @@ void NDEF::NDEF_Read_WifiToken(struct sRecordInfo *pRecordStruct, sWifiTokenInfo */ uint16_t NDEF::NDEF_ReadWifiToken(struct sRecordInfo *pRecordStruct, sWifiTokenInfo *pWifiTokenStruct) { - uint16_t status = NDEF_ERROR; + uint16_t status = NDEF_ERROR; - if (pRecordStruct->NDEF_Type == URI_WIFITOKEN_TYPE) { - NDEF_Read_WifiToken(pRecordStruct, pWifiTokenStruct); - status = NDEF_OK; - } + if (pRecordStruct->NDEF_Type == URI_WIFITOKEN_TYPE) { + NDEF_Read_WifiToken(pRecordStruct, pWifiTokenStruct); + status = NDEF_OK; + } - return status; + return status; } @@ -208,140 +208,144 @@ uint16_t NDEF::NDEF_ReadWifiToken(struct sRecordInfo *pRecordStruct, sWifiTokenI */ uint16_t NDEF::NDEF_WriteWifiToken(sWifiTokenInfo *pWifiTokenStruct) { - uint16_t status = NDEF_ERROR; - uint8_t *pPayload, initStage = 0; - uint16_t DataSize; - uint32_t PayloadSize, SSIDSize, SSIDKeySize; - - if (pWifiTokenStruct->NetworkKey[0] == '\0') { - /* Empty network key is not supported by Phones */ - strcpy(pWifiTokenStruct->NetworkKey, NDEF_WIFI_DEFAULT_NETWORK_KEY); - } - - uint8_t configToken1[] = {0x10, 0x4A, /* Attribute ID : Version*/ - 0x00, 0x01, /* Attribute ID Length*/ - 0x10, /* Version 1.0*/ - 0x10, 0x0E, /* Attribute ID Credential*/ - 0x00, 0x48, /* Attribute ID Length*/ - 0x10, 0x26, /* Attribute ID : Network Index*/ - 0x00, 0x01, /* Attribute Length*/ - 0x01, /* Index */ - 0x10, 0x45, /* Attribute ID :SSID*/ - - }; - - /* Fill SSID length + SSID between configToken1 and configToken3*/ - - uint8_t configToken3[] = {0x10, 0x03, /* Attribute ID :Authentication Type*/ - 0x00, 0x02, /* Attribute Length*/ - 0x00, 0x01, /* Attribute Type : Open*/ - 0x10, 0x0F, /* Attribute ID : Encryption Type*/ - 0x00, 0x02, /* Attribute Length*/ - 0x00, 0x01, /* Encryption Type : None*/ - 0x10, 0x27 - }; /* Attribute ID : Network Key */ - - - /*Fill SSID KEY Length and SSID Key between configToken3 and configToken5*/ - - uint8_t configToken5[] = {0x10, 0x20, /* Attribute ID : MAC Address */ - 0x00, 0x06, /* Attribute Length*/ - 0, /*MAC-ADDRESS*/ - 0, /*MAC-ADDRESS*/ - 0, /*MAC-ADDRESS*/ - 0, /*MAC-ADDRESS*/ - 0, /*MAC-ADDRESS*/ - 0, /*MAC-ADDRESS*/ - 0x10, 0x49, /* Attribute ID : Vendor Extension */ - 0x00, 0x06, /* Attribute Length*/ - 0x00, 0x37, 0x2A, /* Vendor ID:WFA*/ - 0x02, /* Subelement ID:Network Key Shareable*/ - 0x01, /* Subelement Length*/ - 0x01, /*Network Key Shareable : TRUE*/ - 0x10, 0x49, /* Attribute ID : Vendor Extension */ - 0x00, 0x06, /* Attribute Length*/ - 0x00, 0x37, 0x2A, /* Vendor ID:WFA*/ - 0x00, /* Subelement ID:Version2*/ - 0x01, /* Subelement Length:1*/ - 0x20 /* Version2*/ - }; - - - /* Set size of the tokens */ - const uint32_t CONFIG_TOKEN_1 = sizeof(configToken1); - const uint32_t CONFIG_TOKEN_3 = sizeof(configToken3); - const uint32_t CONFIG_TOKEN_5 = sizeof(configToken5); - - /* Update Token3 for Authentication & Encryption Types, their default value is coded in token3 */ - configToken3[CONFIG_TOKEN_3_AUTHENTICATION_TYPE_INDEX] = pWifiTokenStruct->AuthenticationType & 0xFF; - configToken3[CONFIG_TOKEN_3_ENCRYPTION_TYPE_INDEX] = pWifiTokenStruct->EncryptionType & 0xFF; - - /* fill Wifi record header */ - NDEF_Buffer[FIRST_RECORD_OFFSET] = 0xD2; /* Record Flag */ - NDEF_Buffer[FIRST_RECORD_OFFSET + 1] = WIFITOKEN_TYPE_STRING_LENGTH; - NDEF_Buffer[FIRST_RECORD_OFFSET + 2] = 76; /* needs to be autocalculated - done at the end */ - - memcpy(&NDEF_Buffer[FIRST_RECORD_OFFSET + 3], WIFITOKEN_TYPE_STRING, WIFITOKEN_TYPE_STRING_LENGTH); - - pPayload = &NDEF_Buffer[FIRST_RECORD_OFFSET + 3 + WIFITOKEN_TYPE_STRING_LENGTH]; - PayloadSize = 0; - - /* Compute credential length */ - - uint16_t credential_length = 5 + // Network index - 4 + // SSID type + length - strlen(pWifiTokenStruct->NetworkSSID) + // SSID - CONFIG_TOKEN_3 + - 2 + // Network key length - strlen(pWifiTokenStruct->NetworkKey) + // Network KEY - CONFIG_TOKEN_5; - - /* update credential length */ - configToken1[CONFIG_TOKEN_1_CREDENTIAL_LENGTH_INDEX + 1] = credential_length & 0xff; - configToken1[CONFIG_TOKEN_1_CREDENTIAL_LENGTH_INDEX] = credential_length >> 8; - - - for (initStage = 0; initStage < CONFIG_TOKEN_1; initStage++) { - *pPayload = configToken1[initStage]; - pPayload++; - } - - /*Fill SSID length and SSID value*/ - SSIDSize = strlen(pWifiTokenStruct->NetworkSSID); - *pPayload = 0x00; pPayload++; - *pPayload = SSIDSize & 0x000000FF; pPayload++; + uint16_t status = NDEF_ERROR; + uint8_t *pPayload, initStage = 0; + uint16_t DataSize; + uint32_t PayloadSize, SSIDSize, SSIDKeySize; + + if (pWifiTokenStruct->NetworkKey[0] == '\0') { + /* Empty network key is not supported by Phones */ + strcpy(pWifiTokenStruct->NetworkKey, NDEF_WIFI_DEFAULT_NETWORK_KEY); + } - strcpy((char *)pPayload, pWifiTokenStruct->NetworkSSID); - pPayload = pPayload + strlen(pWifiTokenStruct->NetworkSSID); + uint8_t configToken1[] = {0x10, 0x4A, /* Attribute ID : Version*/ + 0x00, 0x01, /* Attribute ID Length*/ + 0x10, /* Version 1.0*/ + 0x10, 0x0E, /* Attribute ID Credential*/ + 0x00, 0x48, /* Attribute ID Length*/ + 0x10, 0x26, /* Attribute ID : Network Index*/ + 0x00, 0x01, /* Attribute Length*/ + 0x01, /* Index */ + 0x10, 0x45, /* Attribute ID :SSID*/ + + }; + + /* Fill SSID length + SSID between configToken1 and configToken3*/ + + uint8_t configToken3[] = {0x10, 0x03, /* Attribute ID :Authentication Type*/ + 0x00, 0x02, /* Attribute Length*/ + 0x00, 0x01, /* Attribute Type : Open*/ + 0x10, 0x0F, /* Attribute ID : Encryption Type*/ + 0x00, 0x02, /* Attribute Length*/ + 0x00, 0x01, /* Encryption Type : None*/ + 0x10, 0x27 + }; /* Attribute ID : Network Key */ + + + /*Fill SSID KEY Length and SSID Key between configToken3 and configToken5*/ + + uint8_t configToken5[] = {0x10, 0x20, /* Attribute ID : MAC Address */ + 0x00, 0x06, /* Attribute Length*/ + 0, /*MAC-ADDRESS*/ + 0, /*MAC-ADDRESS*/ + 0, /*MAC-ADDRESS*/ + 0, /*MAC-ADDRESS*/ + 0, /*MAC-ADDRESS*/ + 0, /*MAC-ADDRESS*/ + 0x10, 0x49, /* Attribute ID : Vendor Extension */ + 0x00, 0x06, /* Attribute Length*/ + 0x00, 0x37, 0x2A, /* Vendor ID:WFA*/ + 0x02, /* Subelement ID:Network Key Shareable*/ + 0x01, /* Subelement Length*/ + 0x01, /*Network Key Shareable : TRUE*/ + 0x10, 0x49, /* Attribute ID : Vendor Extension */ + 0x00, 0x06, /* Attribute Length*/ + 0x00, 0x37, 0x2A, /* Vendor ID:WFA*/ + 0x00, /* Subelement ID:Version2*/ + 0x01, /* Subelement Length:1*/ + 0x20 /* Version2*/ + }; + + + /* Set size of the tokens */ + const uint32_t CONFIG_TOKEN_1 = sizeof(configToken1); + const uint32_t CONFIG_TOKEN_3 = sizeof(configToken3); + const uint32_t CONFIG_TOKEN_5 = sizeof(configToken5); + + /* Update Token3 for Authentication & Encryption Types, their default value is coded in token3 */ + configToken3[CONFIG_TOKEN_3_AUTHENTICATION_TYPE_INDEX] = pWifiTokenStruct->AuthenticationType & 0xFF; + configToken3[CONFIG_TOKEN_3_ENCRYPTION_TYPE_INDEX] = pWifiTokenStruct->EncryptionType & 0xFF; + + /* fill Wifi record header */ + NDEF_Buffer[FIRST_RECORD_OFFSET] = 0xD2; /* Record Flag */ + NDEF_Buffer[FIRST_RECORD_OFFSET + 1] = WIFITOKEN_TYPE_STRING_LENGTH; + NDEF_Buffer[FIRST_RECORD_OFFSET + 2] = 76; /* needs to be autocalculated - done at the end */ + + memcpy(&NDEF_Buffer[FIRST_RECORD_OFFSET + 3], WIFITOKEN_TYPE_STRING, WIFITOKEN_TYPE_STRING_LENGTH); + + pPayload = &NDEF_Buffer[FIRST_RECORD_OFFSET + 3 + WIFITOKEN_TYPE_STRING_LENGTH]; + PayloadSize = 0; + + /* Compute credential length */ + + uint16_t credential_length = 5 + // Network index + 4 + // SSID type + length + strlen(pWifiTokenStruct->NetworkSSID) + // SSID + CONFIG_TOKEN_3 + + 2 + // Network key length + strlen(pWifiTokenStruct->NetworkKey) + // Network KEY + CONFIG_TOKEN_5; + + /* update credential length */ + configToken1[CONFIG_TOKEN_1_CREDENTIAL_LENGTH_INDEX + 1] = credential_length & 0xff; + configToken1[CONFIG_TOKEN_1_CREDENTIAL_LENGTH_INDEX] = credential_length >> 8; + + + for (initStage = 0; initStage < CONFIG_TOKEN_1; initStage++) { + *pPayload = configToken1[initStage]; + pPayload++; + } - for (initStage = 0; initStage < CONFIG_TOKEN_3; initStage++) { - *pPayload = configToken3[initStage]; + /*Fill SSID length and SSID value*/ + SSIDSize = strlen(pWifiTokenStruct->NetworkSSID); + *pPayload = 0x00; + pPayload++; + *pPayload = SSIDSize & 0x000000FF; pPayload++; - } - /* Fill the SSIDKey length and SSIDKey value */ - SSIDKeySize = strlen(pWifiTokenStruct->NetworkKey); - *pPayload = 0x00; pPayload++; - *pPayload = SSIDKeySize & 0x000000FF; pPayload++; + strcpy((char *)pPayload, pWifiTokenStruct->NetworkSSID); + pPayload = pPayload + strlen(pWifiTokenStruct->NetworkSSID); - memcpy((char *)pPayload, pWifiTokenStruct->NetworkKey, SSIDKeySize); - pPayload = pPayload + SSIDKeySize; + for (initStage = 0; initStage < CONFIG_TOKEN_3; initStage++) { + *pPayload = configToken3[initStage]; + pPayload++; + } - for (initStage = 0; initStage < CONFIG_TOKEN_5; initStage++) { - *pPayload = configToken5[initStage]; + /* Fill the SSIDKey length and SSIDKey value */ + SSIDKeySize = strlen(pWifiTokenStruct->NetworkKey); + *pPayload = 0x00; + pPayload++; + *pPayload = SSIDKeySize & 0x000000FF; pPayload++; - } - PayloadSize += CONFIG_TOKEN_1 + CONFIG_TOKEN_3 + CONFIG_TOKEN_5 + SSIDSize + SSIDKeySize + 4 ; // +4 is for SSID & Key length fields + memcpy((char *)pPayload, pWifiTokenStruct->NetworkKey, SSIDKeySize); + pPayload = pPayload + SSIDKeySize; + + for (initStage = 0; initStage < CONFIG_TOKEN_5; initStage++) { + *pPayload = configToken5[initStage]; + pPayload++; + } + + PayloadSize += CONFIG_TOKEN_1 + CONFIG_TOKEN_3 + CONFIG_TOKEN_5 + SSIDSize + SSIDKeySize + 4 ; // +4 is for SSID & Key length fields - NDEF_Buffer[FIRST_RECORD_OFFSET + 2] = (PayloadSize & 0x000000FF); + NDEF_Buffer[FIRST_RECORD_OFFSET + 2] = (PayloadSize & 0x000000FF); - DataSize = PayloadSize + 3 + WIFITOKEN_TYPE_STRING_LENGTH; + DataSize = PayloadSize + 3 + WIFITOKEN_TYPE_STRING_LENGTH; - /* Write NDEF */ - status = NDEF_WriteNDEF(DataSize, NDEF_Buffer); + /* Write NDEF */ + status = NDEF_WriteNDEF(DataSize, NDEF_Buffer); - return status; + return status; } diff --git a/src/libNDEF/lib_NDEF_Wifi.h b/src/libNDEF/lib_NDEF_Wifi.h index 71f2dd6..683f99f 100755 --- a/src/libNDEF/lib_NDEF_Wifi.h +++ b/src/libNDEF/lib_NDEF_Wifi.h @@ -70,29 +70,29 @@ #define NDEF_WIFI_DEFAULT_NETWORK_KEY "00000000" typedef enum { - NDEF_WIFI_ENCRYPTION_NONE = 0x0001, /**< WPS No Encryption */ - NDEF_WIFI_ENCRYPTION_WEP = 0x0002, /**< WPS Encryption based on WEP */ - NDEF_WIFI_ENCRYPTION_TKIP = 0x0004, /**< WPS Encryption based on TKIP */ - NDEF_WIFI_ENCRYPTION_AES = 0x0008 /**< WPS Encryption based on AES */ + NDEF_WIFI_ENCRYPTION_NONE = 0x0001, /**< WPS No Encryption */ + NDEF_WIFI_ENCRYPTION_WEP = 0x0002, /**< WPS Encryption based on WEP */ + NDEF_WIFI_ENCRYPTION_TKIP = 0x0004, /**< WPS Encryption based on TKIP */ + NDEF_WIFI_ENCRYPTION_AES = 0x0008 /**< WPS Encryption based on AES */ } Ndef_Wifi_Encryption_t; typedef enum { - NDEF_WIFI_AUTHENTICATION_NONE = 0x0001, /**< WPS No Authentication */ - NDEF_WIFI_AUTHENTICATION_WPAPSK = 0x0002, /**< WPS Authentication based on WPAPSK */ - NDEF_WIFI_AUTHENTICATION_SHARED = 0x0004, /**< WPS Authentication based on WEP Shared Key */ - NDEF_WIFI_AUTHENTICATION_WPA = 0x0008, /**< WPS Authentication based on WPA */ - NDEF_WIFI_AUTHENTICATION_WPA2 = 0x0010, /**< WPS Authentication based on WPA2 */ - NDEF_WIFI_AUTHENTICATION_WPA2PSK = 0x0020 /**< WPS Authentication based on WPA2PSK */ + NDEF_WIFI_AUTHENTICATION_NONE = 0x0001, /**< WPS No Authentication */ + NDEF_WIFI_AUTHENTICATION_WPAPSK = 0x0002, /**< WPS Authentication based on WPAPSK */ + NDEF_WIFI_AUTHENTICATION_SHARED = 0x0004, /**< WPS Authentication based on WEP Shared Key */ + NDEF_WIFI_AUTHENTICATION_WPA = 0x0008, /**< WPS Authentication based on WPA */ + NDEF_WIFI_AUTHENTICATION_WPA2 = 0x0010, /**< WPS Authentication based on WPA2 */ + NDEF_WIFI_AUTHENTICATION_WPA2PSK = 0x0020 /**< WPS Authentication based on WPA2PSK */ } Ndef_Wifi_Authentication_t; /** * @brief WifiToken structure, to store Network SSID, Authentication Type, Encryption Type and Network Key. */ typedef struct { - char NetworkSSID[32]; /**< Store the Network SSID. */ - Ndef_Wifi_Authentication_t AuthenticationType; /**< Store the Authentication type to be used. */ - Ndef_Wifi_Encryption_t EncryptionType; /**< Store the Encryption to be used. */ - char NetworkKey[32]; /**< Store the Network Key. */ + char NetworkSSID[32]; /**< Store the Network SSID. */ + Ndef_Wifi_Authentication_t AuthenticationType; /**< Store the Authentication type to be used. */ + Ndef_Wifi_Encryption_t EncryptionType; /**< Store the Encryption to be used. */ + char NetworkKey[32]; /**< Store the Network Key. */ } sWifiTokenInfo; diff --git a/src/libNDEF/tagtype5_wrapper.cpp b/src/libNDEF/tagtype5_wrapper.cpp index c366ccb..b725f06 100755 --- a/src/libNDEF/tagtype5_wrapper.cpp +++ b/src/libNDEF/tagtype5_wrapper.cpp @@ -80,7 +80,7 @@ */ uint16_t NDEF::NfcTag_ReadNDEF(uint8_t *pData) { - return NfcTag_ReadNDEF(pData, NDEF_MAX_SIZE); + return NfcTag_ReadNDEF(pData, NDEF_MAX_SIZE); } /** @@ -93,50 +93,50 @@ uint16_t NDEF::NfcTag_ReadNDEF(uint8_t *pData) */ uint16_t NDEF::NfcTag_ReadNDEF(uint8_t *pData, uint16_t bufferLength) { - uint16_t status = NDEF_ERROR; - TT5_TLV_t tlv; - uint8_t tlv_size = 0; - uint16_t DataLength; - - /* Detect NDEF message in memory */ - status = NfcType5_NDEFDetection(); - if (status != NDEF_OK) { - return status; - } - - /* Read TL of Type 5 */ - status = mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)); - if (status != NDEF_OK) { - return status; - } - - /* Check if L is on 3 or 1 byte and update length in buffer */ - if (tlv.Length == NFCT5_3_BYTES_L_TLV) { - tlv_size = 4; - DataLength = ((tlv.Length16 >> 8) & 0xff) | ((tlv.Length16 & 0xff) << 8); - } else { - tlv_size = 2; - DataLength = tlv.Length; - } - - /* If too many data to write return error */ - if (DataLength > bufferLength) { - return NDEF_ERROR_MEMORY_INTERNAL; - } - - /* Check CC file is in the correct mode to proceed */ - if (CCFileStruct.State == TT5_INITIALIZED) { - return NDEF_ERROR; - } - - if (DataLength > 0) { - /* Read NDEF */ - if (mydev->ST25DV_i2c_ReadData((pData), CCFileStruct.NDEF_offset + tlv_size, DataLength) != NFCTAG_OK) { - return NDEF_ERROR; + uint16_t status = NDEF_ERROR; + TT5_TLV_t tlv; + uint8_t tlv_size = 0; + uint16_t DataLength; + + /* Detect NDEF message in memory */ + status = NfcType5_NDEFDetection(); + if (status != NDEF_OK) { + return status; } - } - return NDEF_OK; + /* Read TL of Type 5 */ + status = mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)); + if (status != NDEF_OK) { + return status; + } + + /* Check if L is on 3 or 1 byte and update length in buffer */ + if (tlv.Length == NFCT5_3_BYTES_L_TLV) { + tlv_size = 4; + DataLength = ((tlv.Length16 >> 8) & 0xff) | ((tlv.Length16 & 0xff) << 8); + } else { + tlv_size = 2; + DataLength = tlv.Length; + } + + /* If too many data to write return error */ + if (DataLength > bufferLength) { + return NDEF_ERROR_MEMORY_INTERNAL; + } + + /* Check CC file is in the correct mode to proceed */ + if (CCFileStruct.State == TT5_INITIALIZED) { + return NDEF_ERROR; + } + + if (DataLength > 0) { + /* Read NDEF */ + if (mydev->ST25DV_i2c_ReadData((pData), CCFileStruct.NDEF_offset + tlv_size, DataLength) != NFCTAG_OK) { + return NDEF_ERROR; + } + } + + return NDEF_OK; } /** @@ -151,63 +151,63 @@ uint16_t NDEF::NfcTag_ReadNDEF(uint8_t *pData, uint16_t bufferLength) */ uint16_t NDEF::NfcTag_WriteData(uint8_t Type, uint16_t Length, uint8_t *pData) { - TT5_TLV_t tlv; - uint8_t tlv_size; - uint32_t offset; - uint8_t NfcT5_Terminator = NFCT5_TERMINATOR_TLV; - ST25DV_MEM_SIZE mem_size_reg; - - if (mydev->ST25DV_i2c_ReadMemSize(&mem_size_reg) != NDEF_OK) { - return NDEF_ERROR; - } - uint32_t mem_size = (mem_size_reg.BlockSize + 1) * (mem_size_reg.Mem_Size + 1); - - uint32_t max_length = mem_size /* Memory size */ - - ((Length >= 0xFF) ? 4 : 2) /* - TLV length */ - - sizeof(NfcT5_Terminator) /* - Terminator TLV */ - - CCFileStruct.NDEF_offset; /* - CCfile length */ - - /* If too many data to write return error */ - if (Length > max_length) { - return NDEF_ERROR_MEMORY_TAG; - } - - /* Detect NDEF message in memory */ - if (NfcType5_NDEFDetection() != NDEF_OK) { - return NDEF_ERROR; - } - - /* Prepare TLV */ - tlv.Type = Type; - if (Length >= 0xFF) { - tlv.Length = NFCT5_3_BYTES_L_TLV; - tlv.Length16 = ((Length & 0xff) << 8) | ((Length >> 8) & 0xff) ; - tlv_size = 4; - - } else { - tlv.Length = Length; - tlv_size = 2; - } - - offset = CCFileStruct.NDEF_offset; - /* Start write TLV to EEPROM */ - if (mydev->ST25DV_i2c_WriteData((uint8_t *)&tlv, offset, tlv_size) != NFCTAG_OK) { - return NDEF_ERROR; - } - offset += tlv_size; - - /* Continue write TLV data to EEPROM */ - if (mydev->ST25DV_i2c_WriteData(pData, offset, Length) != NFCTAG_OK) { - return NDEF_ERROR; - } - offset += Length; - - /* Write Terminator TLV */ - if (mydev->ST25DV_i2c_WriteData(&NfcT5_Terminator, offset, sizeof(NfcT5_Terminator)) != NFCTAG_OK) { - return NDEF_ERROR; - } - - return NDEF_OK; + TT5_TLV_t tlv; + uint8_t tlv_size; + uint32_t offset; + uint8_t NfcT5_Terminator = NFCT5_TERMINATOR_TLV; + ST25DV_MEM_SIZE mem_size_reg; + + if (mydev->ST25DV_i2c_ReadMemSize(&mem_size_reg) != NDEF_OK) { + return NDEF_ERROR; + } + uint32_t mem_size = (mem_size_reg.BlockSize + 1) * (mem_size_reg.Mem_Size + 1); + + uint32_t max_length = mem_size /* Memory size */ + - ((Length >= 0xFF) ? 4 : 2) /* - TLV length */ + - sizeof(NfcT5_Terminator) /* - Terminator TLV */ + - CCFileStruct.NDEF_offset; /* - CCfile length */ + + /* If too many data to write return error */ + if (Length > max_length) { + return NDEF_ERROR_MEMORY_TAG; + } + + /* Detect NDEF message in memory */ + if (NfcType5_NDEFDetection() != NDEF_OK) { + return NDEF_ERROR; + } + + /* Prepare TLV */ + tlv.Type = Type; + if (Length >= 0xFF) { + tlv.Length = NFCT5_3_BYTES_L_TLV; + tlv.Length16 = ((Length & 0xff) << 8) | ((Length >> 8) & 0xff) ; + tlv_size = 4; + + } else { + tlv.Length = Length; + tlv_size = 2; + } + + offset = CCFileStruct.NDEF_offset; + /* Start write TLV to EEPROM */ + if (mydev->ST25DV_i2c_WriteData((uint8_t *)&tlv, offset, tlv_size) != NFCTAG_OK) { + return NDEF_ERROR; + } + offset += tlv_size; + + /* Continue write TLV data to EEPROM */ + if (mydev->ST25DV_i2c_WriteData(pData, offset, Length) != NFCTAG_OK) { + return NDEF_ERROR; + } + offset += Length; + + /* Write Terminator TLV */ + if (mydev->ST25DV_i2c_WriteData(&NfcT5_Terminator, offset, sizeof(NfcT5_Terminator)) != NFCTAG_OK) { + return NDEF_ERROR; + } + + return NDEF_OK; } @@ -222,7 +222,7 @@ uint16_t NDEF::NfcTag_WriteData(uint8_t Type, uint16_t Length, uint8_t *pData) */ uint16_t NDEF::NfcTag_WriteNDEF(uint16_t Length, uint8_t *pData) { - return NfcTag_WriteData(NFCT5_NDEF_MSG_TLV, Length, pData); + return NfcTag_WriteData(NFCT5_NDEF_MSG_TLV, Length, pData); } /** @@ -236,7 +236,7 @@ uint16_t NDEF::NfcTag_WriteNDEF(uint16_t Length, uint8_t *pData) */ uint16_t NDEF::NfcTag_WriteProprietary(uint16_t Length, uint8_t *pData) { - return NfcTag_WriteData(NFCT5_PROPRIETARY_TLV, Length, pData); + return NfcTag_WriteData(NFCT5_PROPRIETARY_TLV, Length, pData); } @@ -248,21 +248,21 @@ uint16_t NDEF::NfcTag_WriteProprietary(uint16_t Length, uint8_t *pData) */ uint16_t NDEF::NfcType5_WriteCCFile(const uint8_t *const pCCBuffer) { - NFCTAG_StatusTypeDef ret_value; + NFCTAG_StatusTypeDef ret_value; - /* Write first block of CCFile */ - ret_value = mydev->ST25DV_i2c_WriteData(pCCBuffer, 0x00, 0x4); + /* Write first block of CCFile */ + ret_value = mydev->ST25DV_i2c_WriteData(pCCBuffer, 0x00, 0x4); - /* If extended memory writes the next 4 bytes */ - if ((pCCBuffer[2] == 0x00) && (ret_value == NFCTAG_OK)) { - ret_value = mydev->ST25DV_i2c_WriteData(pCCBuffer + 4, 0x04, 4); - } + /* If extended memory writes the next 4 bytes */ + if ((pCCBuffer[2] == 0x00) && (ret_value == NFCTAG_OK)) { + ret_value = mydev->ST25DV_i2c_WriteData(pCCBuffer + 4, 0x04, 4); + } - if (ret_value != NFCTAG_OK) { - return NDEF_ERROR; - } + if (ret_value != NFCTAG_OK) { + return NDEF_ERROR; + } - return NDEF_OK; + return NDEF_OK; } /** @@ -273,21 +273,21 @@ uint16_t NDEF::NfcType5_WriteCCFile(const uint8_t *const pCCBuffer) */ uint16_t NDEF::NfcType5_ReadCCFile(uint8_t *const pCCBuffer) { - NFCTAG_StatusTypeDef ret_value; + NFCTAG_StatusTypeDef ret_value; - /* Read 4 bytes of CC File */ - ret_value = mydev->ST25DV_i2c_ReadData(pCCBuffer, 0x00, 4); + /* Read 4 bytes of CC File */ + ret_value = mydev->ST25DV_i2c_ReadData(pCCBuffer, 0x00, 4); - /* If extended memory reads the next 4 bytes */ - if ((pCCBuffer[2] == 0x00) && (ret_value == NFCTAG_OK)) { - ret_value = mydev->ST25DV_i2c_ReadData(pCCBuffer + 4, 0x04, 4); - } + /* If extended memory reads the next 4 bytes */ + if ((pCCBuffer[2] == 0x00) && (ret_value == NFCTAG_OK)) { + ret_value = mydev->ST25DV_i2c_ReadData(pCCBuffer + 4, 0x04, 4); + } - if (ret_value != NFCTAG_OK) { - return NDEF_ERROR; - } + if (ret_value != NFCTAG_OK) { + return NDEF_ERROR; + } - return NDEF_OK; + return NDEF_OK; } /** @@ -298,47 +298,47 @@ uint16_t NDEF::NfcType5_ReadCCFile(uint8_t *const pCCBuffer) */ uint16_t NDEF::NfcType5_TT5Init(void) { - NFCTAG_StatusTypeDef ret_value = NFCTAG_OK; - uint16_t status; - uint8_t accbuffer[8]; - uint8_t cdata; - - /* Prepare buffer to update CCFile */ - accbuffer[0] = CCFileStruct.MagicNumber; - accbuffer[1] = CCFileStruct.Version; - accbuffer[2] = CCFileStruct.MemorySize; - accbuffer[3] = CCFileStruct.TT5Tag; - CCFileStruct.NDEF_offset = 0x04; - - /* If extended memory prepare the length bytes */ - if (CCFileStruct.MemorySize == NFCT5_EXTENDED_CCFILE) { - accbuffer[6] = (uint8_t)(CCFileStruct.ExtMemorySize >> 8); - accbuffer[7] = (uint8_t)(CCFileStruct.ExtMemorySize & 0xFF); - CCFileStruct.NDEF_offset = 0x08; - } - - /* Update CCFile */ - status = NfcType5_WriteCCFile(accbuffer); - if (status != NDEF_OK) { - return status; - } - - /* Update NDEF TLV for INITIALIZED state */ - /* Update T */ - cdata = NFCT5_NDEF_MSG_TLV; - ret_value = mydev->ST25DV_i2c_WriteData(&cdata, CCFileStruct.NDEF_offset, 1); - if (ret_value != NFCTAG_OK) { - return NDEF_ERROR; - } - - /* Update L */ - cdata = 0x00; - ret_value = mydev->ST25DV_i2c_WriteData(&cdata, (CCFileStruct.NDEF_offset + 1), 1); - if (ret_value != NFCTAG_OK) { - return NDEF_ERROR; - } - - return NDEF_OK; + NFCTAG_StatusTypeDef ret_value = NFCTAG_OK; + uint16_t status; + uint8_t accbuffer[8]; + uint8_t cdata; + + /* Prepare buffer to update CCFile */ + accbuffer[0] = CCFileStruct.MagicNumber; + accbuffer[1] = CCFileStruct.Version; + accbuffer[2] = CCFileStruct.MemorySize; + accbuffer[3] = CCFileStruct.TT5Tag; + CCFileStruct.NDEF_offset = 0x04; + + /* If extended memory prepare the length bytes */ + if (CCFileStruct.MemorySize == NFCT5_EXTENDED_CCFILE) { + accbuffer[6] = (uint8_t)(CCFileStruct.ExtMemorySize >> 8); + accbuffer[7] = (uint8_t)(CCFileStruct.ExtMemorySize & 0xFF); + CCFileStruct.NDEF_offset = 0x08; + } + + /* Update CCFile */ + status = NfcType5_WriteCCFile(accbuffer); + if (status != NDEF_OK) { + return status; + } + + /* Update NDEF TLV for INITIALIZED state */ + /* Update T */ + cdata = NFCT5_NDEF_MSG_TLV; + ret_value = mydev->ST25DV_i2c_WriteData(&cdata, CCFileStruct.NDEF_offset, 1); + if (ret_value != NFCTAG_OK) { + return NDEF_ERROR; + } + + /* Update L */ + cdata = 0x00; + ret_value = mydev->ST25DV_i2c_WriteData(&cdata, (CCFileStruct.NDEF_offset + 1), 1); + if (ret_value != NFCTAG_OK) { + return NDEF_ERROR; + } + + return NDEF_OK; } /** @@ -350,84 +350,84 @@ uint16_t NDEF::NfcType5_TT5Init(void) */ uint16_t NDEF::NfcType5_NDEFDetection(void) { - uint8_t acc_buffer[8]; - TT5_TLV_t tlv_detect; - uint16_t status; - uint32_t memory_size; - - CCFileStruct.State = TT5_NO_NDEF; + uint8_t acc_buffer[8]; + TT5_TLV_t tlv_detect; + uint16_t status; + uint32_t memory_size; - /* Read CCFile */ - status = NfcType5_ReadCCFile(acc_buffer); + CCFileStruct.State = TT5_NO_NDEF; - if (status != NDEF_OK) { - return status; - } + /* Read CCFile */ + status = NfcType5_ReadCCFile(acc_buffer); - /* Check Byte 0 is equal to magic number */ - if ((acc_buffer[0] != NFCT5_MAGICNUMBER_E1_CCFILE) && (acc_buffer[0] != NFCT5_MAGICNUMBER_E2_CCFILE)) { - return NDEF_ERROR_NOT_FORMATED; - } - /* Check Version number */ - else if (((acc_buffer[1] & 0xFC) != 0x40)) { - return NDEF_ERROR_NOT_FORMATED; - } + if (status != NDEF_OK) { + return status; + } - /* Check if CCFile is on 4 Bytes or 8 Bytes */ - if (acc_buffer[2] == 0x00) { - /* Update CCFIle structure */ - CCFileStruct.MemorySize = 0x0; - CCFileStruct.ExtMemorySize = (uint16_t)acc_buffer[6]; - CCFileStruct.ExtMemorySize = (CCFileStruct.ExtMemorySize << 8) | acc_buffer[7]; - memory_size = CCFileStruct.ExtMemorySize; - CCFileStruct.NDEF_offset = 8; - } else { - /* Update CCFIle structure */ - CCFileStruct.MemorySize = acc_buffer[2]; - CCFileStruct.ExtMemorySize = 0x0; - memory_size = CCFileStruct.MemorySize; - CCFileStruct.NDEF_offset = 4; - } - - /* Update CCFIle structure */ - CCFileStruct.MagicNumber = (TT5_MagicNumber_t)acc_buffer[0]; - CCFileStruct.Version = acc_buffer[1]; - CCFileStruct.TT5Tag = acc_buffer[3]; - - /* Search for position of NDEF TLV in memory and tag status */ - while ((mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv_detect, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)) == NFCTAG_OK) && (CCFileStruct.NDEF_offset < memory_size)) { - /* Detect first NDEF Message in memory */ - if (tlv_detect.Type == NFCT5_NDEF_MSG_TLV) { - if (tlv_detect.Length == 0x00) { - CCFileStruct.State = TT5_INITIALIZED; - } else { - if (CCFileStruct.Version & 0x3) { - CCFileStruct.State = TT5_READ; - } else { - CCFileStruct.State = TT5_READ_WRITE; - } - } - return NDEF_OK; + /* Check Byte 0 is equal to magic number */ + if ((acc_buffer[0] != NFCT5_MAGICNUMBER_E1_CCFILE) && (acc_buffer[0] != NFCT5_MAGICNUMBER_E2_CCFILE)) { + return NDEF_ERROR_NOT_FORMATED; } - /* If Proprietary NDEF jump to end of proprietary message */ - else if (tlv_detect.Type == NFCT5_PROPRIETARY_TLV) { - if (tlv_detect.Length == NFCT5_3_BYTES_L_TLV) { - CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + tlv_detect.Length16; - continue; - } else { - CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + tlv_detect.Length; - continue; - } + /* Check Version number */ + else if (((acc_buffer[1] & 0xFC) != 0x40)) { + return NDEF_ERROR_NOT_FORMATED; } - /* if Terminator no NDEF detected */ - else if (tlv_detect.Type == NFCT5_TERMINATOR_TLV) { - return NDEF_ERROR_NOT_FORMATED; + + /* Check if CCFile is on 4 Bytes or 8 Bytes */ + if (acc_buffer[2] == 0x00) { + /* Update CCFIle structure */ + CCFileStruct.MemorySize = 0x0; + CCFileStruct.ExtMemorySize = (uint16_t)acc_buffer[6]; + CCFileStruct.ExtMemorySize = (CCFileStruct.ExtMemorySize << 8) | acc_buffer[7]; + memory_size = CCFileStruct.ExtMemorySize; + CCFileStruct.NDEF_offset = 8; + } else { + /* Update CCFIle structure */ + CCFileStruct.MemorySize = acc_buffer[2]; + CCFileStruct.ExtMemorySize = 0x0; + memory_size = CCFileStruct.MemorySize; + CCFileStruct.NDEF_offset = 4; } - CCFileStruct.NDEF_offset++; - } + /* Update CCFIle structure */ + CCFileStruct.MagicNumber = (TT5_MagicNumber_t)acc_buffer[0]; + CCFileStruct.Version = acc_buffer[1]; + CCFileStruct.TT5Tag = acc_buffer[3]; + + /* Search for position of NDEF TLV in memory and tag status */ + while ((mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv_detect, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)) == NFCTAG_OK) && (CCFileStruct.NDEF_offset < memory_size)) { + /* Detect first NDEF Message in memory */ + if (tlv_detect.Type == NFCT5_NDEF_MSG_TLV) { + if (tlv_detect.Length == 0x00) { + CCFileStruct.State = TT5_INITIALIZED; + } else { + if (CCFileStruct.Version & 0x3) { + CCFileStruct.State = TT5_READ; + } else { + CCFileStruct.State = TT5_READ_WRITE; + } + } + return NDEF_OK; + } + /* If Proprietary NDEF jump to end of proprietary message */ + else if (tlv_detect.Type == NFCT5_PROPRIETARY_TLV) { + if (tlv_detect.Length == NFCT5_3_BYTES_L_TLV) { + CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + tlv_detect.Length16; + continue; + } else { + CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + tlv_detect.Length; + continue; + } + } + /* if Terminator no NDEF detected */ + else if (tlv_detect.Type == NFCT5_TERMINATOR_TLV) { + return NDEF_ERROR_NOT_FORMATED; + } + + CCFileStruct.NDEF_offset++; + } - return NDEF_ERROR_NOT_FORMATED; + return NDEF_ERROR_NOT_FORMATED; } @@ -442,28 +442,28 @@ uint16_t NDEF::NfcType5_NDEFDetection(void) uint16_t NDEF::NfcTag_GetLength(uint16_t *Length) { - uint16_t status = NDEF_ERROR; - TT5_TLV_t tlv; + uint16_t status = NDEF_ERROR; + TT5_TLV_t tlv; - /* Detect NDEF message in memory */ - status = NfcType5_NDEFDetection(); - if (status != NDEF_OK) { - return status; - } + /* Detect NDEF message in memory */ + status = NfcType5_NDEFDetection(); + if (status != NDEF_OK) { + return status; + } - /* Read TL of Type 5 */ - status = mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)); - if (status != NFCTAG_OK) { - return NDEF_ERROR; - } + /* Read TL of Type 5 */ + status = mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)); + if (status != NFCTAG_OK) { + return NDEF_ERROR; + } - if (tlv.Length != NFCT5_3_BYTES_L_TLV) { - *Length = tlv.Length; - } else { - *Length = ((tlv.Length16 >> 8) & 0xff) | ((tlv.Length16 & 0xff) << 8); - } + if (tlv.Length != NFCT5_3_BYTES_L_TLV) { + *Length = tlv.Length; + } else { + *Length = ((tlv.Length16 >> 8) & 0xff) | ((tlv.Length16 & 0xff) << 8); + } - return NDEF_OK; + return NDEF_OK; } diff --git a/src/libNDEF/tagtype5_wrapper.h b/src/libNDEF/tagtype5_wrapper.h index 5cb86af..075cdd5 100755 --- a/src/libNDEF/tagtype5_wrapper.h +++ b/src/libNDEF/tagtype5_wrapper.h @@ -44,9 +44,9 @@ /** @brief Type5 Tag Type-Length-Value structure as defined by the NFC Forum */ typedef struct { - uint8_t Type; /**< NFC Forum message Type */ - uint8_t Length; /**< Message length if lesser than 255 bytes */ - uint16_t Length16; /**< Message length if greater than or equal to 255 bytes */ + uint8_t Type; /**< NFC Forum message Type */ + uint8_t Length; /**< Message length if lesser than 255 bytes */ + uint16_t Length16; /**< Message length if greater than or equal to 255 bytes */ } TT5_TLV_t; /* Exported types ------------------------------------------------------------*/ From 20cac5e9d51de1880833fd209de4ccc83e3ed17e Mon Sep 17 00:00:00 2001 From: Gabriele Barola Date: Wed, 2 Apr 2025 15:50:58 +0200 Subject: [PATCH 6/8] fix version number --- library.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library.properties b/library.properties index eea58a9..7c1939c 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=STM32duino ST25DV -version=2.2.2 +version=2.2.0 author=STMicroelectronics maintainer=stm32duino sentence=Allows controlling the NFC ST25DV From 9b08706a46fe3abcf86e995c1e6ebc60768597f9 Mon Sep 17 00:00:00 2001 From: Gabriele Barola Date: Wed, 2 Apr 2025 16:05:01 +0200 Subject: [PATCH 7/8] fix astyle format --- .astyleignore | 4 + src/ST25DVSensor.cpp | 448 ++++--- src/ST25DVSensor.h | 4 +- src/ST25DV_IO/st25dv_io.cpp | 2000 ++++++++++++++-------------- src/ST25DV_IO/st25dv_io.h | 166 +-- src/libNDEF/NDEF_class.h | 36 +- src/libNDEF/NDEFcommon.h | 16 +- src/libNDEF/lib_NDEF.cpp | 764 +++++------ src/libNDEF/lib_NDEF.h | 54 +- src/libNDEF/lib_NDEF_AAR.cpp | 84 +- src/libNDEF/lib_NDEF_AAR.h | 2 +- src/libNDEF/lib_NDEF_Bluetooth.cpp | 750 +++++------ src/libNDEF/lib_NDEF_Bluetooth.h | 148 +- src/libNDEF/lib_NDEF_Email.cpp | 486 +++---- src/libNDEF/lib_NDEF_Email.h | 16 +- src/libNDEF/lib_NDEF_Geo.cpp | 380 +++--- src/libNDEF/lib_NDEF_Geo.h | 6 +- src/libNDEF/lib_NDEF_Handover.cpp | 508 +++---- src/libNDEF/lib_NDEF_Handover.h | 36 +- src/libNDEF/lib_NDEF_MyApp.cpp | 280 ++-- src/libNDEF/lib_NDEF_MyApp.h | 16 +- src/libNDEF/lib_NDEF_SMS.cpp | 400 +++--- src/libNDEF/lib_NDEF_SMS.h | 6 +- src/libNDEF/lib_NDEF_Text.cpp | 128 +- src/libNDEF/lib_NDEF_Text.h | 18 +- src/libNDEF/lib_NDEF_URI.cpp | 696 +++++----- src/libNDEF/lib_NDEF_URI.h | 12 +- src/libNDEF/lib_NDEF_Vcard.cpp | 832 ++++++------ src/libNDEF/lib_NDEF_Vcard.h | 32 +- src/libNDEF/lib_NDEF_Wifi.cpp | 374 +++--- src/libNDEF/lib_NDEF_Wifi.h | 28 +- src/libNDEF/tagtype5_wrapper.cpp | 504 +++---- src/libNDEF/tagtype5_wrapper.h | 6 +- 33 files changed, 4625 insertions(+), 4615 deletions(-) create mode 100644 .astyleignore diff --git a/.astyleignore b/.astyleignore new file mode 100644 index 0000000..ee36213 --- /dev/null +++ b/.astyleignore @@ -0,0 +1,4 @@ +.git +BUILD +CI +system \ No newline at end of file diff --git a/src/ST25DVSensor.cpp b/src/ST25DVSensor.cpp index 857318c..03bbffa 100755 --- a/src/ST25DVSensor.cpp +++ b/src/ST25DVSensor.cpp @@ -21,104 +21,104 @@ int ST25DV::begin() { - return begin(NULL, 0); + return begin(NULL, 0); } int ST25DV::begin(uint8_t *buffer, uint16_t bufferLength) { - uint8_t nfctag_id = 0; + uint8_t nfctag_id = 0; - if (!NfctagInitialized) { - /* ST25DV Init */ - if (ST25DV_Init() != NFCTAG_OK) { - return NFCTAG_ERROR; - } + if (!NfctagInitialized) { + /* ST25DV Init */ + if (ST25DV_Init() != NFCTAG_OK) { + return NFCTAG_ERROR; + } - /* Check ST25DV driver ID */ - st25dv_io.ST25DV_i2c_ReadID(&nfctag_id); + /* Check ST25DV driver ID */ + st25dv_io.ST25DV_i2c_ReadID(&nfctag_id); - if ((nfctag_id == I_AM_ST25DV04) || (nfctag_id == I_AM_ST25DV64) || - (nfctag_id == I_AM_ST25DV04KC) || (nfctag_id == I_AM_ST25DV64KC)) { - NfctagInitialized = 1; - } else { - return NFCTAG_ERROR; - } + if ((nfctag_id == I_AM_ST25DV04) || (nfctag_id == I_AM_ST25DV64) || + (nfctag_id == I_AM_ST25DV04KC) || (nfctag_id == I_AM_ST25DV64KC)) { + NfctagInitialized = 1; + } else { + return NFCTAG_ERROR; + } - int ret = ndef.begin(buffer, bufferLength); - if (ret != NDEF_OK) { - return ret; - } + int ret = ndef.begin(buffer, bufferLength); + if (ret != NDEF_OK) { + return ret; } - return NFCTAG_OK; + } + return NFCTAG_OK; }; int ST25DV::writeText(String text, String iso_lang, NDEF_Text_encoding_t encoding) { - NDEF_Text_info_t text_info; + NDEF_Text_info_t text_info; - strcpy(text_info.text, text.c_str()); - strcpy(text_info.language_code, iso_lang.c_str()); - text_info.encoding = encoding; + strcpy(text_info.text, text.c_str()); + strcpy(text_info.language_code, iso_lang.c_str()); + text_info.encoding = encoding; - return ndef.NDEF_WriteText(&text_info); + return ndef.NDEF_WriteText(&text_info); } int ST25DV::readText(String *text) { - uint16_t ret; - NDEF_Text_info_t info; - sRecordInfo_t recordInfo; - - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } - - ret = ndef.NDEF_ReadText(&recordInfo, &info); - if (ret) { - return ret; - } - *text = String(info.text); - - return 0; + uint16_t ret; + NDEF_Text_info_t info; + sRecordInfo_t recordInfo; + + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } + + ret = ndef.NDEF_ReadText(&recordInfo, &info); + if (ret) { + return ret; + } + *text = String(info.text); + + return 0; } int ST25DV::writeURI(String protocol, String uri, String info) { - sURI_Info _URI; + sURI_Info _URI; - // Unabridged protocols must be written using - // `writeUnabridgedURI()` - if (protocol.equals("")) { - return NDEF_ERROR; - } + // Unabridged protocols must be written using + // `writeUnabridgedURI()` + if (protocol.equals("")) { + return NDEF_ERROR; + } - strcpy(_URI.protocol, protocol.c_str()); - strcpy(_URI.URI_Message, uri.c_str()); - strcpy(_URI.Information, info.c_str()); + strcpy(_URI.protocol, protocol.c_str()); + strcpy(_URI.URI_Message, uri.c_str()); + strcpy(_URI.Information, info.c_str()); - return ndef.NDEF_WriteURI(&_URI); + return ndef.NDEF_WriteURI(&_URI); } int ST25DV::readURI(String *s) { - uint16_t ret; - sURI_Info uri = {"", "", ""}; - sRecordInfo_t recordInfo; - - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } - - ret = ndef.NDEF_ReadURI(&recordInfo, &uri); - if (ret) { - return ret; - } - *s = String(uri.protocol) + String(uri.URI_Message); - - return 0; + uint16_t ret; + sURI_Info uri = {"", "", ""}; + sRecordInfo_t recordInfo; + + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } + + ret = ndef.NDEF_ReadURI(&recordInfo, &uri); + if (ret) { + return ret; + } + *s = String(uri.protocol) + String(uri.URI_Message); + + return 0; } /* @@ -133,13 +133,13 @@ int ST25DV::readURI(String *s) */ int ST25DV::writeUnabridgedURI(String uri, String info) { - sURI_Info _URI; + sURI_Info _URI; - strcpy(_URI.protocol, ""); - strcpy(_URI.URI_Message, uri.c_str()); - strcpy(_URI.Information, info.c_str()); + strcpy(_URI.protocol, ""); + strcpy(_URI.URI_Message, uri.c_str()); + strcpy(_URI.Information, info.c_str()); - return ndef.NDEF_WriteURI(&_URI); + return ndef.NDEF_WriteURI(&_URI); } /* @@ -149,28 +149,28 @@ int ST25DV::writeUnabridgedURI(String uri, String info) */ int ST25DV::readUnabridgedURI(String *s) { - uint16_t ret; - sURI_Info uri = {"", "", ""}; - sRecordInfo_t recordInfo; + uint16_t ret; + sURI_Info uri = {"", "", ""}; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } - ret = ndef.NDEF_ReadURI(&recordInfo, &uri); - if (ret) { - return ret; - } + ret = ndef.NDEF_ReadURI(&recordInfo, &uri); + if (ret) { + return ret; + } - // If the URI is abbreviated return error - if (strncmp("", uri.protocol, 1) != 0) { - return ret; //NDEF_ERROR; - } + // If the URI is abbreviated return error + if (strncmp("", uri.protocol, 1) != 0) { + return ret; //NDEF_ERROR; + } - *s = String(uri.URI_Message); + *s = String(uri.URI_Message); - return 0; + return 0; } /* @@ -183,13 +183,13 @@ int ST25DV::readUnabridgedURI(String *s) */ int ST25DV::writeSMS(String phoneNumber, String message, String info) { - sSMSInfo _SMS; + sSMSInfo _SMS; - strncpy(_SMS.PhoneNumber, phoneNumber.c_str(), 16); - strncpy(_SMS.Message, message.c_str(), 400); - strncpy(_SMS.Information, info.c_str(), 400); + strncpy(_SMS.PhoneNumber, phoneNumber.c_str(), 16); + strncpy(_SMS.Message, message.c_str(), 400); + strncpy(_SMS.Information, info.c_str(), 400); - return ndef.NDEF_WriteSMS(&_SMS); + return ndef.NDEF_WriteSMS(&_SMS); } /* @@ -201,24 +201,24 @@ int ST25DV::writeSMS(String phoneNumber, String message, String info) */ int ST25DV::readSMS(String *phoneNumber, String *message) { - uint16_t ret; - sSMSInfo _SMS; - sRecordInfo_t recordInfo; + uint16_t ret; + sSMSInfo _SMS; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } - ret = ndef.NDEF_ReadSMS(&recordInfo, &_SMS); - if (ret) { - return ret; - } + ret = ndef.NDEF_ReadSMS(&recordInfo, &_SMS); + if (ret) { + return ret; + } - *phoneNumber = String(_SMS.PhoneNumber); - *message = String(_SMS.Message); + *phoneNumber = String(_SMS.PhoneNumber); + *message = String(_SMS.Message); - return NDEF_OK; + return NDEF_OK; } /* @@ -231,13 +231,13 @@ int ST25DV::readSMS(String *phoneNumber, String *message) */ int ST25DV::writeGEO(String latitude, String longitude, String info) { - sGeoInfo _GEO; + sGeoInfo _GEO; - strncpy(_GEO.Latitude, latitude.c_str(), 20); - strncpy(_GEO.Longitude, longitude.c_str(), 20); - strncpy(_GEO.Information, info.c_str(), 100); + strncpy(_GEO.Latitude, latitude.c_str(), 20); + strncpy(_GEO.Longitude, longitude.c_str(), 20); + strncpy(_GEO.Information, info.c_str(), 100); - return ndef.NDEF_WriteGeo(&_GEO); + return ndef.NDEF_WriteGeo(&_GEO); } /* @@ -249,60 +249,60 @@ int ST25DV::writeGEO(String latitude, String longitude, String info) */ int ST25DV::readGEO(String *latitude, String *longitude) { - uint16_t ret; - sGeoInfo _GEO; - sRecordInfo_t recordInfo; + uint16_t ret; + sGeoInfo _GEO; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } - ret = ndef.NDEF_ReadGeo(&recordInfo, &_GEO); - if (ret) { - return ret; - } + ret = ndef.NDEF_ReadGeo(&recordInfo, &_GEO); + if (ret) { + return ret; + } - *latitude = String(_GEO.Latitude); - *longitude = String(_GEO.Longitude); + *latitude = String(_GEO.Latitude); + *longitude = String(_GEO.Longitude); - return NDEF_OK; + return NDEF_OK; } int ST25DV::writeEMail(String emailAdd, String subject, String message, String info) { - sEmailInfo _EMAIL; + sEmailInfo _EMAIL; - strncpy(_EMAIL.EmailAdd, emailAdd.c_str(), 64); - strncpy(_EMAIL.Subject, subject.c_str(), 100); - strncpy(_EMAIL.Message, message.c_str(), 2000); - strncpy(_EMAIL.Information, info.c_str(), 400); + strncpy(_EMAIL.EmailAdd, emailAdd.c_str(), 64); + strncpy(_EMAIL.Subject, subject.c_str(), 100); + strncpy(_EMAIL.Message, message.c_str(), 2000); + strncpy(_EMAIL.Information, info.c_str(), 400); - return ndef.NDEF_WriteEmail(&_EMAIL); + return ndef.NDEF_WriteEmail(&_EMAIL); } int ST25DV::readEMail(String *emailAdd, String *subject, String *message) { - uint16_t ret; - sEmailInfo _EMAIL; - sRecordInfo_t recordInfo; + uint16_t ret; + sEmailInfo _EMAIL; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } - ret = ndef.NDEF_ReadEmail(&recordInfo, &_EMAIL); - if (ret) { - return ret; - } + ret = ndef.NDEF_ReadEmail(&recordInfo, &_EMAIL); + if (ret) { + return ret; + } - *emailAdd = String(_EMAIL.EmailAdd); - *subject = String(_EMAIL.Subject); - *message = String(_EMAIL.Message); + *emailAdd = String(_EMAIL.EmailAdd); + *subject = String(_EMAIL.Subject); + *message = String(_EMAIL.Message); - return NDEF_OK; + return NDEF_OK; } /** @@ -314,65 +314,69 @@ int ST25DV::readEMail(String *emailAdd, String *subject, String *message) * @param key * @retval success or failure */ -int ST25DV::writeWifi(String SSID, Ndef_Wifi_Authentication_t auth, Ndef_Wifi_Encryption_t enc, String key) { - sWifiTokenInfo _wifi; +int ST25DV::writeWifi(String SSID, Ndef_Wifi_Authentication_t auth, Ndef_Wifi_Encryption_t enc, String key) +{ + sWifiTokenInfo _wifi; - strncpy(_wifi.NetworkSSID, SSID.c_str(), 32); - strncpy(_wifi.NetworkKey, key.c_str(), 32); + strncpy(_wifi.NetworkSSID, SSID.c_str(), 32); + strncpy(_wifi.NetworkKey, key.c_str(), 32); - _wifi.AuthenticationType = auth; - _wifi.EncryptionType = enc; + _wifi.AuthenticationType = auth; + _wifi.EncryptionType = enc; - return ndef.NDEF_WriteWifiToken(&_wifi); + return ndef.NDEF_WriteWifiToken(&_wifi); } -int ST25DV::readWifi(sWifiTokenInfo *wifitoken) { - uint16_t ret; - sRecordInfo_t recordInfo; +int ST25DV::readWifi(sWifiTokenInfo *wifitoken) +{ + uint16_t ret; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } - return ndef.NDEF_ReadWifiToken(&recordInfo, wifitoken); + return ndef.NDEF_ReadWifiToken(&recordInfo, wifitoken); } -int ST25DV::writeVcard(sVcardInfo vcard) { +int ST25DV::writeVcard(sVcardInfo vcard) +{ - return ndef.NDEF_WriteVcard(&vcard); + return ndef.NDEF_WriteVcard(&vcard); } -int ST25DV::readVcard(sVcardInfo *vcard) { - uint16_t ret; - sRecordInfo_t recordInfo; +int ST25DV::readVcard(sVcardInfo *vcard) +{ + uint16_t ret; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } - return ndef.NDEF_ReadVcard(&recordInfo, vcard); + return ndef.NDEF_ReadVcard(&recordInfo, vcard); } int ST25DV::appendAAR(String pkgName) { - sAARInfo _info; - strncpy(_info.PackageName, pkgName.c_str(), 80); + sAARInfo _info; + strncpy(_info.PackageName, pkgName.c_str(), 80); - return ndef.NDEF_AddAAR(&_info); + return ndef.NDEF_AddAAR(&_info); } int ST25DV::appendBluetoothOOB(Ndef_Bluetooth_OOB_t bluetooth, char *recordId) { - return ndef.NDEF_AppendBluetoothOOB(&bluetooth, recordId); + return ndef.NDEF_AppendBluetoothOOB(&bluetooth, recordId); } int ST25DV::writeMyApp(sMyAppInfo *pMyAppStruct) { - return ndef.NDEF_WriteMyApp(pMyAppStruct); + return ndef.NDEF_WriteMyApp(pMyAppStruct); } /** @@ -382,15 +386,15 @@ int ST25DV::writeMyApp(sMyAppInfo *pMyAppStruct) */ NDEF_TypeDef ST25DV::readNDEFType(void) { - uint16_t ret; - sRecordInfo_t recordInfo; + uint16_t ret; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return UNKNOWN_TYPE; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return UNKNOWN_TYPE; + } - return recordInfo.NDEF_Type; + return recordInfo.NDEF_Type; } /** @@ -400,7 +404,7 @@ NDEF_TypeDef ST25DV::readNDEFType(void) */ NDEF *ST25DV::getNDEF(void) { - return &ndef; + return &ndef; } /** @@ -410,17 +414,17 @@ NDEF *ST25DV::getNDEF(void) */ NFCTAG_StatusTypeDef ST25DV::ST25DV_Init(void) { - if (st25dv_io.get_pwire() == NULL) { - return NFCTAG_ERROR; - } + if (st25dv_io.get_pwire() == NULL) { + return NFCTAG_ERROR; + } - ST25DV_GPO_Init(); - ST25DV_LPD_Init(); + ST25DV_GPO_Init(); + ST25DV_LPD_Init(); - ST25DV_I2C_Init(); - ST25DV_SelectI2cSpeed(3); + ST25DV_I2C_Init(); + ST25DV_SelectI2cSpeed(3); - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -430,7 +434,7 @@ NFCTAG_StatusTypeDef ST25DV::ST25DV_Init(void) */ void ST25DV::ST25DV_GPO_Init(void) { - pinMode(st25dv_io.get_gpo(), INPUT); + pinMode(st25dv_io.get_gpo(), INPUT); } /** @@ -440,7 +444,7 @@ void ST25DV::ST25DV_GPO_Init(void) */ uint8_t ST25DV::ST25DV_GPO_ReadPin(void) { - return digitalRead(st25dv_io.get_gpo()); + return digitalRead(st25dv_io.get_gpo()); } /** @@ -450,10 +454,10 @@ uint8_t ST25DV::ST25DV_GPO_ReadPin(void) */ void ST25DV::ST25DV_LPD_Init(void) { - if (st25dv_io.get_lpd() > 0) { - pinMode(st25dv_io.get_lpd(), OUTPUT); - digitalWrite(st25dv_io.get_lpd(), LOW); - } + if (st25dv_io.get_lpd() > 0) { + pinMode(st25dv_io.get_lpd(), OUTPUT); + digitalWrite(st25dv_io.get_lpd(), LOW); + } } /** @@ -472,7 +476,7 @@ void ST25DV::ST25DV_LPD_DeInit(void) */ uint8_t ST25DV::ST25DV_LPD_ReadPin(void) { - return digitalRead(st25dv_io.get_lpd()); + return digitalRead(st25dv_io.get_lpd()); } /** @@ -482,7 +486,7 @@ uint8_t ST25DV::ST25DV_LPD_ReadPin(void) */ void ST25DV::ST25DV_LPD_WritePin(uint8_t LpdPinState) { - digitalWrite(st25dv_io.get_lpd(), LpdPinState); + digitalWrite(st25dv_io.get_lpd(), LpdPinState); } /** @@ -492,47 +496,47 @@ void ST25DV::ST25DV_LPD_WritePin(uint8_t LpdPinState) */ void ST25DV::ST25DV_SelectI2cSpeed(uint8_t i2cspeedchoice) { - if (st25dv_io.get_pwire() == NULL) { - return; - } + if (st25dv_io.get_pwire() == NULL) { + return; + } #if !defined(ARDUINO_ARCH_ARC) && !defined(ARDUINO_ARCH_ARC32) - switch (i2cspeedchoice) { + switch (i2cspeedchoice) { case 0: - st25dv_io.get_pwire()->setClock(10000); - break; + st25dv_io.get_pwire()->setClock(10000); + break; case 1: - st25dv_io.get_pwire()->setClock(100000); - break; + st25dv_io.get_pwire()->setClock(100000); + break; case 2: - st25dv_io.get_pwire()->setClock(200000); - break; + st25dv_io.get_pwire()->setClock(200000); + break; case 3: - st25dv_io.get_pwire()->setClock(400000); - break; + st25dv_io.get_pwire()->setClock(400000); + break; case 4: - st25dv_io.get_pwire()->setClock(800000); - break; + st25dv_io.get_pwire()->setClock(800000); + break; case 5: - st25dv_io.get_pwire()->setClock(1000000); - break; + st25dv_io.get_pwire()->setClock(1000000); + break; default: - st25dv_io.get_pwire()->setClock(1000000); - break; - } + st25dv_io.get_pwire()->setClock(1000000); + break; + } } /** @@ -542,7 +546,7 @@ void ST25DV::ST25DV_SelectI2cSpeed(uint8_t i2cspeedchoice) */ void ST25DV::ST25DV_I2C_Init(void) { - st25dv_io.get_pwire()->begin(); + st25dv_io.get_pwire()->begin(); } #endif diff --git a/src/ST25DVSensor.h b/src/ST25DVSensor.h index e3496f1..679a3d3 100755 --- a/src/ST25DVSensor.h +++ b/src/ST25DVSensor.h @@ -31,7 +31,7 @@ #endif class ST25DV { -public: + public: ST25DV(int32_t gpo, int32_t lpd, TwoWire *i2c, Stream *serial = NULL) : st25dv_io(gpo, lpd, i2c, serial), ndef(&st25dv_io) {} int begin(); @@ -58,7 +58,7 @@ class ST25DV { NDEF_TypeDef readNDEFType(); NDEF *getNDEF(); -protected: + protected: NFCTAG_StatusTypeDef ST25DV_Init(void); void ST25DV_GPO_Init(void); void ST25DV_GPO_DeInit(void); diff --git a/src/ST25DV_IO/st25dv_io.cpp b/src/ST25DV_IO/st25dv_io.cpp index 6941e82..cb7d6d7 100644 --- a/src/ST25DV_IO/st25dv_io.cpp +++ b/src/ST25DV_IO/st25dv_io.cpp @@ -23,10 +23,10 @@ ST25DV_IO::ST25DV_IO(int32_t gpo, int32_t lpd, TwoWire *i2c, Stream *serial) { - _gpo = gpo; - _lpd = lpd; - _pwire = i2c; - _serial = serial; + _gpo = gpo; + _lpd = lpd; + _pwire = i2c; + _serial = serial; } /******************************** LINK EEPROM COMPONENT *****************************/ @@ -42,68 +42,68 @@ ST25DV_IO::ST25DV_IO(int32_t gpo, int32_t lpd, TwoWire *i2c, Stream *serial) NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_MemWrite(const uint8_t *const pData, const uint8_t DevAddr, const uint16_t TarAddr, const uint16_t Size) { - NFCTAG_StatusTypeDef pollstatus; - byte ret; - uint32_t tickstart; - uint8_t Addr = DevAddr >> 1; - char tmp[4]; - - if (_pwire == NULL) { - return NFCTAG_ERROR; - } - - if (_serial != NULL) { - // _serial->println(SP); - _serial->print(" w "); - sprintf(tmp, "%02X", Addr); - _serial->print(tmp); - _serial->print("@"); - sprintf(tmp, "%02X", TarAddr >> 8); - _serial->print(tmp); - sprintf(tmp, "%02X", TarAddr & 0xFF); - _serial->print(tmp); - _serial->print(":"); - _serial->println(Size); - _serial->print(" "); - for (uint16_t d = 0; d < Size; d++) { - sprintf(tmp, "%02X", pData[d]); - _serial->print(tmp); - } - _serial->println(""); - } - - _pwire->beginTransmission(Addr); // transmit to device - _pwire->write(TarAddr >> 8); // send memory address MSB - _pwire->write(TarAddr & 0xFF); // send memory address LSB - _pwire->write(pData, Size); // sends bytes - ret = _pwire->endTransmission(true); // stop transmitting - if (_serial != NULL) { - _serial->print(" ="); - _serial->println(ret); - } + NFCTAG_StatusTypeDef pollstatus; + byte ret; + uint32_t tickstart; + uint8_t Addr = DevAddr >> 1; + char tmp[4]; + + if (_pwire == NULL) { + return NFCTAG_ERROR; + } + + if (_serial != NULL) { + // _serial->println(SP); + _serial->print(" w "); + sprintf(tmp, "%02X", Addr); + _serial->print(tmp); + _serial->print("@"); + sprintf(tmp, "%02X", TarAddr >> 8); + _serial->print(tmp); + sprintf(tmp, "%02X", TarAddr & 0xFF); + _serial->print(tmp); + _serial->print(":"); + _serial->println(Size); + _serial->print(" "); + for (uint16_t d = 0; d < Size; d++) { + sprintf(tmp, "%02X", pData[d]); + _serial->print(tmp); + } + _serial->println(""); + } + + _pwire->beginTransmission(Addr); // transmit to device + _pwire->write(TarAddr >> 8); // send memory address MSB + _pwire->write(TarAddr & 0xFF); // send memory address LSB + _pwire->write(pData, Size); // sends bytes + ret = _pwire->endTransmission(true); // stop transmitting + if (_serial != NULL) { + _serial->print(" ="); + _serial->println(ret); + } + + if (ret == 0) { + /* Poll until EEPROM is available */ + tickstart = millis(); + /* Wait until ST25DV is ready or timeout occurs */ + do { + pollstatus = ST25DV_IO_IsDeviceReady(DevAddr, 1); + } while (((millis() - tickstart) < ST25DV_I2C_TIMEOUT) && (pollstatus != NFCTAG_OK)); - if (ret == 0) { - /* Poll until EEPROM is available */ - tickstart = millis(); - /* Wait until ST25DV is ready or timeout occurs */ - do { - pollstatus = ST25DV_IO_IsDeviceReady(DevAddr, 1); - } while (((millis() - tickstart) < ST25DV_I2C_TIMEOUT) && (pollstatus != NFCTAG_OK)); - - if (pollstatus != NFCTAG_OK) { - return NFCTAG_TIMEOUT; - } + if (pollstatus != NFCTAG_OK) { + return NFCTAG_TIMEOUT; } + } #if defined(ARDUINO_ARCH_ARC) || defined(ARDUINO_ARCH_ARC32) - // Arduino 101 i2c seems buggy after an address NACK: restart the i2c - else if (ret == 2) { - if (_serial != NULL) { - _serial->print(" -\n"); - } - _pwire->begin(); + // Arduino 101 i2c seems buggy after an address NACK: restart the i2c + else if (ret == 2) { + if (_serial != NULL) { + _serial->print(" -\n"); } + _pwire->begin(); + } #endif - return NFCTAG_ConvertStatus(ret); + return NFCTAG_ConvertStatus(ret); } /** @@ -116,80 +116,80 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_MemWrite(const uint8_t *const pData, c */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_MemRead(uint8_t *const pData, const uint8_t DevAddr, const uint16_t TarAddr, const uint16_t Size) { - int i = 0; - uint8_t ret = 4; - uint8_t Addr = DevAddr >> 1; - char tmp[4]; - - if (_pwire == NULL) { - return NFCTAG_ERROR; - } - - if (_serial != NULL) { - // _serial->println(SP); - _serial->print(" r "); - sprintf(tmp, "%02X", Addr); - _serial->print(tmp); - _serial->print("@"); - sprintf(tmp, "%02X", TarAddr >> 8); - _serial->print(tmp); - sprintf(tmp, "%02X", TarAddr & 0xFF); - _serial->print(tmp); - _serial->print(":"); - _serial->println(Size); - } - _pwire->beginTransmission(Addr); // Get the slave's attention, tell it we're sending a command byte - _pwire->write(TarAddr >> 8); // The command byte, sets pointer to register with address of 0x32 - _pwire->write(TarAddr & 0xFF); // The command byte, sets pointer to register with address of 0x32 - ret = _pwire->endTransmission(true); - // Address is not OK - if (ret != 0) { - return NFCTAG_ConvertStatus(ret); - } - - // be carefully with the (int)Size, the size parameter us no more on 16 bits but only 15 bits (the cast is required for arduino UNO) - _pwire->requestFrom((int)Addr, (int)Size); // Tell slave we need to read 1byte from the current register - - - while (_pwire->available()) { - pData[i++] = _pwire->read(); // read that byte into 'slaveByte2' variable - } - if (_serial != NULL) { - _serial->print(" "); - for (int d = 0; d < i; d++) { - sprintf(tmp, "%02X", pData[d]); - _serial->print(tmp); - } - _serial->println(""); - } - - /* - It doesn't seem like Arduino wants you to call `endTransmission` - after `requestFrom`. On the ESP32 the ret value is 8 because it - is an `endTransmission` without a `startTransmission` which is - considered an error by the library. - */ - // ret = _pwire->endTransmission(); - // if (_serial != NULL) { - // // _serial->println(pData[0]); - // _serial->print(" ="); - // _serial->println(ret); - // // _serial->print(" "); - // // _serial->println(pData[0]); - // // _serial->println((uint32_t)pData); - // } + int i = 0; + uint8_t ret = 4; + uint8_t Addr = DevAddr >> 1; + char tmp[4]; + + if (_pwire == NULL) { + return NFCTAG_ERROR; + } + + if (_serial != NULL) { + // _serial->println(SP); + _serial->print(" r "); + sprintf(tmp, "%02X", Addr); + _serial->print(tmp); + _serial->print("@"); + sprintf(tmp, "%02X", TarAddr >> 8); + _serial->print(tmp); + sprintf(tmp, "%02X", TarAddr & 0xFF); + _serial->print(tmp); + _serial->print(":"); + _serial->println(Size); + } + _pwire->beginTransmission(Addr); // Get the slave's attention, tell it we're sending a command byte + _pwire->write(TarAddr >> 8); // The command byte, sets pointer to register with address of 0x32 + _pwire->write(TarAddr & 0xFF); // The command byte, sets pointer to register with address of 0x32 + ret = _pwire->endTransmission(true); + // Address is not OK + if (ret != 0) { return NFCTAG_ConvertStatus(ret); + } + + // be carefully with the (int)Size, the size parameter us no more on 16 bits but only 15 bits (the cast is required for arduino UNO) + _pwire->requestFrom((int)Addr, (int)Size); // Tell slave we need to read 1byte from the current register + + + while (_pwire->available()) { + pData[i++] = _pwire->read(); // read that byte into 'slaveByte2' variable + } + if (_serial != NULL) { + _serial->print(" "); + for (int d = 0; d < i; d++) { + sprintf(tmp, "%02X", pData[d]); + _serial->print(tmp); + } + _serial->println(""); + } + + /* + It doesn't seem like Arduino wants you to call `endTransmission` + after `requestFrom`. On the ESP32 the ret value is 8 because it + is an `endTransmission` without a `startTransmission` which is + considered an error by the library. + */ + // ret = _pwire->endTransmission(); + // if (_serial != NULL) { + // // _serial->println(pData[0]); + // _serial->print(" ="); + // _serial->println(ret); + // // _serial->print(" "); + // // _serial->println(pData[0]); + // // _serial->println((uint32_t)pData); + // } + return NFCTAG_ConvertStatus(ret); } NFCTAG_StatusTypeDef ST25DV_IO::NFCTAG_ConvertStatus(uint8_t ret) { - if (ret == 0) { - return NFCTAG_OK; - } else if ((ret == 2) || (ret == 3)) { - return NFCTAG_NACK; - } else { - return NFCTAG_ERROR; - } + if (ret == 0) { + return NFCTAG_OK; + } else if ((ret == 2) || (ret == 3)) { + return NFCTAG_NACK; + } else { + return NFCTAG_ERROR; + } } @@ -202,46 +202,46 @@ NFCTAG_StatusTypeDef ST25DV_IO::NFCTAG_ConvertStatus(uint8_t ret) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_Read(uint8_t *const pData, const uint8_t DevAddr, const uint16_t Size) { - int i = 0; - uint8_t Addr = DevAddr >> 1; - char tmp[4]; - - if (_pwire == NULL) { - return NFCTAG_ERROR; - } - if (_serial != NULL) { - _serial->print(" r"); - _serial->print(":"); - _serial->println(Size); - } - // be carefully with the (int)Size, the size parameter us no more on 16 bits but only 15 bits (the cast is required for arduino UNO) - byte ret = _pwire->requestFrom((int)Addr, (int)Size); // Tell slave we need to read 1byte from the current register - while (_pwire->available()) { - pData[i++] = _pwire->read(); // read that byte into 'slaveByte2' variable - } - - if (_serial != NULL) { - _serial->print(" "); - for (int d = 0; d < i; d++) { - sprintf(tmp, "%02X", pData[d]); - _serial->print(tmp); - } - _serial->println(""); - } - /* - It doesn't seem like Arduino wants you to call `endTransmission` - after `requestFrom`. On the ESP32 the ret value is 8 because it - is an `endTransmission` without a `startTransmission` which is - considered an error by the library. - */ - // ret = _pwire->endTransmission(); - - // if (_serial != NULL) { - // // _serial->println(pData[0]); - // _serial->print(" ="); - // _serial->println(ret); - // } - return NFCTAG_ConvertStatus(ret); + int i = 0; + uint8_t Addr = DevAddr >> 1; + char tmp[4]; + + if (_pwire == NULL) { + return NFCTAG_ERROR; + } + if (_serial != NULL) { + _serial->print(" r"); + _serial->print(":"); + _serial->println(Size); + } + // be carefully with the (int)Size, the size parameter us no more on 16 bits but only 15 bits (the cast is required for arduino UNO) + byte ret = _pwire->requestFrom((int)Addr, (int)Size); // Tell slave we need to read 1byte from the current register + while (_pwire->available()) { + pData[i++] = _pwire->read(); // read that byte into 'slaveByte2' variable + } + + if (_serial != NULL) { + _serial->print(" "); + for (int d = 0; d < i; d++) { + sprintf(tmp, "%02X", pData[d]); + _serial->print(tmp); + } + _serial->println(""); + } + /* + It doesn't seem like Arduino wants you to call `endTransmission` + after `requestFrom`. On the ESP32 the ret value is 8 because it + is an `endTransmission` without a `startTransmission` which is + considered an error by the library. + */ + // ret = _pwire->endTransmission(); + + // if (_serial != NULL) { + // // _serial->println(pData[0]); + // _serial->print(" ="); + // _serial->println(ret); + // } + return NFCTAG_ConvertStatus(ret); } @@ -253,24 +253,24 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_Read(uint8_t *const pData, const uint8 */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_IsDeviceReady(const uint8_t DevAddr, const uint32_t Trials) { - int ret = 4; - uint32_t count = 0; - if (_pwire == NULL) { - return NFCTAG_ERROR; - } + int ret = 4; + uint32_t count = 0; + if (_pwire == NULL) { + return NFCTAG_ERROR; + } + if (_serial != NULL) { + _serial->println(" ?"); + } + + while ((count++ < Trials) && ret) { + _pwire->beginTransmission(DevAddr >> 1); + ret = _pwire->endTransmission(); if (_serial != NULL) { - _serial->println(" ?"); + _serial->print(" ="); + _serial->println(ret); } - - while ((count++ < Trials) && ret) { - _pwire->beginTransmission(DevAddr >> 1); - ret = _pwire->endTransmission(); - if (_serial != NULL) { - _serial->print(" ="); - _serial->println(ret); - } - } - return NFCTAG_ConvertStatus(ret); + } + return NFCTAG_ConvertStatus(ret); } /** @@ -279,8 +279,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_IsDeviceReady(const uint8_t DevAddr, c */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_Init(void) { - /* Configure the low level interface */ - return ST25DV_IO_Init(); + /* Configure the low level interface */ + return ST25DV_IO_Init(); } /** @@ -290,8 +290,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_Init(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadID(uint8_t *const pICRef) { - /* Read ICRef on device */ - return ST25DV_i2c_ReadRegister(pICRef, ST25DV_ICREF_REG, 1); + /* Read ICRef on device */ + return ST25DV_i2c_ReadRegister(pICRef, ST25DV_ICREF_REG, 1); } /** @@ -303,8 +303,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadID(uint8_t *const pICRef) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadData(uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - /* Read Data in user memory */ - return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); + /* Read Data in user memory */ + return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); } /** @@ -316,32 +316,32 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadData(uint8_t *const pData, const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteData(const uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - NFCTAG_StatusTypeDef ret; - uint16_t split_data_nb; - const uint8_t *pdata_index = (const uint8_t *)pData; - uint16_t bytes_to_write = NbByte; - uint16_t mem_addr = TarAddr; + NFCTAG_StatusTypeDef ret; + uint16_t split_data_nb; + const uint8_t *pdata_index = (const uint8_t *)pData; + uint16_t bytes_to_write = NbByte; + uint16_t mem_addr = TarAddr; + + /* ST25DV can write a maximum of 256 bytes in EEPROM per i2c communication */ + do { + /* Split write if data to write is superior of max write bytes for ST25DV */ + if (bytes_to_write > ST25DV_MAX_WRITE_BYTE) { + /* DataSize higher than max page write, copy data by page */ + split_data_nb = (uint16_t)ST25DV_MAX_WRITE_BYTE; + } else { + /* DataSize lower or equal to max page write, copy only last bytes */ + split_data_nb = bytes_to_write; + } + /* Write split_data_nb bytes in memory */ + ret = ST25DV_IO_MemWrite(pdata_index, ST25DV_ADDR_DATA_I2C, mem_addr, split_data_nb); - /* ST25DV can write a maximum of 256 bytes in EEPROM per i2c communication */ - do { - /* Split write if data to write is superior of max write bytes for ST25DV */ - if (bytes_to_write > ST25DV_MAX_WRITE_BYTE) { - /* DataSize higher than max page write, copy data by page */ - split_data_nb = (uint16_t)ST25DV_MAX_WRITE_BYTE; - } else { - /* DataSize lower or equal to max page write, copy only last bytes */ - split_data_nb = bytes_to_write; - } - /* Write split_data_nb bytes in memory */ - ret = ST25DV_IO_MemWrite(pdata_index, ST25DV_ADDR_DATA_I2C, mem_addr, split_data_nb); - - /* update index, dest address, size for next write */ - pdata_index += split_data_nb; - mem_addr += split_data_nb; - bytes_to_write -= split_data_nb; - } while ((bytes_to_write > 0) && (ret == NFCTAG_OK)); + /* update index, dest address, size for next write */ + pdata_index += split_data_nb; + mem_addr += split_data_nb; + bytes_to_write -= split_data_nb; + } while ((bytes_to_write > 0) && (ret == NFCTAG_OK)); - return ret; + return ret; } /** @@ -353,8 +353,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteData(const uint8_t *const pData, */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRegister(uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - /* Read Data in system memory */ - return ST25DV_IO_MemRead(pData, ST25DV_ADDR_SYST_I2C, TarAddr, NbByte); + /* Read Data in system memory */ + return ST25DV_IO_MemRead(pData, ST25DV_ADDR_SYST_I2C, TarAddr, NbByte); } /** @@ -367,32 +367,32 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRegister(uint8_t *const pData, co */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRegister(const uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - NFCTAG_StatusTypeDef ret; - uint8_t split_data_nb; - uint16_t bytes_to_write = NbByte; - uint16_t mem_addr = TarAddr; - const uint8_t *pdata_index = (const uint8_t *)pData; + NFCTAG_StatusTypeDef ret; + uint8_t split_data_nb; + uint16_t bytes_to_write = NbByte; + uint16_t mem_addr = TarAddr; + const uint8_t *pdata_index = (const uint8_t *)pData; + + /* ST25DV can write a maximum of 256 bytes in EEPROM per i2c communication */ + do { + /* Split write if data to write is superior of max write bytes for ST25DV */ + if (bytes_to_write > ST25DV_MAX_WRITE_BYTE) { + /* DataSize higher than max page write, copy data by page */ + split_data_nb = (uint8_t)ST25DV_MAX_WRITE_BYTE; + } else { + /* DataSize lower or equal to max page write, copy only last bytes */ + split_data_nb = bytes_to_write; + } + /* Write split_data_nb bytes in register */ + ret = ST25DV_IO_MemWrite(pdata_index, ST25DV_ADDR_SYST_I2C, mem_addr, split_data_nb); - /* ST25DV can write a maximum of 256 bytes in EEPROM per i2c communication */ - do { - /* Split write if data to write is superior of max write bytes for ST25DV */ - if (bytes_to_write > ST25DV_MAX_WRITE_BYTE) { - /* DataSize higher than max page write, copy data by page */ - split_data_nb = (uint8_t)ST25DV_MAX_WRITE_BYTE; - } else { - /* DataSize lower or equal to max page write, copy only last bytes */ - split_data_nb = bytes_to_write; - } - /* Write split_data_nb bytes in register */ - ret = ST25DV_IO_MemWrite(pdata_index, ST25DV_ADDR_SYST_I2C, mem_addr, split_data_nb); - - /* update index, dest address, size for next write */ - pdata_index += split_data_nb; - mem_addr += split_data_nb; - bytes_to_write -= split_data_nb; - } while ((bytes_to_write > 0) && (ret == NFCTAG_OK)); + /* update index, dest address, size for next write */ + pdata_index += split_data_nb; + mem_addr += split_data_nb; + bytes_to_write -= split_data_nb; + } while ((bytes_to_write > 0) && (ret == NFCTAG_OK)); - return ret; + return ret; } /** @@ -402,8 +402,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRegister(const uint8_t *const pD */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadICRev(uint8_t *const pICRev) { - /* Read ICRev on device */ - return ST25DV_i2c_ReadRegister(pICRev, ST25DV_ICREV_REG, 1); + /* Read ICRev on device */ + return ST25DV_i2c_ReadRegister(pICRev, ST25DV_ICREV_REG, 1); } /** TODO adjust comment @@ -422,21 +422,21 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadICRev(uint8_t *const pICRev) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetGPOStatus(uint16_t *const pGPOStatus) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; - /* Read value of GPO register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO2_REG, 1); + uint8_t reg_value; + NFCTAG_StatusTypeDef status; + /* Read value of GPO register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO2_REG, 1); + if (status == NFCTAG_OK) { + // Extract GPO configuration + *pGPOStatus = ((uint16_t)0x0003 & (uint16_t)reg_value) << 8; + // Read value of GPO register + status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO1_REG, 1); if (status == NFCTAG_OK) { - // Extract GPO configuration - *pGPOStatus = ((uint16_t)0x0003 & (uint16_t)reg_value) << 8; - // Read value of GPO register - status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO1_REG, 1); - if (status == NFCTAG_OK) { - // Extract GPO configuration - *pGPOStatus |= ((uint16_t)0x00FF & (uint16_t)reg_value); - } + // Extract GPO configuration + *pGPOStatus |= ((uint16_t)0x00FF & (uint16_t)reg_value); } - return status; + } + return status; } /** @@ -456,8 +456,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetGPOStatus(uint16_t *const pGPOStat */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ConfigureGPO(const uint16_t ITConf) { - /* Write GPO configuration to register */ - return ST25DV_i2c_WriteRegister((uint8_t *)&ITConf, ST25DVXXKC_GPO1_REG, 1); + /* Write GPO configuration to register */ + return ST25DV_i2c_WriteRegister((uint8_t *)&ITConf, ST25DVXXKC_GPO1_REG, 1); } @@ -468,19 +468,19 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ConfigureGPO(const uint16_t ITConf) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadITPulse(ST25DV_PULSE_DURATION *const pITtime) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read ITtime register value */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO2_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read ITtime register value */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO2_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract delay coefficient value */ - *pITtime = (ST25DV_PULSE_DURATION)reg_value; + /* Extract delay coefficient value */ + *pITtime = (ST25DV_PULSE_DURATION)reg_value; - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -491,13 +491,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadITPulse(ST25DV_PULSE_DURATION *co */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteITPulse(const ST25DV_PULSE_DURATION ITtime) { - uint8_t reg_value; + uint8_t reg_value; - /* prepare data to write */ - reg_value = (uint8_t)ITtime; + /* prepare data to write */ + reg_value = (uint8_t)ITtime; - /* Write value for ITtime register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DVXXKC_GPO2_REG, 1); + /* Write value for ITtime register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DVXXKC_GPO2_REG, 1); } /** @@ -508,8 +508,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteITPulse(const ST25DV_PULSE_DURAT */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDataCurrentAddr(uint8_t *const pData, const uint16_t NbByte) { - /* Read Data in user memory */ - return ST25DV_IO_Read(pData, ST25DV_ADDR_DATA_I2C, NbByte); + /* Read Data in user memory */ + return ST25DV_IO_Read(pData, ST25DV_ADDR_DATA_I2C, NbByte); } /** @@ -519,30 +519,30 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDataCurrentAddr(uint8_t *const pD */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadUID(ST25DV_UID *const pUid) { - uint8_t reg_value[8]; - uint8_t i; - NFCTAG_StatusTypeDef status; + uint8_t reg_value[8]; + uint8_t i; + NFCTAG_StatusTypeDef status; - /* Read value of UID registers */ - status = ST25DV_i2c_ReadRegister(reg_value, ST25DV_UID_REG, 8); - if (status != NFCTAG_OK) { - return status; - } + /* Read value of UID registers */ + status = ST25DV_i2c_ReadRegister(reg_value, ST25DV_UID_REG, 8); + if (status != NFCTAG_OK) { + return status; + } - /* Store information in 2 WORD */ - pUid->MsbUid = 0; + /* Store information in 2 WORD */ + pUid->MsbUid = 0; - for (i = 0; i < 4; i++) { - pUid->MsbUid = (pUid->MsbUid << 8) | reg_value[7 - i]; - } + for (i = 0; i < 4; i++) { + pUid->MsbUid = (pUid->MsbUid << 8) | reg_value[7 - i]; + } - pUid->LsbUid = 0; + pUid->LsbUid = 0; - for (i = 0; i < 4; i++) { - pUid->LsbUid = (pUid->LsbUid << 8) | reg_value[3 - i]; - } + for (i = 0; i < 4; i++) { + pUid->LsbUid = (pUid->LsbUid << 8) | reg_value[3 - i]; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -552,8 +552,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadUID(ST25DV_UID *const pUid) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDSFID(uint8_t *const pDsfid) { - /* Read DSFID register */ - return ST25DV_i2c_ReadRegister(pDsfid, ST25DV_DSFID_REG, 1); + /* Read DSFID register */ + return ST25DV_i2c_ReadRegister(pDsfid, ST25DV_DSFID_REG, 1); } /** @@ -563,22 +563,22 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDSFID(uint8_t *const pDsfid) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDsfidRFProtection(ST25DV_LOCK_STATUS *const pLockDsfid) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_LOCKDSFID_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_LOCKDSFID_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Lock Status */ - if (reg_value == 0) { - *pLockDsfid = ST25DV_UNLOCKED; - } else { - *pLockDsfid = ST25DV_LOCKED; - } - return NFCTAG_OK; + /* Extract Lock Status */ + if (reg_value == 0) { + *pLockDsfid = ST25DV_UNLOCKED; + } else { + *pLockDsfid = ST25DV_LOCKED; + } + return NFCTAG_OK; } /** @@ -588,8 +588,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDsfidRFProtection(ST25DV_LOCK_STA */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadAFI(uint8_t *const pAfi) { - /* Read AFI register */ - return ST25DV_i2c_ReadRegister(pAfi, ST25DV_AFI_REG, 1); + /* Read AFI register */ + return ST25DV_i2c_ReadRegister(pAfi, ST25DV_AFI_REG, 1); } /** @@ -599,22 +599,22 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadAFI(uint8_t *const pAfi) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadAfiRFProtection(ST25DV_LOCK_STATUS *const pLockAfi) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_LOCKAFI_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_LOCKAFI_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Lock Status */ - if (reg_value == 0) { - *pLockAfi = ST25DV_UNLOCKED; - } else { - *pLockAfi = ST25DV_LOCKED; - } - return NFCTAG_OK; + /* Extract Lock Status */ + if (reg_value == 0) { + *pLockAfi = ST25DV_UNLOCKED; + } else { + *pLockAfi = ST25DV_LOCKED; + } + return NFCTAG_OK; } /** @@ -624,22 +624,22 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadAfiRFProtection(ST25DV_LOCK_STATU */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadI2CProtectZone(ST25DV_I2C_PROT_ZONE *const pProtZone) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read value of I2c Protected Zone register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_I2CZSS_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read value of I2c Protected Zone register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_I2CZSS_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Dispatch information to corresponding struct member */ - pProtZone->ProtectZone1 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ1_MASK) >> ST25DV_I2CZSS_PZ1_SHIFT); - pProtZone->ProtectZone2 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ2_MASK) >> ST25DV_I2CZSS_PZ2_SHIFT); - pProtZone->ProtectZone3 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ3_MASK) >> ST25DV_I2CZSS_PZ3_SHIFT); - pProtZone->ProtectZone4 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ4_MASK) >> ST25DV_I2CZSS_PZ4_SHIFT); + /* Dispatch information to corresponding struct member */ + pProtZone->ProtectZone1 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ1_MASK) >> ST25DV_I2CZSS_PZ1_SHIFT); + pProtZone->ProtectZone2 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ2_MASK) >> ST25DV_I2CZSS_PZ2_SHIFT); + pProtZone->ProtectZone3 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ3_MASK) >> ST25DV_I2CZSS_PZ3_SHIFT); + pProtZone->ProtectZone4 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ4_MASK) >> ST25DV_I2CZSS_PZ4_SHIFT); - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -650,13 +650,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadI2CProtectZone(ST25DV_I2C_PROT_ZO */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteLockCFG(const ST25DV_LOCK_STATUS LockCfg) { - uint8_t reg_value; + uint8_t reg_value; - /* Configure value to write on register */ - reg_value = (uint8_t)LockCfg; + /* Configure value to write on register */ + reg_value = (uint8_t)LockCfg; - /* Write LOCKCFG register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_LOCKCFG_REG, 1); + /* Write LOCKCFG register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_LOCKCFG_REG, 1); } /** @@ -666,20 +666,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteLockCFG(const ST25DV_LOCK_STATUS */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_PresentI2CPassword(const ST25DV_PASSWD PassWord) { - uint8_t ai2c_message[17] = {0}; - uint8_t i; + uint8_t ai2c_message[17] = {0}; + uint8_t i; - /* Build I2C Message with Password + Validation code 0x09 + Password */ - ai2c_message[8] = 0x09; - for (i = 0; i < 4; i++) { - ai2c_message[i] = (PassWord.MsbPasswd >> ((3 - i) * 8)) & 0xFF; - ai2c_message[i + 4] = (PassWord.LsbPasswd >> ((3 - i) * 8)) & 0xFF; - ai2c_message[i + 9] = ai2c_message[i]; - ai2c_message[i + 13] = ai2c_message[i + 4]; - }; + /* Build I2C Message with Password + Validation code 0x09 + Password */ + ai2c_message[8] = 0x09; + for (i = 0; i < 4; i++) { + ai2c_message[i] = (PassWord.MsbPasswd >> ((3 - i) * 8)) & 0xFF; + ai2c_message[i + 4] = (PassWord.LsbPasswd >> ((3 - i) * 8)) & 0xFF; + ai2c_message[i + 9] = ai2c_message[i]; + ai2c_message[i + 13] = ai2c_message[i + 4]; + }; - /* Present password to ST25DV */ - return ST25DV_i2c_WriteRegister(ai2c_message, ST25DV_I2CPASSWD_REG, 17); + /* Present password to ST25DV */ + return ST25DV_i2c_WriteRegister(ai2c_message, ST25DV_I2CPASSWD_REG, 17); } /** @@ -690,21 +690,21 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_PresentI2CPassword(const ST25DV_PASSW */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteI2CPassword(const ST25DV_PASSWD PassWord) { - uint8_t ai2c_message[17] = {0}; - uint8_t i; + uint8_t ai2c_message[17] = {0}; + uint8_t i; - /* Build I2C Message with Password + Validation code 0x07 + Password */ - ai2c_message[8] = 0x07; + /* Build I2C Message with Password + Validation code 0x07 + Password */ + ai2c_message[8] = 0x07; - for (i = 0; i < 4; i++) { - ai2c_message[i] = (PassWord.MsbPasswd >> ((3 - i) * 8)) & 0xFF; - ai2c_message[i + 4] = (PassWord.LsbPasswd >> ((3 - i) * 8)) & 0xFF; - ai2c_message[i + 9] = ai2c_message[i]; - ai2c_message[i + 13] = ai2c_message[i + 4]; - }; + for (i = 0; i < 4; i++) { + ai2c_message[i] = (PassWord.MsbPasswd >> ((3 - i) * 8)) & 0xFF; + ai2c_message[i + 4] = (PassWord.LsbPasswd >> ((3 - i) * 8)) & 0xFF; + ai2c_message[i + 9] = ai2c_message[i]; + ai2c_message[i + 13] = ai2c_message[i + 4]; + }; - /* Write new password in I2CPASSWD register */ - return ST25DV_i2c_WriteRegister(ai2c_message, ST25DV_I2CPASSWD_REG, 17); + /* Write new password in I2CPASSWD register */ + return ST25DV_i2c_WriteRegister(ai2c_message, ST25DV_I2CPASSWD_REG, 17); } /** @@ -715,40 +715,40 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteI2CPassword(const ST25DV_PASSWD */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFZxSS(const ST25DV_PROTECTION_ZONE Zone, ST25DV_RF_PROT_ZONE *const pRfprotZone) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; - uint16_t sector_security_addr; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; + uint16_t sector_security_addr; - /* Select Sector Security register address */ - switch (Zone) { + /* Select Sector Security register address */ + switch (Zone) { case ST25DV_PROT_ZONE1: - sector_security_addr = ST25DV_RFZ1SS_REG; - break; + sector_security_addr = ST25DV_RFZ1SS_REG; + break; case ST25DV_PROT_ZONE2: - sector_security_addr = ST25DV_RFZ2SS_REG; - break; + sector_security_addr = ST25DV_RFZ2SS_REG; + break; case ST25DV_PROT_ZONE3: - sector_security_addr = ST25DV_RFZ3SS_REG; - break; + sector_security_addr = ST25DV_RFZ3SS_REG; + break; case ST25DV_PROT_ZONE4: - sector_security_addr = ST25DV_RFZ4SS_REG; - break; + sector_security_addr = ST25DV_RFZ4SS_REG; + break; default: - return NFCTAG_ERROR; - } + return NFCTAG_ERROR; + } - /* Read actual value of Sector Security Status register */ - status = ST25DV_i2c_ReadRegister(®_value, sector_security_addr, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of Sector Security Status register */ + status = ST25DV_i2c_ReadRegister(®_value, sector_security_addr, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Sector Security Status configuration */ - pRfprotZone->PasswdCtrl = (ST25DV_PASSWD_PROT_STATUS)((reg_value & ST25DV_RFZSS_PWDCTRL_MASK) >> ST25DV_RFZSS_PWDCTRL_SHIFT); - pRfprotZone->RWprotection = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_RFZSS_RWPROT_MASK) >> ST25DV_RFZSS_RWPROT_SHIFT); + /* Extract Sector Security Status configuration */ + pRfprotZone->PasswdCtrl = (ST25DV_PASSWD_PROT_STATUS)((reg_value & ST25DV_RFZSS_PWDCTRL_MASK) >> ST25DV_RFZSS_PWDCTRL_SHIFT); + pRfprotZone->RWprotection = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_RFZSS_RWPROT_MASK) >> ST25DV_RFZSS_RWPROT_SHIFT); - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -760,34 +760,34 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFZxSS(const ST25DV_PROTECTION_ZO */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFZxSS(const ST25DV_PROTECTION_ZONE Zone, const ST25DV_RF_PROT_ZONE RfProtZone) { - uint8_t reg_value; - uint16_t sector_security_addr; + uint8_t reg_value; + uint16_t sector_security_addr; - /* Select Sector Security register address */ - switch (Zone) { + /* Select Sector Security register address */ + switch (Zone) { case ST25DV_PROT_ZONE1: - sector_security_addr = ST25DV_RFZ1SS_REG; - break; + sector_security_addr = ST25DV_RFZ1SS_REG; + break; case ST25DV_PROT_ZONE2: - sector_security_addr = ST25DV_RFZ2SS_REG; - break; + sector_security_addr = ST25DV_RFZ2SS_REG; + break; case ST25DV_PROT_ZONE3: - sector_security_addr = ST25DV_RFZ3SS_REG; - break; + sector_security_addr = ST25DV_RFZ3SS_REG; + break; case ST25DV_PROT_ZONE4: - sector_security_addr = ST25DV_RFZ4SS_REG; - break; + sector_security_addr = ST25DV_RFZ4SS_REG; + break; default: - return NFCTAG_ERROR; - } + return NFCTAG_ERROR; + } - /* Update Sector Security Status */ - reg_value = (RfProtZone.RWprotection << ST25DV_RFZSS_RWPROT_SHIFT) & ST25DV_RFZSS_RWPROT_MASK; - reg_value |= ((RfProtZone.PasswdCtrl << ST25DV_RFZSS_PWDCTRL_SHIFT) & ST25DV_RFZSS_PWDCTRL_MASK); + /* Update Sector Security Status */ + reg_value = (RfProtZone.RWprotection << ST25DV_RFZSS_RWPROT_SHIFT) & ST25DV_RFZSS_RWPROT_MASK; + reg_value |= ((RfProtZone.PasswdCtrl << ST25DV_RFZSS_PWDCTRL_SHIFT) & ST25DV_RFZSS_PWDCTRL_MASK); - /* Write Sector Security register */ - return ST25DV_i2c_WriteRegister(®_value, sector_security_addr, 1); + /* Write Sector Security register */ + return ST25DV_i2c_WriteRegister(®_value, sector_security_addr, 1); } /** @@ -798,26 +798,26 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFZxSS(const ST25DV_PROTECTION_Z */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEndZonex(const ST25DV_END_ZONE EndZone, uint8_t *const pEndZ) { - uint16_t mem_addr; + uint16_t mem_addr; - /* End zone register address to read */ - switch (EndZone) { + /* End zone register address to read */ + switch (EndZone) { case ST25DV_ZONE_END1: - mem_addr = ST25DV_END1_REG; - break; + mem_addr = ST25DV_END1_REG; + break; case ST25DV_ZONE_END2: - mem_addr = ST25DV_END2_REG; - break; + mem_addr = ST25DV_END2_REG; + break; case ST25DV_ZONE_END3: - mem_addr = ST25DV_END3_REG; - break; + mem_addr = ST25DV_END3_REG; + break; default: - return NFCTAG_ERROR; - } + return NFCTAG_ERROR; + } - /* Read the corresponding End zone */ - return ST25DV_i2c_ReadRegister(pEndZ, mem_addr, 1); + /* Read the corresponding End zone */ + return ST25DV_i2c_ReadRegister(pEndZ, mem_addr, 1); } /** @@ -831,29 +831,29 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEndZonex(const ST25DV_END_ZONE En */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteEndZonex(const ST25DV_END_ZONE EndZone, const uint8_t EndZ) { - uint16_t mem_addr; - NFCTAG_StatusTypeDef ret; + uint16_t mem_addr; + NFCTAG_StatusTypeDef ret; - /* End zone register address to write */ - switch (EndZone) { + /* End zone register address to write */ + switch (EndZone) { case ST25DV_ZONE_END1: - mem_addr = ST25DV_END1_REG; - break; + mem_addr = ST25DV_END1_REG; + break; case ST25DV_ZONE_END2: - mem_addr = ST25DV_END2_REG; - break; + mem_addr = ST25DV_END2_REG; + break; case ST25DV_ZONE_END3: - mem_addr = ST25DV_END3_REG; - break; + mem_addr = ST25DV_END3_REG; + break; default: - return NFCTAG_ERROR; - } + return NFCTAG_ERROR; + } - /* Write the corresponding End zone value in register */ - ret = ST25DV_i2c_WriteRegister(&EndZ, mem_addr, 1); + /* Write the corresponding End zone value in register */ + ret = ST25DV_i2c_WriteRegister(&EndZ, mem_addr, 1); - return ret; + return ret; } /** @@ -865,38 +865,38 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteEndZonex(const ST25DV_END_ZONE E */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_InitEndZone(void) { - uint8_t endval = 0xFF; - uint32_t maxmemlength; - ST25DV_MEM_SIZE memsize; - NFCTAG_StatusTypeDef ret; - - memsize.Mem_Size = 0; - memsize.BlockSize = 0; + uint8_t endval = 0xFF; + uint32_t maxmemlength; + ST25DV_MEM_SIZE memsize; + NFCTAG_StatusTypeDef ret; - /* Get EEPROM mem size */ - ST25DV_i2c_ReadMemSize(&memsize); - maxmemlength = (memsize.Mem_Size + 1) * (memsize.BlockSize + 1); + memsize.Mem_Size = 0; + memsize.BlockSize = 0; - /* Compute Max value for endzone register */ - endval = (maxmemlength / 32) - 1; + /* Get EEPROM mem size */ + ST25DV_i2c_ReadMemSize(&memsize); + maxmemlength = (memsize.Mem_Size + 1) * (memsize.BlockSize + 1); - /* Write EndZone value to ST25DV registers */ - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END3, endval); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + /* Compute Max value for endzone register */ + endval = (maxmemlength / 32) - 1; - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END2, endval); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + /* Write EndZone value to ST25DV registers */ + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END3, endval); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END1, endval); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END2, endval); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END1, endval); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { return ret; + } + + return ret; } /** @@ -910,68 +910,68 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_InitEndZone(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_CreateUserZone(uint16_t Zone1Length, uint16_t Zone2Length, uint16_t Zone3Length, uint16_t Zone4Length) { - uint8_t EndVal; - ST25DV_MEM_SIZE memsize; - uint16_t maxmemlength = 0; - NFCTAG_StatusTypeDef ret; + uint8_t EndVal; + ST25DV_MEM_SIZE memsize; + uint16_t maxmemlength = 0; + NFCTAG_StatusTypeDef ret; - memsize.Mem_Size = 0; - memsize.BlockSize = 0; + memsize.Mem_Size = 0; + memsize.BlockSize = 0; - ST25DV_i2c_ReadMemSize(&memsize); + ST25DV_i2c_ReadMemSize(&memsize); - maxmemlength = (memsize.Mem_Size + 1) * (memsize.BlockSize + 1); + maxmemlength = (memsize.Mem_Size + 1) * (memsize.BlockSize + 1); - /* Checks that values of different zones are in bounds */ - if ((Zone1Length < 32) || (Zone1Length > maxmemlength) || (Zone2Length > (maxmemlength - 32)) - || (Zone3Length > (maxmemlength - 64)) || (Zone4Length > (maxmemlength - 96))) { - return NFCTAG_ERROR; - } + /* Checks that values of different zones are in bounds */ + if ((Zone1Length < 32) || (Zone1Length > maxmemlength) || (Zone2Length > (maxmemlength - 32)) + || (Zone3Length > (maxmemlength - 64)) || (Zone4Length > (maxmemlength - 96))) { + return NFCTAG_ERROR; + } - /* Checks that the total is less than the authorised maximum */ - if ((Zone1Length + Zone2Length + Zone3Length + Zone4Length) > maxmemlength) { - return NFCTAG_ERROR; - } + /* Checks that the total is less than the authorised maximum */ + if ((Zone1Length + Zone2Length + Zone3Length + Zone4Length) > maxmemlength) { + return NFCTAG_ERROR; + } - /* if The value for each Length is not a multiple of 64 correct it. */ - if ((Zone1Length % 32) != 0) { - Zone1Length = Zone1Length - (Zone1Length % 32); - } + /* if The value for each Length is not a multiple of 64 correct it. */ + if ((Zone1Length % 32) != 0) { + Zone1Length = Zone1Length - (Zone1Length % 32); + } - if ((Zone2Length % 32) != 0) { - Zone2Length = Zone2Length - (Zone2Length % 32); - } + if ((Zone2Length % 32) != 0) { + Zone2Length = Zone2Length - (Zone2Length % 32); + } - if ((Zone3Length % 32) != 0) { - Zone3Length = Zone3Length - (Zone3Length % 32); - } + if ((Zone3Length % 32) != 0) { + Zone3Length = Zone3Length - (Zone3Length % 32); + } - /* First right 0xFF in each Endx value */ - ret = ST25DV_i2c_InitEndZone(); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + /* First right 0xFF in each Endx value */ + ret = ST25DV_i2c_InitEndZone(); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } - /* Then Write corresponding value for each zone */ - EndVal = (uint8_t)((Zone1Length / 32) - 1); - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END1, EndVal); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + /* Then Write corresponding value for each zone */ + EndVal = (uint8_t)((Zone1Length / 32) - 1); + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END1, EndVal); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } - EndVal = (uint8_t)(((Zone1Length + Zone2Length) / 32) - 1); - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END2, EndVal); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + EndVal = (uint8_t)(((Zone1Length + Zone2Length) / 32) - 1); + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END2, EndVal); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } - EndVal = (uint8_t)(((Zone1Length + Zone2Length + Zone3Length) / 32) - 1); - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END3, EndVal); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + EndVal = (uint8_t)(((Zone1Length + Zone2Length + Zone3Length) / 32) - 1); + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END3, EndVal); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -981,20 +981,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_CreateUserZone(uint16_t Zone1Length, */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMemSize(ST25DV_MEM_SIZE *const pSizeInfo) { - uint8_t reg_value[3]; - NFCTAG_StatusTypeDef status; + uint8_t reg_value[3]; + NFCTAG_StatusTypeDef status; - /* Read actual value of MEM_SIZE register */ - status = ST25DV_i2c_ReadRegister(reg_value, ST25DV_MEM_SIZE_REG, 3); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of MEM_SIZE register */ + status = ST25DV_i2c_ReadRegister(reg_value, ST25DV_MEM_SIZE_REG, 3); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Memory information */ - pSizeInfo->BlockSize = reg_value[2]; - pSizeInfo->Mem_Size = reg_value[1]; - pSizeInfo->Mem_Size = (pSizeInfo->Mem_Size << 8) | reg_value[0]; - return NFCTAG_OK; + /* Extract Memory information */ + pSizeInfo->BlockSize = reg_value[2]; + pSizeInfo->Mem_Size = reg_value[1]; + pSizeInfo->Mem_Size = (pSizeInfo->Mem_Size << 8) | reg_value[0]; + return NFCTAG_OK; } /** @@ -1004,23 +1004,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMemSize(ST25DV_MEM_SIZE *const pS */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEHMode(ST25DV_EH_MODE_STATUS *const pEH_mode) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of EH_MODE register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_EH_MODE_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of EH_MODE register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_EH_MODE_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract EH_mode configuration */ - if ((reg_value & ST25DV_EH_MODE_MASK) == ST25DV_EH_MODE_MASK) { - *pEH_mode = ST25DV_EH_ON_DEMAND; - } else { - *pEH_mode = ST25DV_EH_ACTIVE_AFTER_BOOT; - } + /* Extract EH_mode configuration */ + if ((reg_value & ST25DV_EH_MODE_MASK) == ST25DV_EH_MODE_MASK) { + *pEH_mode = ST25DV_EH_ON_DEMAND; + } else { + *pEH_mode = ST25DV_EH_ACTIVE_AFTER_BOOT; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1031,13 +1031,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEHMode(ST25DV_EH_MODE_STATUS *con */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteEHMode(const ST25DV_EH_MODE_STATUS EH_mode) { - uint8_t reg_value; + uint8_t reg_value; - /* Update EH_mode */ - reg_value = (uint8_t)EH_mode; + /* Update EH_mode */ + reg_value = (uint8_t)EH_mode; - /* Write EH_MODE register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_EH_MODE_REG, 1); + /* Write EH_MODE register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_EH_MODE_REG, 1); } /** @@ -1047,29 +1047,29 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteEHMode(const ST25DV_EH_MODE_STAT */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFMngt(ST25DV_RF_MNGT *const pRF_Mngt) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Read actual value of RF_MNGT register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); - if (status == NFCTAG_OK) { - /* Extract RF Disable information */ - if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { - pRF_Mngt->RfDisable = ST25DV_ENABLE; - } else { - pRF_Mngt->RfDisable = ST25DV_DISABLE; - } - - /* Extract RF Sleep information */ - if ((reg_value & ST25DV_RF_MNGT_RFSLEEP_MASK) == ST25DV_RF_MNGT_RFSLEEP_MASK) { - pRF_Mngt->RfSleep = ST25DV_ENABLE; - } else { - pRF_Mngt->RfSleep = ST25DV_DISABLE; - } + if (status == NFCTAG_OK) { + /* Extract RF Disable information */ + if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { + pRF_Mngt->RfDisable = ST25DV_ENABLE; + } else { + pRF_Mngt->RfDisable = ST25DV_DISABLE; } - return status; + /* Extract RF Sleep information */ + if ((reg_value & ST25DV_RF_MNGT_RFSLEEP_MASK) == ST25DV_RF_MNGT_RFSLEEP_MASK) { + pRF_Mngt->RfSleep = ST25DV_ENABLE; + } else { + pRF_Mngt->RfSleep = ST25DV_DISABLE; + } + } + + return status; } /** @@ -1080,8 +1080,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFMngt(ST25DV_RF_MNGT *const pRF_ */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFMngt(const uint8_t Rfmngt) { - /* Write RF_MNGT register */ - return ST25DV_i2c_WriteRegister(&Rfmngt, ST25DV_RF_MNGT_REG, 1); + /* Write RF_MNGT register */ + return ST25DV_i2c_WriteRegister(&Rfmngt, ST25DV_RF_MNGT_REG, 1); } /** @@ -1091,23 +1091,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFMngt(const uint8_t Rfmngt) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFDisable(ST25DV_EN_STATUS *const pRFDisable) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Read actual value of RF_MNGT register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_REG, 1); - /* Extract RFDisable information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { - *pRFDisable = ST25DV_ENABLE; - } else { - *pRFDisable = ST25DV_DISABLE; - } - return NFCTAG_OK; + /* Extract RFDisable information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { + *pRFDisable = ST25DV_ENABLE; + } else { + *pRFDisable = ST25DV_DISABLE; } + return NFCTAG_OK; + } - return status; + return status; } /** @@ -1117,20 +1117,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFDisable(ST25DV_EN_STATUS *const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFDisable(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_RMNGT register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_RMNGT register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update RF Disable field configuration */ - reg_value |= ST25DV_RF_MNGT_RFDIS_MASK; + /* Update RF Disable field configuration */ + reg_value |= ST25DV_RF_MNGT_RFDIS_MASK; - /* Write RF_MNGT register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Write RF_MNGT register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); } /** @@ -1140,20 +1140,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFDisable(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFDisable(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_RMNGT register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_RMNGT register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update RF Disable field configuration */ - reg_value &= ST25DV_RF_MNGT_RFDIS_FIELD; + /* Update RF Disable field configuration */ + reg_value &= ST25DV_RF_MNGT_RFDIS_FIELD; - /* Write RF_MNGT register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Write RF_MNGT register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); } /** @@ -1163,23 +1163,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFDisable(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFSleep(ST25DV_EN_STATUS *const pRFSleep) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Read actual value of RF_MNGT register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_REG, 1); - /* Extract RFSleep information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { - *pRFSleep = ST25DV_ENABLE; - } else { - *pRFSleep = ST25DV_DISABLE; - } - return NFCTAG_OK; + /* Extract RFSleep information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { + *pRFSleep = ST25DV_ENABLE; + } else { + *pRFSleep = ST25DV_DISABLE; } + return NFCTAG_OK; + } - return status; + return status; } /** @@ -1189,20 +1189,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFSleep(ST25DV_EN_STATUS *const pR */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFSleep(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_RMNGT register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_RMNGT register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update RF Sleep field configuration */ - reg_value |= ST25DV_RF_MNGT_RFSLEEP_MASK; + /* Update RF Sleep field configuration */ + reg_value |= ST25DV_RF_MNGT_RFSLEEP_MASK; - /* Write RF_MNGT register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Write RF_MNGT register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); } /** @@ -1212,20 +1212,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFSleep(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFSleep(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_RMNGT register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_RMNGT register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update RF Sleep field configuration */ - reg_value &= ST25DV_RF_MNGT_RFSLEEP_FIELD; + /* Update RF Sleep field configuration */ + reg_value &= ST25DV_RF_MNGT_RFSLEEP_FIELD; - /* Write RF_MNGT register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Write RF_MNGT register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); } /** @@ -1235,23 +1235,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFSleep(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBMode(ST25DV_EN_STATUS *const pMB_mode) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of MB_MODE register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_MB_MODE_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of MB_MODE register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_MB_MODE_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Mailbox mode status */ - if ((reg_value & ST25DV_MB_MODE_RW_MASK) == ST25DV_MB_MODE_RW_MASK) { - *pMB_mode = ST25DV_ENABLE; - } else { - *pMB_mode = ST25DV_DISABLE; - } + /* Extract Mailbox mode status */ + if ((reg_value & ST25DV_MB_MODE_RW_MASK) == ST25DV_MB_MODE_RW_MASK) { + *pMB_mode = ST25DV_ENABLE; + } else { + *pMB_mode = ST25DV_DISABLE; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1262,13 +1262,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBMode(ST25DV_EN_STATUS *const pM */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMBMode(const ST25DV_EN_STATUS MB_mode) { - uint8_t reg_value; + uint8_t reg_value; - /* Update Mailbox mode status */ - reg_value = (uint8_t)MB_mode; + /* Update Mailbox mode status */ + reg_value = (uint8_t)MB_mode; - /* Write MB_MODE register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_MB_MODE_REG, 1); + /* Write MB_MODE register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_MB_MODE_REG, 1); } /** @@ -1278,19 +1278,19 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMBMode(const ST25DV_EN_STATUS MB */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBWDG(uint8_t *const pWdgDelay) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of MB_WDG register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_MB_WDG_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of MB_WDG register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_MB_WDG_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract watchdog coefficient delay configuration */ - *pWdgDelay = (reg_value & ST25DV_MB_WDG_DELAY_MASK) >> ST25DV_MB_WDG_DELAY_RW_SHIFT; + /* Extract watchdog coefficient delay configuration */ + *pWdgDelay = (reg_value & ST25DV_MB_WDG_DELAY_MASK) >> ST25DV_MB_WDG_DELAY_RW_SHIFT; - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1301,13 +1301,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBWDG(uint8_t *const pWdgDelay) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMBWDG(const uint8_t WdgDelay) { - uint8_t reg_value; + uint8_t reg_value; - /* Set Watchdog coefficient delay */ - reg_value = WdgDelay & ST25DV_MB_WDG_DELAY_MASK; + /* Set Watchdog coefficient delay */ + reg_value = WdgDelay & ST25DV_MB_WDG_DELAY_MASK; - /* Write MB_MODE register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_MB_WDG_REG, 1); + /* Write MB_MODE register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_MB_WDG_REG, 1); } /** @@ -1319,12 +1319,12 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMBWDG(const uint8_t WdgDelay) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMailboxData(uint8_t *const pData, const uint16_t Offset, const uint16_t NbByte) { - if (Offset > ST25DV_MAX_MAILBOX_LENGTH) { - return NFCTAG_ERROR; - } + if (Offset > ST25DV_MAX_MAILBOX_LENGTH) { + return NFCTAG_ERROR; + } - /* Read Data in user memory */ - return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, ST25DV_MAILBOX_RAM_REG + Offset, NbByte); + /* Read Data in user memory */ + return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, ST25DV_MAILBOX_RAM_REG + Offset, NbByte); } /** @@ -1335,17 +1335,17 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMailboxData(uint8_t *const pData, */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMailboxData(const uint8_t *const pData, const uint16_t NbByte) { - NFCTAG_StatusTypeDef status; + NFCTAG_StatusTypeDef status; - /* ST25DV can write a maximum of 256 bytes in Mailbox */ - if (NbByte < ST25DV_MAX_MAILBOX_LENGTH) { - /* Write NbByte data in memory */ - status = ST25DV_IO_MemWrite(pData, ST25DV_ADDR_DATA_I2C, ST25DV_MAILBOX_RAM_REG, NbByte); - } else { - status = NFCTAG_ERROR; - } + /* ST25DV can write a maximum of 256 bytes in Mailbox */ + if (NbByte < ST25DV_MAX_MAILBOX_LENGTH) { + /* Write NbByte data in memory */ + status = ST25DV_IO_MemWrite(pData, ST25DV_ADDR_DATA_I2C, ST25DV_MAILBOX_RAM_REG, NbByte); + } else { + status = NFCTAG_ERROR; + } - return status; + return status; } /** @@ -1357,11 +1357,11 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMailboxData(const uint8_t *const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMailboxRegister(uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - if ((TarAddr < ST25DV_GPO_DYN_REG) || (TarAddr > ST25DV_MB_LEN_DYN_REG)) { - return NFCTAG_ERROR; - } + if ((TarAddr < ST25DV_GPO_DYN_REG) || (TarAddr > ST25DV_MB_LEN_DYN_REG)) { + return NFCTAG_ERROR; + } - return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); + return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); } /** @@ -1373,21 +1373,21 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMailboxRegister(uint8_t *const pD */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMailboxRegister(const uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - NFCTAG_StatusTypeDef status; + NFCTAG_StatusTypeDef status; - if ((TarAddr < ST25DV_GPO_DYN_REG) || (TarAddr > ST25DV_MB_LEN_DYN_REG)) { - return NFCTAG_ERROR; - } + if ((TarAddr < ST25DV_GPO_DYN_REG) || (TarAddr > ST25DV_MB_LEN_DYN_REG)) { + return NFCTAG_ERROR; + } - /* ST25DV can write a maximum of 256 bytes in Mailbox */ - if (NbByte < ST25DV_MAX_MAILBOX_LENGTH) { - /* Write NbByte data in memory */ - status = ST25DV_IO_MemWrite(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); - } else { - status = NFCTAG_ERROR; - } + /* ST25DV can write a maximum of 256 bytes in Mailbox */ + if (NbByte < ST25DV_MAX_MAILBOX_LENGTH) { + /* Write NbByte data in memory */ + status = ST25DV_IO_MemWrite(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); + } else { + status = NFCTAG_ERROR; + } - return status; + return status; } /** @@ -1397,23 +1397,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMailboxRegister(const uint8_t *c */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadI2CSecuritySession_Dyn(ST25DV_I2CSSO_STATUS *const pSession) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of I2C_SSO_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_I2C_SSO_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of I2C_SSO_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_I2C_SSO_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Open session information */ - if ((reg_value & ST25DV_I2C_SSO_DYN_I2CSSO_MASK) == ST25DV_I2C_SSO_DYN_I2CSSO_MASK) { - *pSession = ST25DV_SESSION_OPEN; - } else { - *pSession = ST25DV_SESSION_CLOSED; - } + /* Extract Open session information */ + if ((reg_value & ST25DV_I2C_SSO_DYN_I2CSSO_MASK) == ST25DV_I2C_SSO_DYN_I2CSSO_MASK) { + *pSession = ST25DV_SESSION_OPEN; + } else { + *pSession = ST25DV_SESSION_CLOSED; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1432,8 +1432,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadI2CSecuritySession_Dyn(ST25DV_I2C */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadITSTStatus_Dyn(uint8_t *const pITStatus) { - /* Read value of ITStatus register */ - return ST25DV_i2c_ReadMailboxRegister(pITStatus, ST25DV_ITSTS_DYN_REG, 1); + /* Read value of ITStatus register */ + return ST25DV_i2c_ReadMailboxRegister(pITStatus, ST25DV_ITSTS_DYN_REG, 1); } /** @@ -1443,8 +1443,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadITSTStatus_Dyn(uint8_t *const pIT */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadGPO_Dyn(uint8_t *GPOConfig) { - /* Read actual value of ST25DV_GPO_DYN_REG register */ - return ST25DV_i2c_ReadMailboxRegister(GPOConfig, ST25DV_GPO_DYN_REG, 1); + /* Read actual value of ST25DV_GPO_DYN_REG register */ + return ST25DV_i2c_ReadMailboxRegister(GPOConfig, ST25DV_GPO_DYN_REG, 1); } @@ -1455,22 +1455,22 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadGPO_Dyn(uint8_t *GPOConfig) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetGPO_en_Dyn(ST25DV_EN_STATUS *const pGPO_en) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; - /* Read actual value of GPO_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + uint8_t reg_value; + NFCTAG_StatusTypeDef status; + /* Read actual value of GPO_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract GPO enable status information */ - if ((reg_value & ST25DV_GPO_DYN_ENABLE_MASK) == ST25DV_GPO_DYN_ENABLE_MASK) { - *pGPO_en = ST25DV_ENABLE; - } else { - *pGPO_en = ST25DV_DISABLE; - } + /* Extract GPO enable status information */ + if ((reg_value & ST25DV_GPO_DYN_ENABLE_MASK) == ST25DV_GPO_DYN_ENABLE_MASK) { + *pGPO_en = ST25DV_ENABLE; + } else { + *pGPO_en = ST25DV_DISABLE; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1480,20 +1480,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetGPO_en_Dyn(ST25DV_EN_STATUS *const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetGPO_en_Dyn(void) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of GPO_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of GPO_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update GPO enable configuration */ - reg_value |= ST25DV_GPO_DYN_ENABLE_MASK; + /* Update GPO enable configuration */ + reg_value |= ST25DV_GPO_DYN_ENABLE_MASK; - /* Write GPO_DYN Register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); + /* Write GPO_DYN Register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); } /** @@ -1503,20 +1503,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetGPO_en_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetGPO_en_Dyn(void) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of GPO_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of GPO_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update GPO enable configuration */ - reg_value &= ST25DV_GPO_DYN_ENABLE_FIELD; + /* Update GPO enable configuration */ + reg_value &= ST25DV_GPO_DYN_ENABLE_FIELD; - /* Write GPO_DYN Register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); + /* Write GPO_DYN Register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); } /** @@ -1526,45 +1526,45 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetGPO_en_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEHCtrl_Dyn(ST25DV_EH_CTRL *const pEH_CTRL) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of ST25DV_EH_CTRL_DYN_REG register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + /* Read actual value of ST25DV_EH_CTRL_DYN_REG register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - if (status == NFCTAG_OK) { - /* Extract EH EN Mode configuration */ - if ((reg_value & ST25DV_EH_CTRL_DYN_EH_EN_MASK) == ST25DV_EH_CTRL_DYN_EH_EN_MASK) { - pEH_CTRL->EH_EN_Mode = ST25DV_ENABLE; - } else { - pEH_CTRL->EH_EN_Mode = ST25DV_DISABLE; - } - - /* Extract EH_ON configuration */ - if ((reg_value & ST25DV_EH_CTRL_DYN_EH_ON_MASK) == ST25DV_EH_CTRL_DYN_EH_ON_MASK) { - pEH_CTRL->EH_on = ST25DV_ENABLE; - } else { - pEH_CTRL->EH_on = ST25DV_DISABLE; - } - - /* Extract FIELD_ON configuration */ - if ((reg_value & ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) == ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) { - pEH_CTRL->Field_on = ST25DV_ENABLE; - } else { - pEH_CTRL->Field_on = ST25DV_DISABLE; - } - - /* Extract VCC_ON configuration */ - if ((reg_value & ST25DV_EH_CTRL_DYN_VCC_ON_MASK) == ST25DV_EH_CTRL_DYN_VCC_ON_MASK) { - pEH_CTRL->VCC_on = ST25DV_ENABLE; - } else { - pEH_CTRL->VCC_on = ST25DV_DISABLE; - } - - return NFCTAG_OK; + if (status == NFCTAG_OK) { + /* Extract EH EN Mode configuration */ + if ((reg_value & ST25DV_EH_CTRL_DYN_EH_EN_MASK) == ST25DV_EH_CTRL_DYN_EH_EN_MASK) { + pEH_CTRL->EH_EN_Mode = ST25DV_ENABLE; + } else { + pEH_CTRL->EH_EN_Mode = ST25DV_DISABLE; } - return status; + /* Extract EH_ON configuration */ + if ((reg_value & ST25DV_EH_CTRL_DYN_EH_ON_MASK) == ST25DV_EH_CTRL_DYN_EH_ON_MASK) { + pEH_CTRL->EH_on = ST25DV_ENABLE; + } else { + pEH_CTRL->EH_on = ST25DV_DISABLE; + } + + /* Extract FIELD_ON configuration */ + if ((reg_value & ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) == ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) { + pEH_CTRL->Field_on = ST25DV_ENABLE; + } else { + pEH_CTRL->Field_on = ST25DV_DISABLE; + } + + /* Extract VCC_ON configuration */ + if ((reg_value & ST25DV_EH_CTRL_DYN_VCC_ON_MASK) == ST25DV_EH_CTRL_DYN_VCC_ON_MASK) { + pEH_CTRL->VCC_on = ST25DV_ENABLE; + } else { + pEH_CTRL->VCC_on = ST25DV_DISABLE; + } + + return NFCTAG_OK; + } + + return status; } /** @@ -1574,23 +1574,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEHCtrl_Dyn(ST25DV_EH_CTRL *const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetEHENMode_Dyn(ST25DV_EN_STATUS *const pEH_Val) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Energy Harvesting status information */ - if ((reg_value & ST25DV_EH_CTRL_DYN_EH_EN_MASK) == ST25DV_EH_CTRL_DYN_EH_EN_MASK) { - *pEH_Val = ST25DV_ENABLE; - } else { - *pEH_Val = ST25DV_DISABLE; - } + /* Extract Energy Harvesting status information */ + if ((reg_value & ST25DV_EH_CTRL_DYN_EH_EN_MASK) == ST25DV_EH_CTRL_DYN_EH_EN_MASK) { + *pEH_Val = ST25DV_ENABLE; + } else { + *pEH_Val = ST25DV_DISABLE; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1599,20 +1599,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetEHENMode_Dyn(ST25DV_EN_STATUS *con */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetEHENMode_Dyn(void) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update Energy Harvesting configuration */ - reg_value |= ST25DV_EH_CTRL_DYN_EH_EN_MASK; + /* Update Energy Harvesting configuration */ + reg_value |= ST25DV_EH_CTRL_DYN_EH_EN_MASK; - /* Write EH_CTRL_DYN Register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + /* Write EH_CTRL_DYN Register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); } /** @@ -1621,20 +1621,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetEHENMode_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetEHENMode_Dyn(void) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update Energy Harvesting configuration */ - reg_value &= ST25DV_EH_CTRL_DYN_EH_EN_FIELD; + /* Update Energy Harvesting configuration */ + reg_value &= ST25DV_EH_CTRL_DYN_EH_EN_FIELD; - /* Write EH_CTRL_DYN Register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + /* Write EH_CTRL_DYN Register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); } /** @@ -1644,23 +1644,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetEHENMode_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetEHON_Dyn(ST25DV_EN_STATUS *const pEHON) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - /* Extract RF Field information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_EH_CTRL_DYN_EH_ON_MASK) == ST25DV_EH_CTRL_DYN_EH_ON_MASK) { - *pEHON = ST25DV_ENABLE; - } else { - *pEHON = ST25DV_DISABLE; - } - return NFCTAG_OK; + /* Extract RF Field information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_EH_CTRL_DYN_EH_ON_MASK) == ST25DV_EH_CTRL_DYN_EH_ON_MASK) { + *pEHON = ST25DV_ENABLE; + } else { + *pEHON = ST25DV_DISABLE; } + return NFCTAG_OK; + } - return status; + return status; } /** @@ -1670,23 +1670,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetEHON_Dyn(ST25DV_EN_STATUS *const p */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFField_Dyn(ST25DV_FIELD_STATUS *const pRF_Field) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - /* Extract RF Field information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) == ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) { - *pRF_Field = ST25DV_FIELD_ON; - } else { - *pRF_Field = ST25DV_FIELD_OFF; - } - return NFCTAG_OK; + /* Extract RF Field information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) == ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) { + *pRF_Field = ST25DV_FIELD_ON; + } else { + *pRF_Field = ST25DV_FIELD_OFF; } + return NFCTAG_OK; + } - return status; + return status; } /** @@ -1696,23 +1696,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFField_Dyn(ST25DV_FIELD_STATUS *c */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetVCC_Dyn(ST25DV_VCC_STATUS *const pVCC) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - /* Extract VCC information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_EH_CTRL_DYN_VCC_ON_MASK) == ST25DV_EH_CTRL_DYN_VCC_ON_MASK) { - *pVCC = ST25DV_VCC_ON; - } else { - *pVCC = ST25DV_VCC_OFF; - } - return NFCTAG_OK; + /* Extract VCC information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_EH_CTRL_DYN_VCC_ON_MASK) == ST25DV_EH_CTRL_DYN_VCC_ON_MASK) { + *pVCC = ST25DV_VCC_ON; + } else { + *pVCC = ST25DV_VCC_OFF; } + return NFCTAG_OK; + } - return status; + return status; } /** @@ -1722,31 +1722,31 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetVCC_Dyn(ST25DV_VCC_STATUS *const p */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFMngt_Dyn(ST25DV_RF_MNGT *const pRF_Mngt) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - if (status == NFCTAG_OK) { - /* Extract RF Disable configuration */ - if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { - pRF_Mngt->RfDisable = ST25DV_ENABLE; - } else { - pRF_Mngt->RfDisable = ST25DV_DISABLE; - } - - /* Extract RF Sleep configuration */ - if ((reg_value & ST25DV_RF_MNGT_DYN_RFSLEEP_MASK) == ST25DV_RF_MNGT_DYN_RFSLEEP_MASK) { - pRF_Mngt->RfSleep = ST25DV_ENABLE; - } else { - pRF_Mngt->RfSleep = ST25DV_DISABLE; - } - - return NFCTAG_OK; + if (status == NFCTAG_OK) { + /* Extract RF Disable configuration */ + if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { + pRF_Mngt->RfDisable = ST25DV_ENABLE; + } else { + pRF_Mngt->RfDisable = ST25DV_DISABLE; } - return status; + /* Extract RF Sleep configuration */ + if ((reg_value & ST25DV_RF_MNGT_DYN_RFSLEEP_MASK) == ST25DV_RF_MNGT_DYN_RFSLEEP_MASK) { + pRF_Mngt->RfSleep = ST25DV_ENABLE; + } else { + pRF_Mngt->RfSleep = ST25DV_DISABLE; + } + + return NFCTAG_OK; + } + + return status; } /** @@ -1756,8 +1756,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFMngt_Dyn(ST25DV_RF_MNGT *const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFMngt_Dyn(const uint8_t RF_Mngt) { - /* Write value to RF_MNGT_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(&RF_Mngt, ST25DV_RF_MNGT_DYN_REG, 1); + /* Write value to RF_MNGT_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(&RF_Mngt, ST25DV_RF_MNGT_DYN_REG, 1); } /** @@ -1767,23 +1767,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFMngt_Dyn(const uint8_t RF_Mngt */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFDisable_Dyn(ST25DV_EN_STATUS *const pRFDisable) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - /* Extract RFDisable information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { - *pRFDisable = ST25DV_ENABLE; - } else { - *pRFDisable = ST25DV_DISABLE; - } - return NFCTAG_OK; + /* Extract RFDisable information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { + *pRFDisable = ST25DV_ENABLE; + } else { + *pRFDisable = ST25DV_DISABLE; } + return NFCTAG_OK; + } - return status; + return status; } /** @@ -1792,20 +1792,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFDisable_Dyn(ST25DV_EN_STATUS *co */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFDisable_Dyn(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update dynamic RF Disable field */ - reg_value |= ST25DV_RF_MNGT_DYN_RFDIS_MASK; + /* Update dynamic RF Disable field */ + reg_value |= ST25DV_RF_MNGT_DYN_RFDIS_MASK; - /* Write RF_MNGT_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Write RF_MNGT_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); } /** @@ -1814,20 +1814,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFDisable_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFDisable_Dyn(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update dynamic RF Disable field configuration */ - reg_value &= ST25DV_RF_MNGT_DYN_RFDIS_FIELD; + /* Update dynamic RF Disable field configuration */ + reg_value &= ST25DV_RF_MNGT_DYN_RFDIS_FIELD; - /* Write RF_MNGT_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Write RF_MNGT_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); } /** @@ -1837,23 +1837,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFDisable_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFSleep_Dyn(ST25DV_EN_STATUS *const pRFSleep) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - /* Extract RFSleep information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { - *pRFSleep = ST25DV_ENABLE; - } else { - *pRFSleep = ST25DV_DISABLE; - } - return NFCTAG_OK; + /* Extract RFSleep information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { + *pRFSleep = ST25DV_ENABLE; + } else { + *pRFSleep = ST25DV_DISABLE; } + return NFCTAG_OK; + } - return status; + return status; } /** @@ -1862,20 +1862,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFSleep_Dyn(ST25DV_EN_STATUS *cons */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFSleep_Dyn(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update dynamic RF Disable field configuration */ - reg_value |= ST25DV_RF_MNGT_DYN_RFSLEEP_MASK; + /* Update dynamic RF Disable field configuration */ + reg_value |= ST25DV_RF_MNGT_DYN_RFSLEEP_MASK; - /* Write RF_MNGT_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Write RF_MNGT_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); } /** @@ -1884,20 +1884,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFSleep_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFSleep_Dyn(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update dynamic RF Disable field configuration */ - reg_value &= ST25DV_RF_MNGT_DYN_RFSLEEP_FIELD; + /* Update dynamic RF Disable field configuration */ + reg_value &= ST25DV_RF_MNGT_DYN_RFSLEEP_FIELD; - /* Write RF_MNGT_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Write RF_MNGT_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); } /** @@ -1907,24 +1907,24 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFSleep_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBCtrl_Dyn(ST25DV_MB_CTRL_DYN_STATUS *const pCtrlStatus) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read MB_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read MB_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Mailbox ctrl information */ - pCtrlStatus->MbEnable = (reg_value & ST25DV_MB_CTRL_DYN_MBEN_MASK) >> ST25DV_MB_CTRL_DYN_MBEN_SHIFT; - pCtrlStatus->HostPutMsg = (reg_value & ST25DV_MB_CTRL_DYN_HOSTPUTMSG_MASK) >> ST25DV_MB_CTRL_DYN_HOSTPUTMSG_SHIFT; - pCtrlStatus->RfPutMsg = (reg_value & ST25DV_MB_CTRL_DYN_RFPUTMSG_MASK) >> ST25DV_MB_CTRL_DYN_RFPUTMSG_SHIFT; - pCtrlStatus->HostMissMsg = (reg_value & ST25DV_MB_CTRL_DYN_HOSTMISSMSG_MASK) >> ST25DV_MB_CTRL_DYN_HOSTMISSMSG_SHIFT; - pCtrlStatus->RFMissMsg = (reg_value & ST25DV_MB_CTRL_DYN_RFMISSMSG_MASK) >> ST25DV_MB_CTRL_DYN_RFMISSMSG_SHIFT; - pCtrlStatus->CurrentMsg = (ST25DV_CURRENT_MSG)((reg_value & ST25DV_MB_CTRL_DYN_CURRENTMSG_MASK) >> ST25DV_MB_CTRL_DYN_CURRENTMSG_SHIFT); + /* Extract Mailbox ctrl information */ + pCtrlStatus->MbEnable = (reg_value & ST25DV_MB_CTRL_DYN_MBEN_MASK) >> ST25DV_MB_CTRL_DYN_MBEN_SHIFT; + pCtrlStatus->HostPutMsg = (reg_value & ST25DV_MB_CTRL_DYN_HOSTPUTMSG_MASK) >> ST25DV_MB_CTRL_DYN_HOSTPUTMSG_SHIFT; + pCtrlStatus->RfPutMsg = (reg_value & ST25DV_MB_CTRL_DYN_RFPUTMSG_MASK) >> ST25DV_MB_CTRL_DYN_RFPUTMSG_SHIFT; + pCtrlStatus->HostMissMsg = (reg_value & ST25DV_MB_CTRL_DYN_HOSTMISSMSG_MASK) >> ST25DV_MB_CTRL_DYN_HOSTMISSMSG_SHIFT; + pCtrlStatus->RFMissMsg = (reg_value & ST25DV_MB_CTRL_DYN_RFMISSMSG_MASK) >> ST25DV_MB_CTRL_DYN_RFMISSMSG_SHIFT; + pCtrlStatus->CurrentMsg = (ST25DV_CURRENT_MSG)((reg_value & ST25DV_MB_CTRL_DYN_CURRENTMSG_MASK) >> ST25DV_MB_CTRL_DYN_CURRENTMSG_SHIFT); - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1933,22 +1933,22 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBCtrl_Dyn(ST25DV_MB_CTRL_DYN_STA */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetMBEN_Dyn(ST25DV_EN_STATUS *const pMBEN) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read MB_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read MB_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - if ((reg_value & ST25DV_MB_MODE_RW_MASK) == ST25DV_MB_MODE_RW_MASK) { - *pMBEN = ST25DV_ENABLE; - } else { - *pMBEN = ST25DV_DISABLE; - } + if ((reg_value & ST25DV_MB_MODE_RW_MASK) == ST25DV_MB_MODE_RW_MASK) { + *pMBEN = ST25DV_ENABLE; + } else { + *pMBEN = ST25DV_DISABLE; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1957,13 +1957,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetMBEN_Dyn(ST25DV_EN_STATUS *const p */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetMBEN_Dyn(void) { - uint8_t reg_value; + uint8_t reg_value; - /* Set dynamic Mailbox enable */ - reg_value = ST25DV_MB_CTRL_DYN_MBEN_MASK; + /* Set dynamic Mailbox enable */ + reg_value = ST25DV_MB_CTRL_DYN_MBEN_MASK; - /* Write MB_CTRL_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); + /* Write MB_CTRL_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); } /** @@ -1972,13 +1972,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetMBEN_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetMBEN_Dyn(void) { - uint8_t reg_value; + uint8_t reg_value; - /* Set dynamic Mailbox disable */ - reg_value = 0; + /* Set dynamic Mailbox disable */ + reg_value = 0; - /* Write MB_CTRL_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); + /* Write MB_CTRL_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); } /** @@ -1988,26 +1988,26 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetMBEN_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBLength_Dyn(uint8_t *const pMBLength) { - /* Read actual value of MBLEN_DYN register */ - return ST25DV_i2c_ReadMailboxRegister(pMBLength, ST25DV_MB_LEN_DYN_REG, 1); + /* Read actual value of MBLEN_DYN register */ + return ST25DV_i2c_ReadMailboxRegister(pMBLength, ST25DV_MB_LEN_DYN_REG, 1); } int32_t ST25DV_IO::get_gpo() { - return _gpo; + return _gpo; } int32_t ST25DV_IO::get_lpd() { - return _lpd; + return _lpd; } TwoWire *ST25DV_IO::get_pwire() { - return _pwire; + return _pwire; } Stream *ST25DV_IO::get_pserial() { - return _serial; + return _serial; } diff --git a/src/ST25DV_IO/st25dv_io.h b/src/ST25DV_IO/st25dv_io.h index 1468103..f5b4d2b 100644 --- a/src/ST25DV_IO/st25dv_io.h +++ b/src/ST25DV_IO/st25dv_io.h @@ -336,231 +336,231 @@ * @brief ST25DV Ack Nack enumerator definition */ typedef enum { - I2CANSW_ACK = 0, - I2CANSW_NACK + I2CANSW_ACK = 0, + I2CANSW_NACK } ST25DV_I2CANSW_E; /** * @brief NFCTAG status enumerator definition. */ typedef enum { - NFCTAG_OK = 0, - NFCTAG_ERROR = 1, - NFCTAG_BUSY = 2, - NFCTAG_TIMEOUT = 3, - NFCTAG_NACK = 4 + NFCTAG_OK = 0, + NFCTAG_ERROR = 1, + NFCTAG_BUSY = 2, + NFCTAG_TIMEOUT = 3, + NFCTAG_NACK = 4 } NFCTAG_StatusTypeDef; /** * @brief ST25DV Enable Disable enumerator definition. */ typedef enum { - ST25DV_DISABLE = 0, - ST25DV_ENABLE + ST25DV_DISABLE = 0, + ST25DV_ENABLE } ST25DV_EN_STATUS; /** * @brief ST25DV Energy Harvesting mode enumerator definition. */ typedef enum { - ST25DV_EH_ACTIVE_AFTER_BOOT = 0, - ST25DV_EH_ON_DEMAND + ST25DV_EH_ACTIVE_AFTER_BOOT = 0, + ST25DV_EH_ON_DEMAND } ST25DV_EH_MODE_STATUS; /** * @brief ST25DV FIELD status enumerator definition. */ typedef enum { - ST25DV_FIELD_OFF = 0, - ST25DV_FIELD_ON + ST25DV_FIELD_OFF = 0, + ST25DV_FIELD_ON } ST25DV_FIELD_STATUS; /** * @brief ST25DV VCC status enumerator definition */ typedef enum { - ST25DV_VCC_OFF = 0, - ST25DV_VCC_ON + ST25DV_VCC_OFF = 0, + ST25DV_VCC_ON } ST25DV_VCC_STATUS; /** * @brief ST25DV protection status enumerator definition */ typedef enum { - ST25DV_NO_PROT = 0, - ST25DV_WRITE_PROT, - ST25DV_READ_PROT, - ST25DV_READWRITE_PROT + ST25DV_NO_PROT = 0, + ST25DV_WRITE_PROT, + ST25DV_READ_PROT, + ST25DV_READWRITE_PROT } ST25DV_PROTECTION_CONF; /** * @brief ST25DV area protection enumerator definition. */ typedef enum { - ST25DV_PROT_ZONE1 = 0, - ST25DV_PROT_ZONE2, - ST25DV_PROT_ZONE3, - ST25DV_PROT_ZONE4 + ST25DV_PROT_ZONE1 = 0, + ST25DV_PROT_ZONE2, + ST25DV_PROT_ZONE3, + ST25DV_PROT_ZONE4 } ST25DV_PROTECTION_ZONE; /** * @brief ST25DV password protection status enumerator definition. */ typedef enum { - ST25DV_NOT_PROTECTED = 0, - ST25DV_PROT_PASSWD1, - ST25DV_PROT_PASSWD2, - ST25DV_PROT_PASSWD3 + ST25DV_NOT_PROTECTED = 0, + ST25DV_PROT_PASSWD1, + ST25DV_PROT_PASSWD2, + ST25DV_PROT_PASSWD3 } ST25DV_PASSWD_PROT_STATUS; /** * @brief ST25DV lock status enumerator definition. */ typedef enum { - ST25DV_UNLOCKED = 0, - ST25DV_LOCKED + ST25DV_UNLOCKED = 0, + ST25DV_LOCKED } ST25DV_LOCK_STATUS; /** * @brief ST25DV Number of Blocks for the CCFile enumerator definition. */ typedef enum { - ST25DV_CCFILE_1BLCK = 0, - ST25DV_CCFILE_2BLCK + ST25DV_CCFILE_1BLCK = 0, + ST25DV_CCFILE_2BLCK } ST25DV_CCFILE_BLOCK; /** * @brief ST25DV session status enumerator definition. */ typedef enum { - ST25DV_SESSION_CLOSED = 0, - ST25DV_SESSION_OPEN + ST25DV_SESSION_CLOSED = 0, + ST25DV_SESSION_OPEN } ST25DV_I2CSSO_STATUS; /** * @brief ST25DV area end address enumerator definition. */ typedef enum { - ST25DV_ZONE_END1 = 0, - ST25DV_ZONE_END2, - ST25DV_ZONE_END3 + ST25DV_ZONE_END1 = 0, + ST25DV_ZONE_END2, + ST25DV_ZONE_END3 } ST25DV_END_ZONE; /** * @brief ST25DV IT pulse duration enumerator definition. */ typedef enum { - ST25DV_302_US = 0, - ST25DV_264_US, - ST25DV_226_US, - ST25DV_188_US, - ST25DV_151_US, - ST25DV_113_US, - ST25DV_75_US, - ST25DV_37_US + ST25DV_302_US = 0, + ST25DV_264_US, + ST25DV_226_US, + ST25DV_188_US, + ST25DV_151_US, + ST25DV_113_US, + ST25DV_75_US, + ST25DV_37_US } ST25DV_PULSE_DURATION; /** * @brief ST25DV Mailbox Current Message enumerator definition */ typedef enum { - ST25DV_NO_MSG = 0, - ST25DV_HOST_MSG, - ST25DV_RF_MSG + ST25DV_NO_MSG = 0, + ST25DV_HOST_MSG, + ST25DV_RF_MSG } ST25DV_CURRENT_MSG; /** * @brief ST25DV EH Ctrl structure definition */ typedef struct { - ST25DV_EN_STATUS EH_EN_Mode; - ST25DV_EN_STATUS EH_on; - ST25DV_EN_STATUS Field_on; - ST25DV_EN_STATUS VCC_on; + ST25DV_EN_STATUS EH_EN_Mode; + ST25DV_EN_STATUS EH_on; + ST25DV_EN_STATUS Field_on; + ST25DV_EN_STATUS VCC_on; } ST25DV_EH_CTRL; /** * @brief ST25DV GPO structure definition */ typedef struct { - ST25DV_EN_STATUS GPO_RFUser_en; - ST25DV_EN_STATUS GPO_RFActivity_en; - ST25DV_EN_STATUS GPO_RFInterrupt_en; - ST25DV_EN_STATUS GPO_FieldChange_en; - ST25DV_EN_STATUS GPO_RFPutMsg_en; - ST25DV_EN_STATUS GPO_RFGetMsg_en; - ST25DV_EN_STATUS GPO_RFWrite_en; - ST25DV_EN_STATUS GPO_Enable; + ST25DV_EN_STATUS GPO_RFUser_en; + ST25DV_EN_STATUS GPO_RFActivity_en; + ST25DV_EN_STATUS GPO_RFInterrupt_en; + ST25DV_EN_STATUS GPO_FieldChange_en; + ST25DV_EN_STATUS GPO_RFPutMsg_en; + ST25DV_EN_STATUS GPO_RFGetMsg_en; + ST25DV_EN_STATUS GPO_RFWrite_en; + ST25DV_EN_STATUS GPO_Enable; } ST25DV_GPO; /** * @brief ST25DV RF Management structure definition. */ typedef struct { - ST25DV_EN_STATUS RfDisable; - ST25DV_EN_STATUS RfSleep; + ST25DV_EN_STATUS RfDisable; + ST25DV_EN_STATUS RfSleep; } ST25DV_RF_MNGT; /** * @brief ST25DV RF Area protection structure definition. */ typedef struct { - ST25DV_PASSWD_PROT_STATUS PasswdCtrl; - ST25DV_PROTECTION_CONF RWprotection; + ST25DV_PASSWD_PROT_STATUS PasswdCtrl; + ST25DV_PROTECTION_CONF RWprotection; } ST25DV_RF_PROT_ZONE; /** * @brief ST25DV I2C Area protection structure definition. */ typedef struct { - ST25DV_PROTECTION_CONF ProtectZone1; - ST25DV_PROTECTION_CONF ProtectZone2; - ST25DV_PROTECTION_CONF ProtectZone3; - ST25DV_PROTECTION_CONF ProtectZone4; + ST25DV_PROTECTION_CONF ProtectZone1; + ST25DV_PROTECTION_CONF ProtectZone2; + ST25DV_PROTECTION_CONF ProtectZone3; + ST25DV_PROTECTION_CONF ProtectZone4; } ST25DV_I2C_PROT_ZONE; /** * @brief ST25DV MB_CTRL_DYN register structure definition. */ typedef struct { - uint8_t MbEnable; - uint8_t HostPutMsg; - uint8_t RfPutMsg; - uint8_t HostMissMsg; - uint8_t RFMissMsg; - ST25DV_CURRENT_MSG CurrentMsg; + uint8_t MbEnable; + uint8_t HostPutMsg; + uint8_t RfPutMsg; + uint8_t HostMissMsg; + uint8_t RFMissMsg; + ST25DV_CURRENT_MSG CurrentMsg; } ST25DV_MB_CTRL_DYN_STATUS; /** * @brief ST25DV Lock CCFile structure definition. */ typedef struct { - ST25DV_LOCK_STATUS LckBck0; - ST25DV_LOCK_STATUS LckBck1; + ST25DV_LOCK_STATUS LckBck0; + ST25DV_LOCK_STATUS LckBck1; } ST25DV_LOCK_CCFILE; /** * @brief ST25DV Memory size structure definition. */ typedef struct { - uint8_t BlockSize; - uint16_t Mem_Size; + uint8_t BlockSize; + uint16_t Mem_Size; } ST25DV_MEM_SIZE; /** * @brief ST25DV UID information structure definition. */ typedef struct { - uint32_t MsbUid; - uint32_t LsbUid; + uint32_t MsbUid; + uint32_t LsbUid; } ST25DV_UID; /** * @brief ST25DV Password structure definition. */ typedef struct { - uint32_t MsbPasswd; - uint32_t LsbPasswd; + uint32_t MsbPasswd; + uint32_t LsbPasswd; } ST25DV_PASSWD; @@ -571,7 +571,7 @@ typedef struct { #endif class ST25DV_IO { -public: + public: ST25DV_IO(int32_t gpo, int32_t ldp, TwoWire *i2c, Stream *serial = NULL); NFCTAG_StatusTypeDef ST25DV_i2c_Init(void); @@ -664,7 +664,7 @@ class ST25DV_IO { TwoWire *get_pwire(); Stream *get_pserial(); -protected: + protected: int32_t _gpo; int32_t _lpd; TwoWire *_pwire; diff --git a/src/libNDEF/NDEF_class.h b/src/libNDEF/NDEF_class.h index 51eb737..de4b0f4 100755 --- a/src/libNDEF/NDEF_class.h +++ b/src/libNDEF/NDEF_class.h @@ -19,16 +19,16 @@ * @brief Tag Type 5 State enumeration definition. */ typedef enum { - TT5_NO_NDEF = 0, /**< No data detected in the tag. */ - TT5_INITIALIZED, /**< Capability container detected. */ - TT5_READ_WRITE, /**< Read-Write data detected. */ - TT5_READ /**< Read-Only data message detected. */ + TT5_NO_NDEF = 0, /**< No data detected in the tag. */ + TT5_INITIALIZED, /**< Capability container detected. */ + TT5_READ_WRITE, /**< Read-Write data detected. */ + TT5_READ /**< Read-Only data message detected. */ } TT5_State; /** @brief Type5 Tag Capability Container Magic numbers as defined by the NFC Forum. */ typedef enum { - NFCT5_MAGICNUMBER_E1_CCFILE = 0xE1, /**< Complete data area can be read by 1-byte block adrdess commands. */ - NFCT5_MAGICNUMBER_E2_CCFILE = 0xE2 /**< Last part of the data area can be only read by 2-bytes block address commands.\n + NFCT5_MAGICNUMBER_E1_CCFILE = 0xE1, /**< Complete data area can be read by 1-byte block adrdess commands. */ + NFCT5_MAGICNUMBER_E2_CCFILE = 0xE2 /**< Last part of the data area can be only read by 2-bytes block address commands.\n The first 256 blocks can be read by 1-byte block address commands. */ } TT5_MagicNumber_t; @@ -36,25 +36,25 @@ typedef enum { * @brief Type5 Tag Capability Container structure. */ typedef struct { - TT5_MagicNumber_t MagicNumber; /**< CCfile[0]: Magic Number should be E1h or E2h (for extended API) */ - uint8_t Version; /**< CCfile[1]: Capability container version (b7-b4) and access conditions (b3-b0) */ - uint8_t MemorySize; /**< CCfile[2]: Memory size, expressed in 8 bytes blocks, set to 0 if tag size is greater than 16kbits. */ - uint8_t TT5Tag; /**< CCfile[3]: Additional information on the Type5 Tag:\n + TT5_MagicNumber_t MagicNumber; /**< CCfile[0]: Magic Number should be E1h or E2h (for extended API) */ + uint8_t Version; /**< CCfile[1]: Capability container version (b7-b4) and access conditions (b3-b0) */ + uint8_t MemorySize; /**< CCfile[2]: Memory size, expressed in 8 bytes blocks, set to 0 if tag size is greater than 16kbits. */ + uint8_t TT5Tag; /**< CCfile[3]: Additional information on the Type5 Tag:\n b0: supports `read multiple block` commands\n b1: RFU\n b2: RFU\n b3: supports `lock block` commands\n b4: requires the `special frame` format */ - uint8_t rsved1; /**< RFU */ - uint8_t rsved2; /**< RFU */ - uint16_t ExtMemorySize; /**< CCfile[6],CCfile[7]: Memory size, expressed in 8 bytes blocks, when tag size is greater than 16kbits. */ - TT5_State State; /**< Indicates if a NDEF message is present. */ - uint32_t NDEF_offset; /**< Indicates the address of a NDEF message in the tag. */ + uint8_t rsved1; /**< RFU */ + uint8_t rsved2; /**< RFU */ + uint16_t ExtMemorySize; /**< CCfile[6],CCfile[7]: Memory size, expressed in 8 bytes blocks, when tag size is greater than 16kbits. */ + TT5_State State; /**< Indicates if a NDEF message is present. */ + uint32_t NDEF_offset; /**< Indicates the address of a NDEF message in the tag. */ } sCCFileInfo; class NDEF { -public: + public: NDEF(ST25DV_IO *dev); uint16_t begin(); @@ -162,7 +162,7 @@ class NDEF { //Email static void NDEF_FillEmailStruct(uint8_t *pPayload, uint32_t PayloadSize, sEmailInfo *pEmailStruct); void NDEF_ReadURI_Email(sRecordInfo_t *pRecordStruct, sEmailInfo *pEmailStruct); -private: + private: //Geo static void NDEF_FillGeoStruct(uint8_t *pPayload, uint32_t PayloadSize, sGeoInfo *pGeoStruct); @@ -219,7 +219,7 @@ class NDEF { /** @brief Capability Container structure instance (global). */ sCCFileInfo CCFileStruct; -private: + private: ST25DV_IO *mydev; }; diff --git a/src/libNDEF/NDEFcommon.h b/src/libNDEF/NDEFcommon.h index 3eaa5fb..76d788f 100755 --- a/src/libNDEF/NDEFcommon.h +++ b/src/libNDEF/NDEFcommon.h @@ -40,14 +40,14 @@ * @brief GPO status information structure definition */ typedef struct { - uint8_t WritenEEPROM; - uint8_t RfBusy; - uint8_t FieldOn; - uint8_t FieldOff; - uint8_t MsgInMailbox; - uint8_t MailboxMsgRead; - uint8_t RfInterrupt; - uint8_t Rfuser; + uint8_t WritenEEPROM; + uint8_t RfBusy; + uint8_t FieldOn; + uint8_t FieldOff; + uint8_t MsgInMailbox; + uint8_t MailboxMsgRead; + uint8_t RfInterrupt; + uint8_t Rfuser; } IT_GPO_STATUS; /* Exported macro ------------------------------------------------------------*/ diff --git a/src/libNDEF/lib_NDEF.cpp b/src/libNDEF/lib_NDEF.cpp index f23f151..115d5af 100755 --- a/src/libNDEF/lib_NDEF.cpp +++ b/src/libNDEF/lib_NDEF.cpp @@ -59,54 +59,54 @@ NDEF::NDEF(ST25DV_IO *dev) { - mydev = dev; - SPRecordStructAdd[0] = &SPRecordStruct1; - SPRecordStructAdd[1] = &SPRecordStruct2; - SPRecordStructAdd[2] = &SPRecordStruct3; - SPRecordStructAdd[3] = &SPRecordStruct4; + mydev = dev; + SPRecordStructAdd[0] = &SPRecordStruct1; + SPRecordStructAdd[1] = &SPRecordStruct2; + SPRecordStructAdd[2] = &SPRecordStruct3; + SPRecordStructAdd[3] = &SPRecordStruct4; } uint16_t NDEF::begin() { - return begin(NULL, 0); + return begin(NULL, 0); } uint16_t NDEF::begin(uint8_t *buffer, uint16_t bufferLength) { - int ret = NDEF_OK; - - if (buffer == NULL) { - NDEF_Buffer = NDEF_Default_Buffer; - NDEF_Buffer_size = NDEF_MAX_SIZE; - } else { - // TODO should we check minimum buffer length? - NDEF_Buffer = buffer; - NDEF_Buffer_size = bufferLength; - } - - if (NfcType5_NDEFDetection() != NDEF_OK) { - CCFileStruct.MagicNumber = NFCT5_MAGICNUMBER_E1_CCFILE; - CCFileStruct.Version = NFCT5_VERSION_V1_0; - CCFileStruct.MemorySize = (ST25DV_MAX_SIZE / 8) & 0xFF; - CCFileStruct.TT5Tag = 0x05; - /* Init of the Type Tag 5 component (M24LR) */ - ret = NfcType5_TT5Init(); - } - return ret; + int ret = NDEF_OK; + + if (buffer == NULL) { + NDEF_Buffer = NDEF_Default_Buffer; + NDEF_Buffer_size = NDEF_MAX_SIZE; + } else { + // TODO should we check minimum buffer length? + NDEF_Buffer = buffer; + NDEF_Buffer_size = bufferLength; + } + + if (NfcType5_NDEFDetection() != NDEF_OK) { + CCFileStruct.MagicNumber = NFCT5_MAGICNUMBER_E1_CCFILE; + CCFileStruct.Version = NFCT5_VERSION_V1_0; + CCFileStruct.MemorySize = (ST25DV_MAX_SIZE / 8) & 0xFF; + CCFileStruct.TT5Tag = 0x05; + /* Init of the Type Tag 5 component (M24LR) */ + ret = NfcType5_TT5Init(); + } + return ret; } uint16_t NDEF::NDEF_IsNDEFPresent(void) { - uint16_t FileSize; + uint16_t FileSize; - /* Check NDEF existence */ - NfcTag_GetLength(&FileSize); + /* Check NDEF existence */ + NfcTag_GetLength(&FileSize); - if (FileSize != 0) { - return NDEF_OK; - } else { - return NDEF_ERROR; - } + if (FileSize != 0) { + return NDEF_OK; + } else { + return NDEF_ERROR; + } } /** @@ -117,64 +117,64 @@ uint16_t NDEF::NDEF_IsNDEFPresent(void) */ uint16_t NDEF::NDEF_IdentifySPRecord(sRecordInfo_t *pRecordStruct, uint8_t *pPayload) { - uint16_t status = NDEF_ERROR; - uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; - - /* Is ID length field present */ - if ((*pPayload) & IL_Mask) { - IDLengthField = ID_LENGTH_FIELD; + uint16_t status = NDEF_ERROR; + uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; + + /* Is ID length field present */ + if ((*pPayload) & IL_Mask) { + IDLengthField = ID_LENGTH_FIELD; + } else { + IDLengthField = 0; + } + + /* it's a SR */ + if ((*pPayload) & SR_Mask) { + TypeNbByte = pPayload[1]; + PayloadLengthField = 1; + if (IDLengthField == ID_LENGTH_FIELD) { + IDNbByte = pPayload[3]; } else { - IDLengthField = 0; + IDNbByte = 0; } - - /* it's a SR */ - if ((*pPayload) & SR_Mask) { - TypeNbByte = pPayload[1]; - PayloadLengthField = 1; - if (IDLengthField == ID_LENGTH_FIELD) { - IDNbByte = pPayload[3]; - } else { - IDNbByte = 0; - } + } else { + TypeNbByte = pPayload[1]; + PayloadLengthField = 4; + if (IDLengthField == ID_LENGTH_FIELD) { + IDNbByte = pPayload[6]; } else { - TypeNbByte = pPayload[1]; - PayloadLengthField = 4; - if (IDLengthField == ID_LENGTH_FIELD) { - IDNbByte = pPayload[6]; - } else { - IDNbByte = 0; - } + IDNbByte = 0; } - - SizeOfRecordHeader = RECORD_FLAG_FIELD + TYPE_LENGTH_FIELD + PayloadLengthField + IDLengthField + TypeNbByte + IDNbByte; - - /* it's a SR */ - if (pPayload[0] & SR_Mask) { - pRecordStruct->RecordFlags = pPayload[0]; - pRecordStruct->TypeLength = TypeNbByte; - pRecordStruct->PayloadLength = pPayload[2]; - pRecordStruct->IDLength = IDNbByte; - memcpy(pRecordStruct->Type, &pPayload[3 + IDNbByte], TypeNbByte); - memcpy(pRecordStruct->ID, &pPayload[3 + IDNbByte + TypeNbByte], IDNbByte); - pRecordStruct->PayloadOffset = SizeOfRecordHeader; - } else { - pRecordStruct->RecordFlags = pPayload[0]; - pRecordStruct->TypeLength = TypeNbByte; - pRecordStruct->PayloadLength = (((uint32_t)pPayload[2]) << 24) | - (((uint32_t)pPayload[3]) << 16) | - (((uint32_t)pPayload[4]) << 8) - | pPayload[5] ; - pRecordStruct->IDLength = IDNbByte; - memcpy(pRecordStruct->Type, &pPayload[6 + IDNbByte], TypeNbByte); - memcpy(pRecordStruct->ID, &pPayload[6 + IDNbByte + TypeNbByte], IDNbByte); - pRecordStruct->PayloadOffset = SizeOfRecordHeader; - } - - pRecordStruct->PayloadBufferAdd = pPayload + SizeOfRecordHeader ; - - status = NDEF_ParseRecordHeader(pRecordStruct); - - return status; + } + + SizeOfRecordHeader = RECORD_FLAG_FIELD + TYPE_LENGTH_FIELD + PayloadLengthField + IDLengthField + TypeNbByte + IDNbByte; + + /* it's a SR */ + if (pPayload[0] & SR_Mask) { + pRecordStruct->RecordFlags = pPayload[0]; + pRecordStruct->TypeLength = TypeNbByte; + pRecordStruct->PayloadLength = pPayload[2]; + pRecordStruct->IDLength = IDNbByte; + memcpy(pRecordStruct->Type, &pPayload[3 + IDNbByte], TypeNbByte); + memcpy(pRecordStruct->ID, &pPayload[3 + IDNbByte + TypeNbByte], IDNbByte); + pRecordStruct->PayloadOffset = SizeOfRecordHeader; + } else { + pRecordStruct->RecordFlags = pPayload[0]; + pRecordStruct->TypeLength = TypeNbByte; + pRecordStruct->PayloadLength = (((uint32_t)pPayload[2]) << 24) | + (((uint32_t)pPayload[3]) << 16) | + (((uint32_t)pPayload[4]) << 8) + | pPayload[5] ; + pRecordStruct->IDLength = IDNbByte; + memcpy(pRecordStruct->Type, &pPayload[6 + IDNbByte], TypeNbByte); + memcpy(pRecordStruct->ID, &pPayload[6 + IDNbByte + TypeNbByte], IDNbByte); + pRecordStruct->PayloadOffset = SizeOfRecordHeader; + } + + pRecordStruct->PayloadBufferAdd = pPayload + SizeOfRecordHeader ; + + status = NDEF_ParseRecordHeader(pRecordStruct); + + return status; } /** @@ -185,27 +185,27 @@ uint16_t NDEF::NDEF_IdentifySPRecord(sRecordInfo_t *pRecordStruct, uint8_t *pPay */ uint16_t NDEF::NDEF_ParseRecordHeader(sRecordInfo_t *pRecordStruct) { - uint16_t status = NDEF_OK; + uint16_t status = NDEF_OK; - switch ((pRecordStruct->RecordFlags & TNF_Mask)) { + switch ((pRecordStruct->RecordFlags & TNF_Mask)) { case TNF_WellKnown: - NDEF_ParseWellKnownType(pRecordStruct); - break; + NDEF_ParseWellKnownType(pRecordStruct); + break; case TNF_MediaType: - NDEF_ParseMediaType(pRecordStruct); - break; + NDEF_ParseMediaType(pRecordStruct); + break; case TNF_NFCForumExternal: - NDEF_ParseForumExternalType(pRecordStruct); - break; + NDEF_ParseForumExternalType(pRecordStruct); + break; default: - /* currently not supported or unknown*/ - pRecordStruct->NDEF_Type = UNKNOWN_TYPE; - status = NDEF_ERROR; - } - return status; + /* currently not supported or unknown*/ + pRecordStruct->NDEF_Type = UNKNOWN_TYPE; + status = NDEF_ERROR; + } + return status; } /** @@ -214,41 +214,41 @@ uint16_t NDEF::NDEF_ParseRecordHeader(sRecordInfo_t *pRecordStruct) */ void NDEF::NDEF_ParseWellKnownType(sRecordInfo_t *pRecordStruct) { - uint8_t *pPayload; - - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - - if (!memcmp(&(pRecordStruct->Type), SMART_POSTER_TYPE_STRING, pRecordStruct->TypeLength)) { - /* special case where we have to parse others records */ - pRecordStruct->NDEF_Type = SMARTPOSTER_TYPE; - NDEF_ParseSP(pRecordStruct); - } - - else if (!memcmp(&(pRecordStruct->Type), URI_TYPE_STRING, pRecordStruct->TypeLength)) { - /* it's an URI Type check if it's an URL or SMS or ... */ - /* check identifier */ - if (*pPayload == URI_ID_0x00) { - NDEF_ParseURI(pRecordStruct); - } else if ((*pPayload > URI_ID_0x00) && (*pPayload < URI_RFU)) { - /* email special case */ - if (*pPayload == (uint8_t) URI_ID_0x06) { - pRecordStruct->NDEF_Type = URI_EMAIL_TYPE; - } else { - pRecordStruct->NDEF_Type = WELL_KNOWN_ABRIDGED_URI_TYPE; - } - } else { - pRecordStruct->NDEF_Type = UNKNOWN_TYPE; - } - } - - else if (!memcmp(&(pRecordStruct->Type), TEXT_TYPE_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = TEXT_TYPE; - } else if ((!memcmp(&(pRecordStruct->Type), NDEF_HANDOVER_SELECT_TYPE_STR, pRecordStruct->TypeLength)) || - (!memcmp(&(pRecordStruct->Type), NDEF_HANDOVER_REQUEST_TYPE_STR, pRecordStruct->TypeLength))) { - pRecordStruct->NDEF_Type = HANDOVER_TYPE; + uint8_t *pPayload; + + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + + if (!memcmp(&(pRecordStruct->Type), SMART_POSTER_TYPE_STRING, pRecordStruct->TypeLength)) { + /* special case where we have to parse others records */ + pRecordStruct->NDEF_Type = SMARTPOSTER_TYPE; + NDEF_ParseSP(pRecordStruct); + } + + else if (!memcmp(&(pRecordStruct->Type), URI_TYPE_STRING, pRecordStruct->TypeLength)) { + /* it's an URI Type check if it's an URL or SMS or ... */ + /* check identifier */ + if (*pPayload == URI_ID_0x00) { + NDEF_ParseURI(pRecordStruct); + } else if ((*pPayload > URI_ID_0x00) && (*pPayload < URI_RFU)) { + /* email special case */ + if (*pPayload == (uint8_t) URI_ID_0x06) { + pRecordStruct->NDEF_Type = URI_EMAIL_TYPE; + } else { + pRecordStruct->NDEF_Type = WELL_KNOWN_ABRIDGED_URI_TYPE; + } } else { - pRecordStruct->NDEF_Type = UNKNOWN_TYPE; + pRecordStruct->NDEF_Type = UNKNOWN_TYPE; } + } + + else if (!memcmp(&(pRecordStruct->Type), TEXT_TYPE_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = TEXT_TYPE; + } else if ((!memcmp(&(pRecordStruct->Type), NDEF_HANDOVER_SELECT_TYPE_STR, pRecordStruct->TypeLength)) || + (!memcmp(&(pRecordStruct->Type), NDEF_HANDOVER_REQUEST_TYPE_STR, pRecordStruct->TypeLength))) { + pRecordStruct->NDEF_Type = HANDOVER_TYPE; + } else { + pRecordStruct->NDEF_Type = UNKNOWN_TYPE; + } } /** @@ -257,21 +257,21 @@ void NDEF::NDEF_ParseWellKnownType(sRecordInfo_t *pRecordStruct) */ void NDEF::NDEF_ParseMediaType(sRecordInfo_t *pRecordStruct) { - if (!memcmp(&(pRecordStruct->Type), VCARD_TYPE_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = VCARD_TYPE; - } else if (!memcmp(&(pRecordStruct->Type), XVCARD_TYPE_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = VCARD_TYPE; - } else if (!memcmp(&(pRecordStruct->Type), XVCARD2_TYPE_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = VCARD_TYPE; - } else if (!memcmp(&pRecordStruct->Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = BT_TYPE; - } else if (!memcmp(&pRecordStruct->Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = BLE_TYPE; - } else if (!memcmp(&pRecordStruct->Type, WIFITOKEN_TYPE_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = URI_WIFITOKEN_TYPE; - } else { - pRecordStruct->NDEF_Type = UNKNOWN_TYPE; - } + if (!memcmp(&(pRecordStruct->Type), VCARD_TYPE_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = VCARD_TYPE; + } else if (!memcmp(&(pRecordStruct->Type), XVCARD_TYPE_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = VCARD_TYPE; + } else if (!memcmp(&(pRecordStruct->Type), XVCARD2_TYPE_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = VCARD_TYPE; + } else if (!memcmp(&pRecordStruct->Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = BT_TYPE; + } else if (!memcmp(&pRecordStruct->Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = BLE_TYPE; + } else if (!memcmp(&pRecordStruct->Type, WIFITOKEN_TYPE_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = URI_WIFITOKEN_TYPE; + } else { + pRecordStruct->NDEF_Type = UNKNOWN_TYPE; + } } /** @@ -280,11 +280,11 @@ void NDEF::NDEF_ParseMediaType(sRecordInfo_t *pRecordStruct) */ void NDEF::NDEF_ParseForumExternalType(sRecordInfo_t *pRecordStruct) { - if (!memcmp(&(pRecordStruct->Type), M24SR_DISCOVERY_APP_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = M24SR_DISCOVERY_APP_TYPE; - } else { - pRecordStruct->NDEF_Type = UNKNOWN_TYPE; - } + if (!memcmp(&(pRecordStruct->Type), M24SR_DISCOVERY_APP_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = M24SR_DISCOVERY_APP_TYPE; + } else { + pRecordStruct->NDEF_Type = UNKNOWN_TYPE; + } } /** @@ -293,18 +293,18 @@ void NDEF::NDEF_ParseForumExternalType(sRecordInfo_t *pRecordStruct) */ void NDEF::NDEF_ParseURI(sRecordInfo_t *pRecordStruct) { - uint8_t *pPayload; - - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - pPayload++; /* to skip URI identifier first URI payload byte */ - - if (!memcmp(pPayload, SMS_TYPE_STRING, strlen(SMS_TYPE_STRING))) { - pRecordStruct->NDEF_Type = URI_SMS_TYPE; - } else if (!memcmp(pPayload, GEO_TYPE_STRING, strlen(GEO_TYPE_STRING))) { - pRecordStruct->NDEF_Type = URI_GEO_TYPE; - } else { - pRecordStruct->NDEF_Type = UNABRIDGED_URI_TYPE; - } + uint8_t *pPayload; + + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + pPayload++; /* to skip URI identifier first URI payload byte */ + + if (!memcmp(pPayload, SMS_TYPE_STRING, strlen(SMS_TYPE_STRING))) { + pRecordStruct->NDEF_Type = URI_SMS_TYPE; + } else if (!memcmp(pPayload, GEO_TYPE_STRING, strlen(GEO_TYPE_STRING))) { + pRecordStruct->NDEF_Type = URI_GEO_TYPE; + } else { + pRecordStruct->NDEF_Type = UNABRIDGED_URI_TYPE; + } } /** @@ -313,41 +313,41 @@ void NDEF::NDEF_ParseURI(sRecordInfo_t *pRecordStruct) */ void NDEF::NDEF_ParseSP(sRecordInfo_t *pRecordStruct) { - uint8_t *pPayload; - uint32_t PayloadSize = 0; - uint32_t SPPayloadSize = 0; - uint32_t OffsetInSPPayload = 0; - uint32_t RecordPosition = 0; - sRecordInfo_t *pSPRecordStruct; - - /* initialize variable with size of the payload and pointer on data */ - PayloadSize = pRecordStruct->PayloadLength; - - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - - pSPRecordStruct = SPRecordStructAdd[0]; - - /* Initialize the number of record find in the SP payload */ - pRecordStruct->NbOfRecordInSPPayload = 0; - - do { - pSPRecordStruct = SPRecordStructAdd[RecordPosition]; - /* identify the record in the SP payload */ - if (NDEF_IdentifySPRecord(pSPRecordStruct, pPayload) == NDEF_OK) { - /* store add of structure that will contain the other record information */ - pRecordStruct->NbOfRecordInSPPayload++; - pRecordStruct->SPRecordStructAdd[RecordPosition] = pSPRecordStruct; - - /* After SPRecord + First Record check if we are at the end of NDEF file */ - SPPayloadSize = pSPRecordStruct->PayloadLength; - - OffsetInSPPayload += pSPRecordStruct->PayloadOffset + SPPayloadSize; - pPayload += OffsetInSPPayload; - } else { /* Recommended Action Record for example */ - SPPayloadSize = 0; - } - RecordPosition++; - } while ((OffsetInSPPayload < PayloadSize) && RecordPosition < SP_MAX_RECORD); /* there is another record */ + uint8_t *pPayload; + uint32_t PayloadSize = 0; + uint32_t SPPayloadSize = 0; + uint32_t OffsetInSPPayload = 0; + uint32_t RecordPosition = 0; + sRecordInfo_t *pSPRecordStruct; + + /* initialize variable with size of the payload and pointer on data */ + PayloadSize = pRecordStruct->PayloadLength; + + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + + pSPRecordStruct = SPRecordStructAdd[0]; + + /* Initialize the number of record find in the SP payload */ + pRecordStruct->NbOfRecordInSPPayload = 0; + + do { + pSPRecordStruct = SPRecordStructAdd[RecordPosition]; + /* identify the record in the SP payload */ + if (NDEF_IdentifySPRecord(pSPRecordStruct, pPayload) == NDEF_OK) { + /* store add of structure that will contain the other record information */ + pRecordStruct->NbOfRecordInSPPayload++; + pRecordStruct->SPRecordStructAdd[RecordPosition] = pSPRecordStruct; + + /* After SPRecord + First Record check if we are at the end of NDEF file */ + SPPayloadSize = pSPRecordStruct->PayloadLength; + + OffsetInSPPayload += pSPRecordStruct->PayloadOffset + SPPayloadSize; + pPayload += OffsetInSPPayload; + } else { /* Recommended Action Record for example */ + SPPayloadSize = 0; + } + RecordPosition++; + } while ((OffsetInSPPayload < PayloadSize) && RecordPosition < SP_MAX_RECORD); /* there is another record */ } /** @@ -367,7 +367,7 @@ void NDEF::NDEF_ParseSP(sRecordInfo_t *pRecordStruct) */ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct) { - return NDEF_IdentifyNDEF(pRecordStruct, NDEF_Buffer, NDEF_Buffer_size); + return NDEF_IdentifyNDEF(pRecordStruct, NDEF_Buffer, NDEF_Buffer_size); } /** @@ -380,7 +380,7 @@ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct) */ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF) { - return NDEF_IdentifyNDEF(pRecordStruct, pNDEF, NDEF_MAX_SIZE); + return NDEF_IdentifyNDEF(pRecordStruct, pNDEF, NDEF_MAX_SIZE); } /** @@ -392,17 +392,17 @@ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF) */ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF, uint16_t bufferLength) { - uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; + uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; - /* check NDEF present */ - if (NDEF_IsNDEFPresent() != NDEF_OK) { - return NDEF_ERROR; - } + /* check NDEF present */ + if (NDEF_IsNDEFPresent() != NDEF_OK) { + return NDEF_ERROR; + } - /* Read the NDEF file up to the max length of the record header*/ - NfcTag_ReadNDEF(pNDEF, bufferLength); + /* Read the NDEF file up to the max length of the record header*/ + NfcTag_ReadNDEF(pNDEF, bufferLength); - return NDEF_IdentifyBuffer(pRecordStruct, pNDEF); + return NDEF_IdentifyBuffer(pRecordStruct, pNDEF); } /** @@ -416,7 +416,7 @@ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF, u */ uint16_t NDEF::NDEF_ReadNDEF() { - return NfcTag_ReadNDEF(NDEF_Buffer, NDEF_Buffer_size); + return NfcTag_ReadNDEF(NDEF_Buffer, NDEF_Buffer_size); } /** @@ -431,7 +431,7 @@ uint16_t NDEF::NDEF_ReadNDEF() */ uint16_t NDEF::NDEF_ReadNDEF(uint8_t *pNDEF) { - return NfcTag_ReadNDEF(pNDEF, NDEF_MAX_SIZE); + return NfcTag_ReadNDEF(pNDEF, NDEF_MAX_SIZE); } /** @@ -446,7 +446,7 @@ uint16_t NDEF::NDEF_ReadNDEF(uint8_t *pNDEF) */ uint16_t NDEF::NDEF_ReadNDEF(uint8_t *pNDEF, uint16_t bufferLength) { - return NfcTag_ReadNDEF(pNDEF, bufferLength); + return NfcTag_ReadNDEF(pNDEF, bufferLength); } @@ -462,7 +462,7 @@ uint16_t NDEF::NDEF_ReadNDEF(uint8_t *pNDEF, uint16_t bufferLength) */ uint16_t NDEF::NDEF_getNDEFSize(uint16_t *Size) { - return NfcTag_GetLength(Size); + return NfcTag_GetLength(Size); } /** * @brief This function write the NDEF in the TAG. @@ -476,7 +476,7 @@ uint16_t NDEF::NDEF_getNDEFSize(uint16_t *Size) */ uint16_t NDEF::NDEF_WriteNDEF(uint16_t NDEF_Size, uint8_t *pNDEF) { - return NfcTag_WriteNDEF(NDEF_Size, pNDEF); + return NfcTag_WriteNDEF(NDEF_Size, pNDEF); } @@ -492,43 +492,43 @@ uint16_t NDEF::NDEF_WriteNDEF(uint16_t NDEF_Size, uint8_t *pNDEF) */ uint16_t NDEF::NDEF_AppendRecord(sRecordInfo_t *Record) { - uint16_t status; - uint16_t NDEF_Size = 0; - uint8_t *pData = NDEF_Buffer; + uint16_t status; + uint16_t NDEF_Size = 0; + uint8_t *pData = NDEF_Buffer; - status = NDEF_getNDEFSize(&NDEF_Size); - if (status != NDEF_OK) { - return status ; - } + status = NDEF_getNDEFSize(&NDEF_Size); + if (status != NDEF_OK) { + return status ; + } - if (NDEF_Size != 0) { - // There are already records in the NDEF - Record->RecordFlags &= ~MB_Mask; - - status = NfcTag_ReadNDEF(pData); - if (status != NDEF_OK) { - return status ; - } - - uint8_t *pNdefRecord; - sRecordInfo_t LastRecord; - do { - pNdefRecord = pData; - NDEF_IdentifyBuffer(&LastRecord, pData); - pData += LastRecord.PayloadOffset + LastRecord.PayloadLength; - // TO DO: add a security condition to avoid infinite loop if NDEF file is corrupted - } while (!(LastRecord.RecordFlags & ME_Mask)); - LastRecord.RecordFlags &= ~ME_Mask; - *pNdefRecord = LastRecord.RecordFlags; - } else { - // This will be the first message in memory - Record->RecordFlags |= MB_Mask; - } - Record->RecordFlags |= ME_Mask; - uint32_t RecordLength = NDEF_WriteRecord(Record, pData); + if (NDEF_Size != 0) { + // There are already records in the NDEF + Record->RecordFlags &= ~MB_Mask; + status = NfcTag_ReadNDEF(pData); + if (status != NDEF_OK) { + return status ; + } - return NfcTag_WriteNDEF(NDEF_Size + RecordLength, NDEF_Buffer); + uint8_t *pNdefRecord; + sRecordInfo_t LastRecord; + do { + pNdefRecord = pData; + NDEF_IdentifyBuffer(&LastRecord, pData); + pData += LastRecord.PayloadOffset + LastRecord.PayloadLength; + // TO DO: add a security condition to avoid infinite loop if NDEF file is corrupted + } while (!(LastRecord.RecordFlags & ME_Mask)); + LastRecord.RecordFlags &= ~ME_Mask; + *pNdefRecord = LastRecord.RecordFlags; + } else { + // This will be the first message in memory + Record->RecordFlags |= MB_Mask; + } + Record->RecordFlags |= ME_Mask; + uint32_t RecordLength = NDEF_WriteRecord(Record, pData); + + + return NfcTag_WriteNDEF(NDEF_Size + RecordLength, NDEF_Buffer); } @@ -543,65 +543,65 @@ uint16_t NDEF::NDEF_AppendRecord(sRecordInfo_t *Record) */ uint16_t NDEF::NDEF_IdentifyBuffer(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF) { - uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; - - /* Is ID length field present */ - if ((*pNDEF) & IL_Mask) { - IDLengthField = ID_LENGTH_FIELD; + uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; + + /* Is ID length field present */ + if ((*pNDEF) & IL_Mask) { + IDLengthField = ID_LENGTH_FIELD; + } else { + IDLengthField = 0; + } + + /* it's a SR */ + if ((*pNDEF) & SR_Mask) { + /* Analyse short record layout */ + TypeNbByte = pNDEF[1]; + PayloadLengthField = 1; + if (IDLengthField == ID_LENGTH_FIELD) { + IDNbByte = pNDEF[3]; } else { - IDLengthField = 0; + IDNbByte = 0; } - - /* it's a SR */ - if ((*pNDEF) & SR_Mask) { - /* Analyse short record layout */ - TypeNbByte = pNDEF[1]; - PayloadLengthField = 1; - if (IDLengthField == ID_LENGTH_FIELD) { - IDNbByte = pNDEF[3]; - } else { - IDNbByte = 0; - } + } else { + /* Analyse normal record layout */ + TypeNbByte = pNDEF[1]; + PayloadLengthField = 4; + if (IDLengthField == ID_LENGTH_FIELD) { + IDNbByte = pNDEF[6]; } else { - /* Analyse normal record layout */ - TypeNbByte = pNDEF[1]; - PayloadLengthField = 4; - if (IDLengthField == ID_LENGTH_FIELD) { - IDNbByte = pNDEF[6]; - } else { - IDNbByte = 0; - } + IDNbByte = 0; } - - SizeOfRecordHeader = RECORD_FLAG_FIELD + TYPE_LENGTH_FIELD + PayloadLengthField + IDLengthField + TypeNbByte + IDNbByte; - - /* it's a SR */ - if (pNDEF[0] & SR_Mask) { - pRecordStruct->RecordFlags = pNDEF[0]; - pRecordStruct->TypeLength = TypeNbByte; - pRecordStruct->PayloadLength = pNDEF[2]; - pRecordStruct->IDLength = IDNbByte; - memcpy(pRecordStruct->Type, &pNDEF[3 + IDLengthField], TypeNbByte); - memcpy(pRecordStruct->ID, &pNDEF[3 + IDLengthField + TypeNbByte], IDNbByte); - pRecordStruct->PayloadOffset = SizeOfRecordHeader; - } else { - pRecordStruct->RecordFlags = pNDEF[0]; - pRecordStruct->TypeLength = TypeNbByte; - pRecordStruct->PayloadLength = (((uint32_t)pNDEF[2]) << 24) | - (((uint32_t)pNDEF[3]) << 16) | - (((uint32_t)pNDEF[4]) << 8) - | pNDEF[5] ; - pRecordStruct->IDLength = IDNbByte; - memcpy(pRecordStruct->Type, &pNDEF[6 + IDNbByte], TypeNbByte); - memcpy(pRecordStruct->ID, &pNDEF[6 + IDNbByte + TypeNbByte], IDNbByte); - pRecordStruct->PayloadOffset = SizeOfRecordHeader; - } - - pRecordStruct->PayloadBufferAdd = &pNDEF[pRecordStruct->PayloadOffset]; - - NDEF_ParseRecordHeader(pRecordStruct); - - return NDEF_OK; + } + + SizeOfRecordHeader = RECORD_FLAG_FIELD + TYPE_LENGTH_FIELD + PayloadLengthField + IDLengthField + TypeNbByte + IDNbByte; + + /* it's a SR */ + if (pNDEF[0] & SR_Mask) { + pRecordStruct->RecordFlags = pNDEF[0]; + pRecordStruct->TypeLength = TypeNbByte; + pRecordStruct->PayloadLength = pNDEF[2]; + pRecordStruct->IDLength = IDNbByte; + memcpy(pRecordStruct->Type, &pNDEF[3 + IDLengthField], TypeNbByte); + memcpy(pRecordStruct->ID, &pNDEF[3 + IDLengthField + TypeNbByte], IDNbByte); + pRecordStruct->PayloadOffset = SizeOfRecordHeader; + } else { + pRecordStruct->RecordFlags = pNDEF[0]; + pRecordStruct->TypeLength = TypeNbByte; + pRecordStruct->PayloadLength = (((uint32_t)pNDEF[2]) << 24) | + (((uint32_t)pNDEF[3]) << 16) | + (((uint32_t)pNDEF[4]) << 8) + | pNDEF[5] ; + pRecordStruct->IDLength = IDNbByte; + memcpy(pRecordStruct->Type, &pNDEF[6 + IDNbByte], TypeNbByte); + memcpy(pRecordStruct->ID, &pNDEF[6 + IDNbByte + TypeNbByte], IDNbByte); + pRecordStruct->PayloadOffset = SizeOfRecordHeader; + } + + pRecordStruct->PayloadBufferAdd = &pNDEF[pRecordStruct->PayloadOffset]; + + NDEF_ParseRecordHeader(pRecordStruct); + + return NDEF_OK; } /** @@ -612,66 +612,66 @@ uint16_t NDEF::NDEF_IdentifyBuffer(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF) */ uint32_t NDEF::NDEF_WriteRecord(sRecordInfo_t *pRecord, uint8_t *pNDEF) { - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ - /*----------------------------------*/ - /* PAYLOAD */ - /************************************/ - uint8_t *start = pNDEF; - - // start by considering payload length - if (pRecord->PayloadLength <= 0xFF) { - pRecord->RecordFlags |= SR_Mask; - } else { - pRecord->RecordFlags &= ~SR_Mask; - } - - // Then start writing! - *pNDEF++ = pRecord->RecordFlags; - - *pNDEF++ = pRecord->TypeLength; - - if (!(pRecord->RecordFlags & SR_Mask)) { - *pNDEF++ = (pRecord->PayloadLength >> 24) & 0xFF; - *pNDEF++ = (pRecord->PayloadLength >> 16) & 0xFF ; - *pNDEF++ = (pRecord->PayloadLength >> 8) & 0xFF; - } - *pNDEF++ = (pRecord->PayloadLength) & 0xFF; - - if (pRecord->RecordFlags & IL_Mask) { - *pNDEF++ = (pRecord->IDLength); - } - - memcpy(pNDEF, pRecord->Type, pRecord->TypeLength); - pNDEF += pRecord->TypeLength; - - if (pRecord->RecordFlags & IL_Mask) { - memcpy(pNDEF, pRecord->ID, pRecord->IDLength); - pNDEF += pRecord->IDLength; - } - - memcpy(pNDEF, pRecord->PayloadBufferAdd, pRecord->PayloadLength); - pNDEF += pRecord->PayloadLength; - - return (pNDEF - start); + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ + /*----------------------------------*/ + /* PAYLOAD */ + /************************************/ + uint8_t *start = pNDEF; + + // start by considering payload length + if (pRecord->PayloadLength <= 0xFF) { + pRecord->RecordFlags |= SR_Mask; + } else { + pRecord->RecordFlags &= ~SR_Mask; + } + + // Then start writing! + *pNDEF++ = pRecord->RecordFlags; + + *pNDEF++ = pRecord->TypeLength; + + if (!(pRecord->RecordFlags & SR_Mask)) { + *pNDEF++ = (pRecord->PayloadLength >> 24) & 0xFF; + *pNDEF++ = (pRecord->PayloadLength >> 16) & 0xFF ; + *pNDEF++ = (pRecord->PayloadLength >> 8) & 0xFF; + } + *pNDEF++ = (pRecord->PayloadLength) & 0xFF; + + if (pRecord->RecordFlags & IL_Mask) { + *pNDEF++ = (pRecord->IDLength); + } + + memcpy(pNDEF, pRecord->Type, pRecord->TypeLength); + pNDEF += pRecord->TypeLength; + + if (pRecord->RecordFlags & IL_Mask) { + memcpy(pNDEF, pRecord->ID, pRecord->IDLength); + pNDEF += pRecord->IDLength; + } + + memcpy(pNDEF, pRecord->PayloadBufferAdd, pRecord->PayloadLength); + pNDEF += pRecord->PayloadLength; + + return (pNDEF - start); } /** @@ -681,23 +681,23 @@ uint32_t NDEF::NDEF_WriteRecord(sRecordInfo_t *pRecord, uint8_t *pNDEF) */ uint32_t NDEF::NDEF_GetRecordLength(sRecordInfo_t *pRecord) { - // start by considering payload length - if (pRecord->PayloadLength <= 0xFF) { - pRecord->RecordFlags |= SR_Mask; - } else { - pRecord->RecordFlags &= ~SR_Mask; - } - - // Then compute the length - uint32_t length = 1 + // Flags - 1 + // Type length - ((pRecord->RecordFlags & SR_Mask) ? 1 : 4) + // Payload length - ((pRecord->RecordFlags & IL_Mask) ? 1 : 0) + // ID length - pRecord->TypeLength + // Type - ((pRecord->RecordFlags & IL_Mask) ? pRecord->IDLength : 0) + // ID - pRecord->PayloadLength; // Payload; - - return length; + // start by considering payload length + if (pRecord->PayloadLength <= 0xFF) { + pRecord->RecordFlags |= SR_Mask; + } else { + pRecord->RecordFlags &= ~SR_Mask; + } + + // Then compute the length + uint32_t length = 1 + // Flags + 1 + // Type length + ((pRecord->RecordFlags & SR_Mask) ? 1 : 4) + // Payload length + ((pRecord->RecordFlags & IL_Mask) ? 1 : 0) + // ID length + pRecord->TypeLength + // Type + ((pRecord->RecordFlags & IL_Mask) ? pRecord->IDLength : 0) + // ID + pRecord->PayloadLength; // Payload; + + return length; } /** @@ -706,7 +706,7 @@ uint32_t NDEF::NDEF_GetRecordLength(sRecordInfo_t *pRecord) */ uint16_t NDEF::NDEF_ClearNDEF(void) { - return NDEF_WriteNDEF(0, NULL); + return NDEF_WriteNDEF(0, NULL); } /** diff --git a/src/libNDEF/lib_NDEF.h b/src/libNDEF/lib_NDEF.h index b95a7cb..d49e09b 100755 --- a/src/libNDEF/lib_NDEF.h +++ b/src/libNDEF/lib_NDEF.h @@ -217,38 +217,38 @@ extern uint8_t NDEF_Record_Buffer [NDEF_RECORD_MAX_SIZE]; extern uint32_t NDEF_Record_Buffer_size; typedef enum { - UNKNOWN_TYPE = 0, - VCARD_TYPE, - UNABRIDGED_URI_TYPE, - WELL_KNOWN_ABRIDGED_URI_TYPE, - URI_SMS_TYPE, - URI_GEO_TYPE, - URI_EMAIL_TYPE, - SMARTPOSTER_TYPE, - URL_TYPE, - TEXT_TYPE, - HANDOVER_TYPE, - /* list of "external type" known by this demo, other external type will be addressed as UNKNWON_TYPE */ - M24SR_DISCOVERY_APP_TYPE, - BT_TYPE, - BLE_TYPE, - URI_WIFITOKEN_TYPE + UNKNOWN_TYPE = 0, + VCARD_TYPE, + UNABRIDGED_URI_TYPE, + WELL_KNOWN_ABRIDGED_URI_TYPE, + URI_SMS_TYPE, + URI_GEO_TYPE, + URI_EMAIL_TYPE, + SMARTPOSTER_TYPE, + URL_TYPE, + TEXT_TYPE, + HANDOVER_TYPE, + /* list of "external type" known by this demo, other external type will be addressed as UNKNWON_TYPE */ + M24SR_DISCOVERY_APP_TYPE, + BT_TYPE, + BLE_TYPE, + URI_WIFITOKEN_TYPE } NDEF_TypeDef; typedef struct sRecordInfo sRecordInfo_t; struct sRecordInfo { - uint8_t RecordFlags; - uint8_t TypeLength; - uint32_t PayloadLength; - uint8_t IDLength; - uint8_t Type[20]; - uint8_t ID[20]; - uint16_t PayloadOffset; - uint8_t *PayloadBufferAdd; /* add where payload content has been stored */ - NDEF_TypeDef NDEF_Type; /* to store identification ID for application */ - sRecordInfo_t *SPRecordStructAdd[SP_MAX_RECORD]; /*in case of smart poster array to store add of other sRecordInfo struct */ - uint8_t NbOfRecordInSPPayload; + uint8_t RecordFlags; + uint8_t TypeLength; + uint32_t PayloadLength; + uint8_t IDLength; + uint8_t Type[20]; + uint8_t ID[20]; + uint16_t PayloadOffset; + uint8_t *PayloadBufferAdd; /* add where payload content has been stored */ + NDEF_TypeDef NDEF_Type; /* to store identification ID for application */ + sRecordInfo_t *SPRecordStructAdd[SP_MAX_RECORD]; /*in case of smart poster array to store add of other sRecordInfo struct */ + uint8_t NbOfRecordInSPPayload; }; #endif /* __LIB_NDEF_H */ diff --git a/src/libNDEF/lib_NDEF_AAR.cpp b/src/libNDEF/lib_NDEF_AAR.cpp index a34e5c1..f84c3ce 100755 --- a/src/libNDEF/lib_NDEF_AAR.cpp +++ b/src/libNDEF/lib_NDEF_AAR.cpp @@ -70,48 +70,48 @@ */ uint16_t NDEF::NDEF_AddAAR(const sAARInfo *pAARStruct) { - uint16_t status = NDEF_ERROR; - - /* AAR: External Type Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- IL=0, CF=0 and SR=1 TNF=4 NFC Forum external type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ /* android.com:pkg */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* Do we have to add AAR to an existing NDEF message */ - /* retrieve current NDEF size and current record flag*/ - sRecordInfo_t AARrecord; - - /* fill AAR record header */ - AARrecord.RecordFlags = SR_Mask | TNF_NFCForumExternal; - AARrecord.TypeLength = AAR_TYPE_STRING_LENGTH; - - memcpy(AARrecord.Type, AAR_TYPE_STRING, AAR_TYPE_STRING_LENGTH); - - /* fill AAR payload */ - AARrecord.PayloadBufferAdd = (uint8_t *)pAARStruct->PackageName; - AARrecord.PayloadLength = strlen(pAARStruct->PackageName) ; - - status = NDEF_AppendRecord(&AARrecord); - - return status; + uint16_t status = NDEF_ERROR; + + /* AAR: External Type Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- IL=0, CF=0 and SR=1 TNF=4 NFC Forum external type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ /* android.com:pkg */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* Do we have to add AAR to an existing NDEF message */ + /* retrieve current NDEF size and current record flag*/ + sRecordInfo_t AARrecord; + + /* fill AAR record header */ + AARrecord.RecordFlags = SR_Mask | TNF_NFCForumExternal; + AARrecord.TypeLength = AAR_TYPE_STRING_LENGTH; + + memcpy(AARrecord.Type, AAR_TYPE_STRING, AAR_TYPE_STRING_LENGTH); + + /* fill AAR payload */ + AARrecord.PayloadBufferAdd = (uint8_t *)pAARStruct->PackageName; + AARrecord.PayloadLength = strlen(pAARStruct->PackageName) ; + + status = NDEF_AppendRecord(&AARrecord); + + return status; } diff --git a/src/libNDEF/lib_NDEF_AAR.h b/src/libNDEF/lib_NDEF_AAR.h index 2069c66..b9fdf47 100755 --- a/src/libNDEF/lib_NDEF_AAR.h +++ b/src/libNDEF/lib_NDEF_AAR.h @@ -35,7 +35,7 @@ #include "lib_NDEF.h" typedef struct { - char PackageName[80]; + char PackageName[80]; } sAARInfo; diff --git a/src/libNDEF/lib_NDEF_Bluetooth.cpp b/src/libNDEF/lib_NDEF_Bluetooth.cpp index 89b3e30..3b05773 100755 --- a/src/libNDEF/lib_NDEF_Bluetooth.cpp +++ b/src/libNDEF/lib_NDEF_Bluetooth.cpp @@ -109,11 +109,11 @@ */ uint8_t *NDEF::NDEF_BluetoothCopy(uint8_t *dst, uint8_t *src, uint32_t length) { - uint32_t index; - for (index = 0 ; index < length; index++) { - dst[index] = src[length - index - 1]; - } - return dst; + uint32_t index; + for (index = 0 ; index < length; index++) { + dst[index] = src[length - index - 1]; + } + return dst; } /** @@ -125,150 +125,150 @@ uint8_t *NDEF::NDEF_BluetoothCopy(uint8_t *dst, uint8_t *src, uint32_t length) */ uint16_t NDEF::NDEF_ReadBluetoothOOB(sRecordInfo_t *pRecord, Ndef_Bluetooth_OOB_t *pBluetooth) { - uint8_t *pData = pRecord->PayloadBufferAdd; - uint8_t *OOBEnd = pRecord->PayloadBufferAdd + pRecord->PayloadLength; - - pBluetooth->OptionalMask = 0; - pBluetooth->nbServiceData = 0; - pBluetooth->Role = NDEF_BLE_ROLE_UNDEF; - pBluetooth->DeviceAddressType = NDEF_BLE_UNDEF_ADDRESS_TYPE; - pBluetooth->nbUUID16 = 0; - pBluetooth->nbUUID32 = 0; - pBluetooth->nbUUID128 = 0; - pBluetooth->nbServiceSolicitation16 = 0; - pBluetooth->nbServiceSolicitation128 = 0; - - if ((pRecord->TypeLength == strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE)) && - !memcmp(pRecord->Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE))) { - pBluetooth->Type = NDEF_BLUETOOTH_BREDR; - /* Retrieve mandatory OOB data: */ - /* 2 bytes for length and 6 bytes for device addr */ - NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceAddress, &pData[2], sizeof(pBluetooth->DeviceAddress)); - pData += 8; - } else if ((pRecord->TypeLength == strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE)) && - !memcmp(pRecord->Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE))) { - pBluetooth->Type = NDEF_BLUETOOTH_BLE; - /* for BLE, mandatory fields are in EIR */ - } else { - /* This is an unknown MIME type */ - return NDEF_ERROR; - } - - /* EIR format: 1 byte for length, 1 byte for type, n bytes for data */ - while (pData < OOBEnd) { - NDEF_EIR_t *rEIR = (NDEF_EIR_t *)pData; - /* +1 for EIR length byte */ - pData += rEIR->length + 1; - - /* keep track of all EIR found */ - if (rEIR->type < 0x20) { - NDEF_BLUETOOTH_SET_OPTIONAL_MASK(pBluetooth, rEIR->type); - } - - switch (rEIR->type) { - case BLUETOOTH_EIR_FLAGS: - pBluetooth->Flags = *rEIR->value; - break; - - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16: - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16: - pBluetooth->nbUUID16 = (rEIR->length - 1) / 2 ; - NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID16, rEIR->value, rEIR->length - 1); - break; - - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32: - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32: - pBluetooth->nbUUID32 = (rEIR->length - 1) / 4 ; - NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID32, rEIR->value, rEIR->length - 1); - break; - - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128: - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128: - pBluetooth->nbUUID128 = (rEIR->length - 1) / 16 ; - NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID128, rEIR->value, rEIR->length - 1); - break; - - case BLUETOOTH_EIR_SHORT_LOCAL_NAME: - case BLUETOOTH_EIR_COMPLETE_LOCAL_NAME: - /* No worry about name length as max EIR length is 0xff using 1 byte for the type metadata */ - memcpy(pBluetooth->LocalName, rEIR->value, rEIR->length - 1); - pBluetooth->LocalName[rEIR->length] = '\0'; - break; - - case BLUETOOTH_EIR_TX_POWER_LEVEL: - pBluetooth->TxPowerLevel = *rEIR->value; - break; - - case BLUETOOTH_EIR_DEVICE_CLASS: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceClass, rEIR->value, sizeof(pBluetooth->DeviceClass)); - break; - - case BLUETOOTH_EIR_SIMPLE_PAIRING_HASH: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->SimplePairingHash, rEIR->value, sizeof(pBluetooth->SimplePairingHash)); - break; - - case BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->SimplePairingRandomizer, rEIR->value, sizeof(pBluetooth->SimplePairingRandomizer)); - break; - - case BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->SecureManagerTK, rEIR->value, sizeof(pBluetooth->SecureManagerTK)); - break; - - case BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS: - pBluetooth->SMFlags = *rEIR->value; - break; - - case BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->SlaveConnIntervalRange, rEIR->value, sizeof(pBluetooth->SlaveConnIntervalRange)); - break; - - case BLUETOOTH_EIR_SERVICE_SOLICITATION_16: - pBluetooth->nbServiceSolicitation16 = (rEIR->length - 1) / 2 ; - NDEF_BluetoothCopy((uint8_t *)pBluetooth->ServiceSolicitation16, rEIR->value, rEIR->length - 1); - break; - - case BLUETOOTH_EIR_SERVICE_SOLICITATION_128: - pBluetooth->nbServiceSolicitation128 = (rEIR->length - 1) / 16 ; - NDEF_BluetoothCopy((uint8_t *)pBluetooth->ServiceSolicitation128, rEIR->value, rEIR->length - 1); - break; - - case BLUETOOTH_EIR_SERVICE_DATA: - /* a specific function should be used for this EIR */ - pBluetooth->nbServiceData++; - break; - - case BLUETOOTH_EIR_MANUFACTURER_DATA: - /* a specific function should be used for this EIR */ - pBluetooth->nbManufacturerData++; - break; - - case BLUETOOTH_EIR_APPEARANCE: - pBluetooth->Appearance = *(uint16_t *)rEIR->value; - break; - - case BLUETOOTH_EIR_BLE_DEVICE_ADDRESS: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceAddress, rEIR->value, sizeof(pBluetooth->DeviceAddress)); - pBluetooth->DeviceAddressType = (Ndef_BLE_Address_Type_t)rEIR->value[sizeof(pBluetooth->DeviceAddress)]; - break; - - case BLUETOOTH_EIR_BLE_ROLE: - pBluetooth->Role = (Ndef_BLE_Role_t) * rEIR->value; - break; - - default: - pBluetooth->nbUnknown++; - break; - } /* switch rEIR->type */ - } /* while (pData < OOBEnd) */ - /* Check that BLE mandatory fields are there */ - if ((pBluetooth->Type == NDEF_BLUETOOTH_BLE) && - (!NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_BLE_DEVICE_ADDRESS) || - !NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_BLE_ROLE))) { - return NDEF_ERROR; + uint8_t *pData = pRecord->PayloadBufferAdd; + uint8_t *OOBEnd = pRecord->PayloadBufferAdd + pRecord->PayloadLength; + + pBluetooth->OptionalMask = 0; + pBluetooth->nbServiceData = 0; + pBluetooth->Role = NDEF_BLE_ROLE_UNDEF; + pBluetooth->DeviceAddressType = NDEF_BLE_UNDEF_ADDRESS_TYPE; + pBluetooth->nbUUID16 = 0; + pBluetooth->nbUUID32 = 0; + pBluetooth->nbUUID128 = 0; + pBluetooth->nbServiceSolicitation16 = 0; + pBluetooth->nbServiceSolicitation128 = 0; + + if ((pRecord->TypeLength == strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE)) && + !memcmp(pRecord->Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE))) { + pBluetooth->Type = NDEF_BLUETOOTH_BREDR; + /* Retrieve mandatory OOB data: */ + /* 2 bytes for length and 6 bytes for device addr */ + NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceAddress, &pData[2], sizeof(pBluetooth->DeviceAddress)); + pData += 8; + } else if ((pRecord->TypeLength == strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE)) && + !memcmp(pRecord->Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE))) { + pBluetooth->Type = NDEF_BLUETOOTH_BLE; + /* for BLE, mandatory fields are in EIR */ + } else { + /* This is an unknown MIME type */ + return NDEF_ERROR; + } + + /* EIR format: 1 byte for length, 1 byte for type, n bytes for data */ + while (pData < OOBEnd) { + NDEF_EIR_t *rEIR = (NDEF_EIR_t *)pData; + /* +1 for EIR length byte */ + pData += rEIR->length + 1; + + /* keep track of all EIR found */ + if (rEIR->type < 0x20) { + NDEF_BLUETOOTH_SET_OPTIONAL_MASK(pBluetooth, rEIR->type); } - return NDEF_OK; + switch (rEIR->type) { + case BLUETOOTH_EIR_FLAGS: + pBluetooth->Flags = *rEIR->value; + break; + + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16: + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16: + pBluetooth->nbUUID16 = (rEIR->length - 1) / 2 ; + NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID16, rEIR->value, rEIR->length - 1); + break; + + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32: + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32: + pBluetooth->nbUUID32 = (rEIR->length - 1) / 4 ; + NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID32, rEIR->value, rEIR->length - 1); + break; + + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128: + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128: + pBluetooth->nbUUID128 = (rEIR->length - 1) / 16 ; + NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID128, rEIR->value, rEIR->length - 1); + break; + + case BLUETOOTH_EIR_SHORT_LOCAL_NAME: + case BLUETOOTH_EIR_COMPLETE_LOCAL_NAME: + /* No worry about name length as max EIR length is 0xff using 1 byte for the type metadata */ + memcpy(pBluetooth->LocalName, rEIR->value, rEIR->length - 1); + pBluetooth->LocalName[rEIR->length] = '\0'; + break; + + case BLUETOOTH_EIR_TX_POWER_LEVEL: + pBluetooth->TxPowerLevel = *rEIR->value; + break; + + case BLUETOOTH_EIR_DEVICE_CLASS: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceClass, rEIR->value, sizeof(pBluetooth->DeviceClass)); + break; + + case BLUETOOTH_EIR_SIMPLE_PAIRING_HASH: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->SimplePairingHash, rEIR->value, sizeof(pBluetooth->SimplePairingHash)); + break; + + case BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->SimplePairingRandomizer, rEIR->value, sizeof(pBluetooth->SimplePairingRandomizer)); + break; + + case BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->SecureManagerTK, rEIR->value, sizeof(pBluetooth->SecureManagerTK)); + break; + + case BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS: + pBluetooth->SMFlags = *rEIR->value; + break; + + case BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->SlaveConnIntervalRange, rEIR->value, sizeof(pBluetooth->SlaveConnIntervalRange)); + break; + + case BLUETOOTH_EIR_SERVICE_SOLICITATION_16: + pBluetooth->nbServiceSolicitation16 = (rEIR->length - 1) / 2 ; + NDEF_BluetoothCopy((uint8_t *)pBluetooth->ServiceSolicitation16, rEIR->value, rEIR->length - 1); + break; + + case BLUETOOTH_EIR_SERVICE_SOLICITATION_128: + pBluetooth->nbServiceSolicitation128 = (rEIR->length - 1) / 16 ; + NDEF_BluetoothCopy((uint8_t *)pBluetooth->ServiceSolicitation128, rEIR->value, rEIR->length - 1); + break; + + case BLUETOOTH_EIR_SERVICE_DATA: + /* a specific function should be used for this EIR */ + pBluetooth->nbServiceData++; + break; + + case BLUETOOTH_EIR_MANUFACTURER_DATA: + /* a specific function should be used for this EIR */ + pBluetooth->nbManufacturerData++; + break; + + case BLUETOOTH_EIR_APPEARANCE: + pBluetooth->Appearance = *(uint16_t *)rEIR->value; + break; + + case BLUETOOTH_EIR_BLE_DEVICE_ADDRESS: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceAddress, rEIR->value, sizeof(pBluetooth->DeviceAddress)); + pBluetooth->DeviceAddressType = (Ndef_BLE_Address_Type_t)rEIR->value[sizeof(pBluetooth->DeviceAddress)]; + break; + + case BLUETOOTH_EIR_BLE_ROLE: + pBluetooth->Role = (Ndef_BLE_Role_t) * rEIR->value; + break; + + default: + pBluetooth->nbUnknown++; + break; + } /* switch rEIR->type */ + } /* while (pData < OOBEnd) */ + /* Check that BLE mandatory fields are there */ + if ((pBluetooth->Type == NDEF_BLUETOOTH_BLE) && + (!NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_BLE_DEVICE_ADDRESS) || + !NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_BLE_ROLE))) { + return NDEF_ERROR; + } + + return NDEF_OK; } /** @@ -281,224 +281,224 @@ uint16_t NDEF::NDEF_ReadBluetoothOOB(sRecordInfo_t *pRecord, Ndef_Bluetooth_OOB_ */ uint16_t NDEF::NDEF_AppendBluetoothOOB(Ndef_Bluetooth_OOB_t *pBluetooth, char *RecordID) { - sRecordInfo_t Record; - uint16_t status; - - Record.RecordFlags = TNF_MediaType; - Record.RecordFlags |= (RecordID != NULL) ? IL_Mask : 0; - Record.IDLength = strlen(RecordID); - memcpy(Record.ID, RecordID, Record.IDLength); - - if (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) { - Record.TypeLength = strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE); - memcpy(Record.Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, Record.TypeLength); - } else if (pBluetooth->Type == NDEF_BLUETOOTH_BLE) { - Record.TypeLength = strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE); - memcpy(Record.Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, Record.TypeLength); + sRecordInfo_t Record; + uint16_t status; + + Record.RecordFlags = TNF_MediaType; + Record.RecordFlags |= (RecordID != NULL) ? IL_Mask : 0; + Record.IDLength = strlen(RecordID); + memcpy(Record.ID, RecordID, Record.IDLength); + + if (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) { + Record.TypeLength = strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE); + memcpy(Record.Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, Record.TypeLength); + } else if (pBluetooth->Type == NDEF_BLUETOOTH_BLE) { + Record.TypeLength = strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE); + memcpy(Record.Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, Record.TypeLength); + } else { + return NDEF_ERROR; + } + + /* Generate OOB payload */ + Record.PayloadLength = NDEF_GetBluetoothOOBLength(pBluetooth); + Record.PayloadBufferAdd = NDEF_Record_Buffer; + if (Record.PayloadLength > NDEF_RECORD_MAX_SIZE) { + return NDEF_ERROR_MEMORY_INTERNAL; + } + + /* pData: pointer to ease increment of record buffer address (byte granularity) */ + uint8_t *pData = Record.PayloadBufferAdd; + + /* for BR-EDR Device address & length are managed outside EIR */ + if (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) { + *pData = Record.PayloadLength; + pData += 2; + NDEF_BluetoothCopy(pData, (uint8_t *)pBluetooth->DeviceAddress, sizeof(pBluetooth->DeviceAddress)); + pData += sizeof(pBluetooth->DeviceAddress); + } + + /* wEIR: pointer to ease write to the buffer. + * length always set with an additional +1 corresponding to the EIR type byte. + * pData increment is always done with an additional +1 corresponding to the EIR length byte. + */ + NDEF_EIR_t *wEIR; + + + if (pBluetooth->Type == NDEF_BLUETOOTH_BLE) { + /* following EIR are mandatory for BLE */ + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->DeviceAddress) + sizeof(pBluetooth->DeviceAddressType) + 1; + wEIR->type = BLUETOOTH_EIR_BLE_DEVICE_ADDRESS; + NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->DeviceAddress, sizeof(pBluetooth->DeviceAddress)); + wEIR->value[sizeof(pBluetooth->DeviceAddress)] = pBluetooth->DeviceAddressType; + pData += wEIR->length + 1; + + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->Role) + 1; + wEIR->type = BLUETOOTH_EIR_BLE_ROLE; + wEIR->value[0] = pBluetooth->Role; + pData += wEIR->length + 1; + + } + + /* Rely on the optional mask to know if a EIR is required or not */ + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_FLAGS)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->Flags) + 1; + wEIR->type = BLUETOOTH_EIR_FLAGS; + wEIR->value[0] = pBluetooth->Flags; + pData += wEIR->length + 1; + } + + if (pBluetooth->nbUUID16 > 0) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = 2 * pBluetooth->nbUUID16 + 1; + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16)) { + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16; } else { - return NDEF_ERROR; - } - - /* Generate OOB payload */ - Record.PayloadLength = NDEF_GetBluetoothOOBLength(pBluetooth); - Record.PayloadBufferAdd = NDEF_Record_Buffer; - if (Record.PayloadLength > NDEF_RECORD_MAX_SIZE) { - return NDEF_ERROR_MEMORY_INTERNAL; - } - - /* pData: pointer to ease increment of record buffer address (byte granularity) */ - uint8_t *pData = Record.PayloadBufferAdd; - - /* for BR-EDR Device address & length are managed outside EIR */ - if (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) { - *pData = Record.PayloadLength; - pData += 2; - NDEF_BluetoothCopy(pData, (uint8_t *)pBluetooth->DeviceAddress, sizeof(pBluetooth->DeviceAddress)); - pData += sizeof(pBluetooth->DeviceAddress); - } - - /* wEIR: pointer to ease write to the buffer. - * length always set with an additional +1 corresponding to the EIR type byte. - * pData increment is always done with an additional +1 corresponding to the EIR length byte. - */ - NDEF_EIR_t *wEIR; - - - if (pBluetooth->Type == NDEF_BLUETOOTH_BLE) { - /* following EIR are mandatory for BLE */ - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->DeviceAddress) + sizeof(pBluetooth->DeviceAddressType) + 1; - wEIR->type = BLUETOOTH_EIR_BLE_DEVICE_ADDRESS; - NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->DeviceAddress, sizeof(pBluetooth->DeviceAddress)); - wEIR->value[sizeof(pBluetooth->DeviceAddress)] = pBluetooth->DeviceAddressType; - pData += wEIR->length + 1; - - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->Role) + 1; - wEIR->type = BLUETOOTH_EIR_BLE_ROLE; - wEIR->value[0] = pBluetooth->Role; - pData += wEIR->length + 1; - - } - - /* Rely on the optional mask to know if a EIR is required or not */ - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_FLAGS)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->Flags) + 1; - wEIR->type = BLUETOOTH_EIR_FLAGS; - wEIR->value[0] = pBluetooth->Flags; - pData += wEIR->length + 1; - } - - if (pBluetooth->nbUUID16 > 0) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = 2 * pBluetooth->nbUUID16 + 1; - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16)) { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16; - } else { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16; - } - NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ClassUUID16, 2 * pBluetooth->nbUUID16); - pData += wEIR->length + 1; - - } - - if (pBluetooth->nbUUID32 > 0) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = 4 * pBluetooth->nbUUID32 + 1; - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32)) { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32; - } else { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32; - } - NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->ClassUUID32, 4 * pBluetooth->nbUUID32); - pData += wEIR->length + 1; - - } - - if (pBluetooth->nbUUID128 > 0) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = 16 * pBluetooth->nbUUID128 + 1; - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128)) { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128; - } else { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128; - } - NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ClassUUID128, 16 * pBluetooth->nbUUID128); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME) || - NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_COMPLETE_LOCAL_NAME)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = strlen(pBluetooth->LocalName) + 1; - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME)) { - wEIR->type = BLUETOOTH_EIR_SHORT_LOCAL_NAME; - } else { - wEIR->type = BLUETOOTH_EIR_COMPLETE_LOCAL_NAME; - } - memcpy(wEIR->value, pBluetooth->LocalName, strlen(pBluetooth->LocalName)); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_TX_POWER_LEVEL)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->TxPowerLevel) + 1; - wEIR->type = BLUETOOTH_EIR_TX_POWER_LEVEL; - wEIR->value[0] = pBluetooth->TxPowerLevel; - pData += wEIR->length + 1; - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_DEVICE_CLASS)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->DeviceClass) + 1; - wEIR->type = BLUETOOTH_EIR_DEVICE_CLASS; - NDEF_BluetoothCopy(wEIR->value, pBluetooth->DeviceClass, sizeof(pBluetooth->DeviceClass)); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_HASH)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->SimplePairingHash) + 1; - wEIR->type = BLUETOOTH_EIR_SIMPLE_PAIRING_HASH; - NDEF_BluetoothCopy(wEIR->value, pBluetooth->SimplePairingHash, sizeof(pBluetooth->SimplePairingHash)); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->SimplePairingRandomizer) + 1; - wEIR->type = BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER; - NDEF_BluetoothCopy(wEIR->value, pBluetooth->SimplePairingRandomizer, sizeof(pBluetooth->SimplePairingRandomizer)); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->SecureManagerTK) + 1; - wEIR->type = BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE; - NDEF_BluetoothCopy(wEIR->value, pBluetooth->SecureManagerTK, sizeof(pBluetooth->SecureManagerTK)); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->SMFlags) + 1; - wEIR->type = BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS; - wEIR->value[0] = pBluetooth->SMFlags; - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->SlaveConnIntervalRange) + 1; - wEIR->type = BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE; - NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->SlaveConnIntervalRange, sizeof(pBluetooth->SlaveConnIntervalRange)); - pData += wEIR->length + 1; - + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16; } + NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ClassUUID16, 2 * pBluetooth->nbUUID16); + pData += wEIR->length + 1; - if (pBluetooth->nbServiceSolicitation16 > 0) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = 2 * pBluetooth->nbServiceSolicitation16 + 1; - wEIR->type = BLUETOOTH_EIR_SERVICE_SOLICITATION_16; - NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->ServiceSolicitation16, 16 * pBluetooth->nbServiceSolicitation16); - pData += wEIR->length + 1; - - } - - if (pBluetooth->nbServiceSolicitation128 > 0) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = 16 * pBluetooth->nbServiceSolicitation128 + 1; - wEIR->type = BLUETOOTH_EIR_SERVICE_SOLICITATION_128; - NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ServiceSolicitation128, 16 * pBluetooth->nbServiceSolicitation128); - pData += wEIR->length + 1; + } + if (pBluetooth->nbUUID32 > 0) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = 4 * pBluetooth->nbUUID32 + 1; + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32)) { + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32; + } else { + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32; } + NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->ClassUUID32, 4 * pBluetooth->nbUUID32); + pData += wEIR->length + 1; - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_APPEARANCE)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->Appearance) + 1; - wEIR->type = BLUETOOTH_EIR_APPEARANCE; - wEIR->value[0] = pBluetooth->Appearance; - pData += wEIR->length + 1; + } + if (pBluetooth->nbUUID128 > 0) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = 16 * pBluetooth->nbUUID128 + 1; + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128)) { + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128; + } else { + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128; } + NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ClassUUID128, 16 * pBluetooth->nbUUID128); + pData += wEIR->length + 1; + } - status = NDEF_AppendRecord(&Record); - if (status != NDEF_OK) { - return status; + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME) || + NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_COMPLETE_LOCAL_NAME)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = strlen(pBluetooth->LocalName) + 1; + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME)) { + wEIR->type = BLUETOOTH_EIR_SHORT_LOCAL_NAME; + } else { + wEIR->type = BLUETOOTH_EIR_COMPLETE_LOCAL_NAME; } - - return NDEF_OK; + memcpy(wEIR->value, pBluetooth->LocalName, strlen(pBluetooth->LocalName)); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_TX_POWER_LEVEL)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->TxPowerLevel) + 1; + wEIR->type = BLUETOOTH_EIR_TX_POWER_LEVEL; + wEIR->value[0] = pBluetooth->TxPowerLevel; + pData += wEIR->length + 1; + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_DEVICE_CLASS)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->DeviceClass) + 1; + wEIR->type = BLUETOOTH_EIR_DEVICE_CLASS; + NDEF_BluetoothCopy(wEIR->value, pBluetooth->DeviceClass, sizeof(pBluetooth->DeviceClass)); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_HASH)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->SimplePairingHash) + 1; + wEIR->type = BLUETOOTH_EIR_SIMPLE_PAIRING_HASH; + NDEF_BluetoothCopy(wEIR->value, pBluetooth->SimplePairingHash, sizeof(pBluetooth->SimplePairingHash)); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->SimplePairingRandomizer) + 1; + wEIR->type = BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER; + NDEF_BluetoothCopy(wEIR->value, pBluetooth->SimplePairingRandomizer, sizeof(pBluetooth->SimplePairingRandomizer)); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->SecureManagerTK) + 1; + wEIR->type = BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE; + NDEF_BluetoothCopy(wEIR->value, pBluetooth->SecureManagerTK, sizeof(pBluetooth->SecureManagerTK)); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->SMFlags) + 1; + wEIR->type = BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS; + wEIR->value[0] = pBluetooth->SMFlags; + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->SlaveConnIntervalRange) + 1; + wEIR->type = BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE; + NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->SlaveConnIntervalRange, sizeof(pBluetooth->SlaveConnIntervalRange)); + pData += wEIR->length + 1; + + } + + if (pBluetooth->nbServiceSolicitation16 > 0) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = 2 * pBluetooth->nbServiceSolicitation16 + 1; + wEIR->type = BLUETOOTH_EIR_SERVICE_SOLICITATION_16; + NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->ServiceSolicitation16, 16 * pBluetooth->nbServiceSolicitation16); + pData += wEIR->length + 1; + + } + + if (pBluetooth->nbServiceSolicitation128 > 0) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = 16 * pBluetooth->nbServiceSolicitation128 + 1; + wEIR->type = BLUETOOTH_EIR_SERVICE_SOLICITATION_128; + NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ServiceSolicitation128, 16 * pBluetooth->nbServiceSolicitation128); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_APPEARANCE)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->Appearance) + 1; + wEIR->type = BLUETOOTH_EIR_APPEARANCE; + wEIR->value[0] = pBluetooth->Appearance; + pData += wEIR->length + 1; + + } + + + status = NDEF_AppendRecord(&Record); + if (status != NDEF_OK) { + return status; + } + + return NDEF_OK; } /** @@ -508,27 +508,27 @@ uint16_t NDEF::NDEF_AppendBluetoothOOB(Ndef_Bluetooth_OOB_t *pBluetooth, char *R */ uint32_t NDEF::NDEF_GetBluetoothOOBLength(Ndef_Bluetooth_OOB_t *pBluetooth) { - uint32_t length = (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) ? sizeof(pBluetooth->DeviceAddress) + 2 : 0; // +2 is for BR/EDR mandatory length - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_FLAGS) ? sizeof(pBluetooth->Flags) + 2 : 0 ; - length += pBluetooth->nbUUID16 ? pBluetooth->nbUUID16 * 2 + 2 : 0; - length += pBluetooth->nbUUID32 ? pBluetooth->nbUUID32 * 4 + 2 : 0; - length += pBluetooth->nbUUID128 ? pBluetooth->nbUUID128 * 16 + 2 : 0; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME) ? strlen(pBluetooth->LocalName) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_COMPLETE_LOCAL_NAME) ? strlen(pBluetooth->LocalName) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_TX_POWER_LEVEL) ? sizeof(pBluetooth->TxPowerLevel + 2) : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_DEVICE_CLASS) ? sizeof(pBluetooth->DeviceClass) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_HASH) ? sizeof(pBluetooth->SimplePairingHash) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER) ? sizeof(pBluetooth->SimplePairingRandomizer) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE) ? sizeof(pBluetooth->SecureManagerTK) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS) ? sizeof(pBluetooth->SMFlags) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE) ? sizeof(pBluetooth->SlaveConnIntervalRange) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_SOLICITATION_16) ? pBluetooth->nbServiceSolicitation16 * 2 + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_SOLICITATION_128) ? pBluetooth->nbServiceSolicitation128 * 16 + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_APPEARANCE) ? sizeof(pBluetooth->Appearance) + 2 : 0 ; - length += (pBluetooth->Type == NDEF_BLUETOOTH_BLE) ? sizeof(pBluetooth->DeviceAddress) + sizeof(pBluetooth->DeviceAddressType) + 2 : 0 ; - length += (pBluetooth->Type == NDEF_BLUETOOTH_BLE) ? sizeof(pBluetooth->Role) + 2 : 0; - - return length; + uint32_t length = (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) ? sizeof(pBluetooth->DeviceAddress) + 2 : 0; // +2 is for BR/EDR mandatory length + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_FLAGS) ? sizeof(pBluetooth->Flags) + 2 : 0 ; + length += pBluetooth->nbUUID16 ? pBluetooth->nbUUID16 * 2 + 2 : 0; + length += pBluetooth->nbUUID32 ? pBluetooth->nbUUID32 * 4 + 2 : 0; + length += pBluetooth->nbUUID128 ? pBluetooth->nbUUID128 * 16 + 2 : 0; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME) ? strlen(pBluetooth->LocalName) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_COMPLETE_LOCAL_NAME) ? strlen(pBluetooth->LocalName) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_TX_POWER_LEVEL) ? sizeof(pBluetooth->TxPowerLevel + 2) : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_DEVICE_CLASS) ? sizeof(pBluetooth->DeviceClass) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_HASH) ? sizeof(pBluetooth->SimplePairingHash) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER) ? sizeof(pBluetooth->SimplePairingRandomizer) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE) ? sizeof(pBluetooth->SecureManagerTK) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS) ? sizeof(pBluetooth->SMFlags) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE) ? sizeof(pBluetooth->SlaveConnIntervalRange) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_SOLICITATION_16) ? pBluetooth->nbServiceSolicitation16 * 2 + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_SOLICITATION_128) ? pBluetooth->nbServiceSolicitation128 * 16 + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_APPEARANCE) ? sizeof(pBluetooth->Appearance) + 2 : 0 ; + length += (pBluetooth->Type == NDEF_BLUETOOTH_BLE) ? sizeof(pBluetooth->DeviceAddress) + sizeof(pBluetooth->DeviceAddressType) + 2 : 0 ; + length += (pBluetooth->Type == NDEF_BLUETOOTH_BLE) ? sizeof(pBluetooth->Role) + 2 : 0; + + return length; } /** * @} diff --git a/src/libNDEF/lib_NDEF_Bluetooth.h b/src/libNDEF/lib_NDEF_Bluetooth.h index 91bfabd..7f7e1bb 100755 --- a/src/libNDEF/lib_NDEF_Bluetooth.h +++ b/src/libNDEF/lib_NDEF_Bluetooth.h @@ -46,40 +46,40 @@ /** @brief Enumerates the Extended Inquiry Responses, as defined in the Bluetooth v4.0 core specification. */ typedef enum { - BLUETOOTH_EIR_FLAGS = 0x01, /**< Bluetooth flags:\n + BLUETOOTH_EIR_FLAGS = 0x01, /**< Bluetooth flags:\n b0: LE limited Discoverable Mode,\n b1: LE general Discoverable Mode,\n b2: BR/EDR not supported,\n b3: Simultaneous LE & BR/EDR Controller,\n b4: Simultaneous LE & BR/EDR Host */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16 = 0x02, /**< Bluetooth service UUID on 16-bits (partial list) */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16 = 0x03, /**< Bluetooth service UUID on 16-bits (complete list) */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32 = 0x04, /**< Bluetooth service UUID on 32-bits (partial list) */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32 = 0x05, /**< Bluetooth service UUID on 32-bits (complete list) */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128 = 0x06, /**< Bluetooth service UUID on 128-bits (partial list) */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128 = 0x07, /**< Bluetooth service UUID on 128-bits (complete list) */ - BLUETOOTH_EIR_SHORT_LOCAL_NAME = 0x08, /**< Shortened local name */ - BLUETOOTH_EIR_COMPLETE_LOCAL_NAME = 0x09, /**< Complete local name */ - BLUETOOTH_EIR_TX_POWER_LEVEL = 0x0A, /**< TX Power Level (1 byte): 0xXX:-127 to +127dBm */ - BLUETOOTH_EIR_DEVICE_CLASS = 0x0D, /**< Class of device, Format defined in Assigned Numbers */ - BLUETOOTH_EIR_SIMPLE_PAIRING_HASH = 0x0E, /**< Simple Pairing Hash C (16 octets), Format defined in [Vol. 2], Part H Section 7.2.2*/ - BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER = 0x0F, /**< Simple Pairing Randomizer R (16 octets), Format defined in[Vol. 2], Part H Section 7.2.2 */ - BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE = 0x10, /**< TK Value: Value as used in pairing over LE Physical channel. Format defined in [Vol. 3], Part H Section 2.3*/ - BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS = 0x11, /**< Flags (1 octet):\n + BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16 = 0x02, /**< Bluetooth service UUID on 16-bits (partial list) */ + BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16 = 0x03, /**< Bluetooth service UUID on 16-bits (complete list) */ + BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32 = 0x04, /**< Bluetooth service UUID on 32-bits (partial list) */ + BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32 = 0x05, /**< Bluetooth service UUID on 32-bits (complete list) */ + BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128 = 0x06, /**< Bluetooth service UUID on 128-bits (partial list) */ + BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128 = 0x07, /**< Bluetooth service UUID on 128-bits (complete list) */ + BLUETOOTH_EIR_SHORT_LOCAL_NAME = 0x08, /**< Shortened local name */ + BLUETOOTH_EIR_COMPLETE_LOCAL_NAME = 0x09, /**< Complete local name */ + BLUETOOTH_EIR_TX_POWER_LEVEL = 0x0A, /**< TX Power Level (1 byte): 0xXX:-127 to +127dBm */ + BLUETOOTH_EIR_DEVICE_CLASS = 0x0D, /**< Class of device, Format defined in Assigned Numbers */ + BLUETOOTH_EIR_SIMPLE_PAIRING_HASH = 0x0E, /**< Simple Pairing Hash C (16 octets), Format defined in [Vol. 2], Part H Section 7.2.2*/ + BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER = 0x0F, /**< Simple Pairing Randomizer R (16 octets), Format defined in[Vol. 2], Part H Section 7.2.2 */ + BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE = 0x10, /**< TK Value: Value as used in pairing over LE Physical channel. Format defined in [Vol. 3], Part H Section 2.3*/ + BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS = 0x11, /**< Flags (1 octet):\n b0: OOB Flags Field (0 = OOB data not present, 1 = OOB data present),\n b1: LE supported (Host) (i.e. bit 65 of LMP Extended Feature bits Page 1),\n b2: Simultaneous LE and BR/EDR to Same Device Capable (Host) (i.e. bit 66 of LMP Extended Feature bits Page 1)\n b3: Address type (0 = Public Address, 1 = Random Address) */ - BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE = 0x12, /**< Slave Connection Interval Range: The first 2 octets defines the minimum value for the connection interval, The second 2 octets defines the maximum value for the connection interval */ - BLUETOOTH_EIR_SERVICE_SOLICITATION_16 = 0x14, /**< Service UUIDs: List of 16 bit Service UUIDs*/ - BLUETOOTH_EIR_SERVICE_SOLICITATION_128 = 0x15, /**< Service UUIDs: List of 128 bit Service UUID*/ - BLUETOOTH_EIR_SERVICE_DATA = 0x16, /**< Service Data (2 or more octets): The first 2 octets contain the 16 bit Service UUID followed by additional service data */ - BLUETOOTH_EIR_APPEARANCE = 0x19, /**< UUID for `Appearance`: The Appearance characteristic value shall be the enumerated value as defined by Bluetooth Assigned Numbers document. */ - BLUETOOTH_EIR_BLE_DEVICE_ADDRESS = 0x1B, /**< 6 LSB bytes: Device address, 7th byte: Address type (Public/Random) */ - BLUETOOTH_EIR_BLE_ROLE = 0x1C, /**< Device Role: Periph only, Central only, Periph preferred, Central preferred */ - BLUETOOTH_EIR_MANUFACTURER_DATA = 0xFF /**< Manufacturer Specific Data (2 or more octets): The first 2 octets contain the Company Identifier Code followed by additional manufacturer specific data */ + BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE = 0x12, /**< Slave Connection Interval Range: The first 2 octets defines the minimum value for the connection interval, The second 2 octets defines the maximum value for the connection interval */ + BLUETOOTH_EIR_SERVICE_SOLICITATION_16 = 0x14, /**< Service UUIDs: List of 16 bit Service UUIDs*/ + BLUETOOTH_EIR_SERVICE_SOLICITATION_128 = 0x15, /**< Service UUIDs: List of 128 bit Service UUID*/ + BLUETOOTH_EIR_SERVICE_DATA = 0x16, /**< Service Data (2 or more octets): The first 2 octets contain the 16 bit Service UUID followed by additional service data */ + BLUETOOTH_EIR_APPEARANCE = 0x19, /**< UUID for `Appearance`: The Appearance characteristic value shall be the enumerated value as defined by Bluetooth Assigned Numbers document. */ + BLUETOOTH_EIR_BLE_DEVICE_ADDRESS = 0x1B, /**< 6 LSB bytes: Device address, 7th byte: Address type (Public/Random) */ + BLUETOOTH_EIR_BLE_ROLE = 0x1C, /**< Device Role: Periph only, Central only, Periph preferred, Central preferred */ + BLUETOOTH_EIR_MANUFACTURER_DATA = 0xFF /**< Manufacturer Specific Data (2 or more octets): The first 2 octets contain the Company Identifier Code followed by additional manufacturer specific data */ } Ndef_Bluetooth_Eir_Types_t; @@ -94,24 +94,24 @@ typedef enum { /** @brief Enumerates the Bluetooth LE address types. */ typedef enum { - NDEF_BLE_PUBLIC_ADDRESS_TYPE = 0x0, /**< Public Device Address. */ - NDEF_BLE_RANDOM_ADDRESS_TYPE = 0x1, /**< Random Device Address. */ - NDEF_BLE_UNDEF_ADDRESS_TYPE = 0xff /**< Device Address is undefined. */ + NDEF_BLE_PUBLIC_ADDRESS_TYPE = 0x0, /**< Public Device Address. */ + NDEF_BLE_RANDOM_ADDRESS_TYPE = 0x1, /**< Random Device Address. */ + NDEF_BLE_UNDEF_ADDRESS_TYPE = 0xff /**< Device Address is undefined. */ } Ndef_BLE_Address_Type_t; /** @brief Enumerates Bluetooth LE Roles */ typedef enum { - NDEF_BLE_ROLE_PERIPH_ONLY = 0x0, /**< Only Peripheral Role supported. */ - NDEF_BLE_ROLE_CENTRAL_ONLY = 0x1, /**< Only Central Role supported. */ - NDEF_BLE_ROLE_PERIPH_PREFERRED = 0x2, /**< Peripheral and Central Role supported, Peripheral Role preferred for connection establishment. */ - NDEF_BLE_ROLE_CENTRAL_PREFERRED = 0x3, /**< Peripheral and Central Role supported, Central Role preferred for connection establishment. */ - NDEF_BLE_ROLE_UNDEF = 0xff /**< LE Role is undefined. */ + NDEF_BLE_ROLE_PERIPH_ONLY = 0x0, /**< Only Peripheral Role supported. */ + NDEF_BLE_ROLE_CENTRAL_ONLY = 0x1, /**< Only Central Role supported. */ + NDEF_BLE_ROLE_PERIPH_PREFERRED = 0x2, /**< Peripheral and Central Role supported, Peripheral Role preferred for connection establishment. */ + NDEF_BLE_ROLE_CENTRAL_PREFERRED = 0x3, /**< Peripheral and Central Role supported, Central Role preferred for connection establishment. */ + NDEF_BLE_ROLE_UNDEF = 0xff /**< LE Role is undefined. */ } Ndef_BLE_Role_t; /** @brief Enumerates Bluetooth protocols */ typedef enum { - NDEF_BLUETOOTH_BREDR, /**< Standard bluetooth */ - NDEF_BLUETOOTH_BLE /**< Bluetooth Low Energy */ + NDEF_BLUETOOTH_BREDR, /**< Standard bluetooth */ + NDEF_BLUETOOTH_BLE /**< Bluetooth Low Energy */ } Ndef_Bluetooth_type_t; /** @brief Helper macro to set a particular EIR in the EIR mask of a `Ndef_Bluetooth_OOB_t` instance. @@ -138,53 +138,53 @@ typedef enum { * No union used here to comply with the Cube coding guidelines, despite the fact that it could have save memory space. */ typedef struct { - /* Mandatory fields */ - Ndef_Bluetooth_type_t Type; /**< *Mandatory*: Bluetooth type (Br/Edr or LE). */ - char DeviceAddress[6]; /**< *Mandatory*: Device address. For LE: 6 LSB of Device Address EIR. */ - /* Optional common fields */ - uint32_t OptionalMask; /**< This Mask is used to keep track of EIRs present in the OOB: each bit index corresponds to a `Ndef_Bluetooth_Eir_Types_t` value. */ - uint8_t Flags; /**< Flags from BLUETOOTH_EIR_FLAGS. */ - - uint16_t ClassUUID16[0xff / 2]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16. */ - uint32_t ClassUUID32[0xff / 4]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32. */ - uint32_t ClassUUID128[0xff / 16][4]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128. */ - uint8_t nbUUID16; /**< Number of UUIDs specified in ClassUUID16. */ - uint8_t nbUUID32; /**< Number of UUIDs specified in ClassUUID32. */ - uint8_t nbUUID128; /**< Number of UUIDs specified in ClassUUID128. */ - - char LocalName[0xff]; /**< Device local name from BLUETOOTH_EIR_SHORT_LOCAL_NAME or BLUETOOTH_EIR_COMPLETE_LOCAL_NAME. */ - uint8_t DeviceClass[3]; /**< Class of device from BLUETOOTH_EIR_DEVICE_CLASS. */ - // if no TPL, TPL is unknown - uint8_t TxPowerLevel; /**< TX power Level from BLUETOOTH_EIR_TX_POWER_LEVEL. */ - - uint8_t SMFlags; /**< Security Manager Flags from BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS. */ - uint16_t SlaveConnIntervalRange[2]; /**< Slave Connection Interval Range from BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE. */ - uint16_t ServiceSolicitation16[0xff / 2]; /**< Service Solicitation from BLUETOOTH_EIR_SERVICE_SOLICITATION_16. */ - uint32_t ServiceSolicitation128[0xff / 16][4]; /**< Service Solicitation from BLUETOOTH_EIR_SERVICE_SOLICITATION_128. */ - uint8_t nbServiceSolicitation16; /**< Number of UUIDs in ServiceSolicitation16. */ - uint8_t nbServiceSolicitation128; /**< Number of UUIDs in ServiceSolicitation128. */ - /* for br/edr only */ - uint8_t SimplePairingHash[16]; /**< *For Br/Edr only*: Simple Pairing Hash from BLUETOOTH_EIR_SIMPLE_PAIRING_HASH. */ - uint8_t SimplePairingRandomizer[16]; /**< *For Br/Edr only*: Simple Pairing Randomizer from BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER. */ - /* BLE mandatory fields */ - Ndef_BLE_Address_Type_t DeviceAddressType; /**< *For LE only*, *Mandatory*: Address Type, MSB of the Device Address EIR (Public or Random) */ - Ndef_BLE_Role_t Role; /**< *For LE only*, *Mandatory*: LE Role from BLUETOOTH_EIR_BLE_ROLE and defined in `Ndef_BLE_Role_t`. */ - /* BLE optional fields */ - uint8_t SecureManagerTK[16]; /**< *For LE only*: Security Manager TK from BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE. */ - uint16_t Appearance; /**< *For LE only*: Appearance from BLUETOOTH_EIR_APPEARANCE. */ - /* track number of unparsed EIR */ - uint8_t nbUnknown; /**< Number of EIRs not parsed because of an unknown EIR type. */ - uint8_t nbServiceData; /**< Number of EIRs not parsed because being of type BLUETOOTH_EIR_SERVICE_DATA. */ - uint8_t nbManufacturerData; /**< Number of EIRs not parsed because being of type BLUETOOTH_EIR_MANUFACTURER_DATA. */ + /* Mandatory fields */ + Ndef_Bluetooth_type_t Type; /**< *Mandatory*: Bluetooth type (Br/Edr or LE). */ + char DeviceAddress[6]; /**< *Mandatory*: Device address. For LE: 6 LSB of Device Address EIR. */ + /* Optional common fields */ + uint32_t OptionalMask; /**< This Mask is used to keep track of EIRs present in the OOB: each bit index corresponds to a `Ndef_Bluetooth_Eir_Types_t` value. */ + uint8_t Flags; /**< Flags from BLUETOOTH_EIR_FLAGS. */ + + uint16_t ClassUUID16[0xff / 2]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16. */ + uint32_t ClassUUID32[0xff / 4]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32. */ + uint32_t ClassUUID128[0xff / 16][4]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128. */ + uint8_t nbUUID16; /**< Number of UUIDs specified in ClassUUID16. */ + uint8_t nbUUID32; /**< Number of UUIDs specified in ClassUUID32. */ + uint8_t nbUUID128; /**< Number of UUIDs specified in ClassUUID128. */ + + char LocalName[0xff]; /**< Device local name from BLUETOOTH_EIR_SHORT_LOCAL_NAME or BLUETOOTH_EIR_COMPLETE_LOCAL_NAME. */ + uint8_t DeviceClass[3]; /**< Class of device from BLUETOOTH_EIR_DEVICE_CLASS. */ + // if no TPL, TPL is unknown + uint8_t TxPowerLevel; /**< TX power Level from BLUETOOTH_EIR_TX_POWER_LEVEL. */ + + uint8_t SMFlags; /**< Security Manager Flags from BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS. */ + uint16_t SlaveConnIntervalRange[2]; /**< Slave Connection Interval Range from BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE. */ + uint16_t ServiceSolicitation16[0xff / 2]; /**< Service Solicitation from BLUETOOTH_EIR_SERVICE_SOLICITATION_16. */ + uint32_t ServiceSolicitation128[0xff / 16][4]; /**< Service Solicitation from BLUETOOTH_EIR_SERVICE_SOLICITATION_128. */ + uint8_t nbServiceSolicitation16; /**< Number of UUIDs in ServiceSolicitation16. */ + uint8_t nbServiceSolicitation128; /**< Number of UUIDs in ServiceSolicitation128. */ + /* for br/edr only */ + uint8_t SimplePairingHash[16]; /**< *For Br/Edr only*: Simple Pairing Hash from BLUETOOTH_EIR_SIMPLE_PAIRING_HASH. */ + uint8_t SimplePairingRandomizer[16]; /**< *For Br/Edr only*: Simple Pairing Randomizer from BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER. */ + /* BLE mandatory fields */ + Ndef_BLE_Address_Type_t DeviceAddressType; /**< *For LE only*, *Mandatory*: Address Type, MSB of the Device Address EIR (Public or Random) */ + Ndef_BLE_Role_t Role; /**< *For LE only*, *Mandatory*: LE Role from BLUETOOTH_EIR_BLE_ROLE and defined in `Ndef_BLE_Role_t`. */ + /* BLE optional fields */ + uint8_t SecureManagerTK[16]; /**< *For LE only*: Security Manager TK from BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE. */ + uint16_t Appearance; /**< *For LE only*: Appearance from BLUETOOTH_EIR_APPEARANCE. */ + /* track number of unparsed EIR */ + uint8_t nbUnknown; /**< Number of EIRs not parsed because of an unknown EIR type. */ + uint8_t nbServiceData; /**< Number of EIRs not parsed because being of type BLUETOOTH_EIR_SERVICE_DATA. */ + uint8_t nbManufacturerData; /**< Number of EIRs not parsed because being of type BLUETOOTH_EIR_MANUFACTURER_DATA. */ } Ndef_Bluetooth_OOB_t ; /** @brief Extended Inquiry Response format. * @details This structure is used to parse/build EIRs in the Bluetooth OOB. */ typedef struct { - uint8_t length; /**< Length of the EIRs, including the type field (1 byte). */ - uint8_t type; /**< EIR type as defined in `Ndef_Bluetooth_Eir_Types_t`. */ - uint8_t value[1]; /**< single-element array, to keep track of the address of the EIR data */ + uint8_t length; /**< Length of the EIRs, including the type field (1 byte). */ + uint8_t type; /**< EIR type as defined in `Ndef_Bluetooth_Eir_Types_t`. */ + uint8_t value[1]; /**< single-element array, to keep track of the address of the EIR data */ } NDEF_EIR_t ; /** @} diff --git a/src/libNDEF/lib_NDEF_Email.cpp b/src/libNDEF/lib_NDEF_Email.cpp index 1ced864..26080f2 100755 --- a/src/libNDEF/lib_NDEF_Email.cpp +++ b/src/libNDEF/lib_NDEF_Email.cpp @@ -66,94 +66,94 @@ */ void NDEF::NDEF_FillEmailStruct(uint8_t *pPayload, uint32_t PayloadSize, sEmailInfo *pEmailStruct) { - uint8_t *pLastByteAdd, *pLook4Word, *pEndString; - uint32_t SizeOfKeyWord = 0; + uint8_t *pLastByteAdd, *pLook4Word, *pEndString; + uint32_t SizeOfKeyWord = 0; - pEndString = 0; + pEndString = 0; - /* First character force to NULL in case not matching found */ + /* First character force to NULL in case not matching found */ #ifdef NDEF_DYN_ALLOC - pEmailStruct->EmailAdd = NULL; - pEmailStruct->Subject = NULL; - pEmailStruct->Message = NULL; - pEmailStruct->Information = NULL; + pEmailStruct->EmailAdd = NULL; + pEmailStruct->Subject = NULL; + pEmailStruct->Message = NULL; + pEmailStruct->Information = NULL; #else - *pEmailStruct->EmailAdd = 0; - *pEmailStruct->Subject = 0; - *pEmailStruct->Message = 0; + *pEmailStruct->EmailAdd = 0; + *pEmailStruct->Subject = 0; + *pEmailStruct->Message = 0; #endif - /* Interesting information are stored before picture if any */ - /* Moreover picture is not used in this demonstration SW */ - pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); + /* Interesting information are stored before picture if any */ + /* Moreover picture is not used in this demonstration SW */ + pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); - /* first byte should be the "mailto:" well know URI type, skip it */ - pLook4Word = ++pPayload; + /* first byte should be the "mailto:" well know URI type, skip it */ + pLook4Word = ++pPayload; - /* Retrieve email add */ - if (pLook4Word != pLastByteAdd) { - pEndString = pLook4Word; - while (memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { - pEndString++; - } - if ((!memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH)) || (pEndString == pLastByteAdd)) { + /* Retrieve email add */ + if (pLook4Word != pLastByteAdd) { + pEndString = pLook4Word; + while (memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { + pEndString++; + } + if ((!memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH)) || (pEndString == pLastByteAdd)) { #ifdef NDEF_DYN_ALLOC - pEmailStruct->EmailAdd = malloc(pEndString - pLook4Word + 1); - if (pEmailStruct->EmailAdd != NULL) + pEmailStruct->EmailAdd = malloc(pEndString - pLook4Word + 1); + if (pEmailStruct->EmailAdd != NULL) #endif - { - memcpy(pEmailStruct->EmailAdd, pLook4Word, pEndString - pLook4Word); - /* add end of string character */ - pEmailStruct->EmailAdd[pEndString - pLook4Word] = 0; - } - } + { + memcpy(pEmailStruct->EmailAdd, pLook4Word, pEndString - pLook4Word); + /* add end of string character */ + pEmailStruct->EmailAdd[pEndString - pLook4Word] = 0; + } } + } - pEndString += URI_FIRST_DATA_END_LENGTH; - pLook4Word = pEndString; - - /* check if e-mail subject is present */ - if (!memcmp(pLook4Word, SUBJECT_BEGIN_STRING, SUBJECT_BEGIN_STRING_LENGTH)) { - SizeOfKeyWord = SUBJECT_BEGIN_STRING_LENGTH; - - /* Retrieve subject */ - if (pLook4Word != pLastByteAdd) { - pLook4Word += SizeOfKeyWord; - pEndString = pLook4Word; - while (memcmp(pEndString, URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { - pEndString++; - } - if ((!memcmp(pEndString, URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH)) || (pEndString == pLastByteAdd)) { + pEndString += URI_FIRST_DATA_END_LENGTH; + pLook4Word = pEndString; + + /* check if e-mail subject is present */ + if (!memcmp(pLook4Word, SUBJECT_BEGIN_STRING, SUBJECT_BEGIN_STRING_LENGTH)) { + SizeOfKeyWord = SUBJECT_BEGIN_STRING_LENGTH; + + /* Retrieve subject */ + if (pLook4Word != pLastByteAdd) { + pLook4Word += SizeOfKeyWord; + pEndString = pLook4Word; + while (memcmp(pEndString, URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { + pEndString++; + } + if ((!memcmp(pEndString, URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH)) || (pEndString == pLastByteAdd)) { #ifdef NDEF_DYN_ALLOC - pEmailStruct->Subject = malloc(pEndString - pLook4Word + 1); - if (pEmailStruct->Subject != NULL) + pEmailStruct->Subject = malloc(pEndString - pLook4Word + 1); + if (pEmailStruct->Subject != NULL) #endif - { - memcpy(pEmailStruct->Subject, pLook4Word, pEndString - pLook4Word); - /* add end of string character */ - pEmailStruct->Subject[pEndString - pLook4Word] = 0; - } - } - pEndString += URI_SECOND_DATA_END_LENGTH; + { + memcpy(pEmailStruct->Subject, pLook4Word, pEndString - pLook4Word); + /* add end of string character */ + pEmailStruct->Subject[pEndString - pLook4Word] = 0; } + } + pEndString += URI_SECOND_DATA_END_LENGTH; } + } - pLook4Word = pEndString; + pLook4Word = pEndString; - /* check if e-mail message is present */ - if (!memcmp(pLook4Word, MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH)) { - pEndString += MESSAGE_BEGIN_STRING_LENGTH; - /* Retrieve message */ + /* check if e-mail message is present */ + if (!memcmp(pLook4Word, MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH)) { + pEndString += MESSAGE_BEGIN_STRING_LENGTH; + /* Retrieve message */ #ifdef NDEF_DYN_ALLOC - pEmailStruct->Message = malloc(PayloadSize - (pEndString - pPayload + 1) + 1); - if (pEmailStruct->Message != NULL) + pEmailStruct->Message = malloc(PayloadSize - (pEndString - pPayload + 1) + 1); + if (pEmailStruct->Message != NULL) #endif - { - memcpy(pEmailStruct->Message, pEndString, PayloadSize - (pEndString - pPayload + 1)); - /* add end of string character */ - pEmailStruct->Message[PayloadSize - (pEndString - pPayload + 1)] = 0; - } + { + memcpy(pEmailStruct->Message, pEndString, PayloadSize - (pEndString - pPayload + 1)); + /* add end of string character */ + pEmailStruct->Message[PayloadSize - (pEndString - pPayload + 1)] = 0; } + } } /** @@ -163,17 +163,17 @@ void NDEF::NDEF_FillEmailStruct(uint8_t *pPayload, uint32_t PayloadSize, sEmailI */ void NDEF::NDEF_ReadURI_Email(sRecordInfo_t *pRecordStruct, sEmailInfo *pEmailStruct) { - uint8_t *pPayload; - uint32_t PayloadSize; + uint8_t *pPayload; + uint32_t PayloadSize; - PayloadSize = pRecordStruct->PayloadLength; + PayloadSize = pRecordStruct->PayloadLength; - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - if (pRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { - NDEF_FillEmailStruct(pPayload, PayloadSize, pEmailStruct); - } + if (pRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { + NDEF_FillEmailStruct(pPayload, PayloadSize, pEmailStruct); + } } @@ -195,36 +195,36 @@ void NDEF::NDEF_ReadURI_Email(sRecordInfo_t *pRecordStruct, sEmailInfo *pEmailSt */ uint16_t NDEF::NDEF_ReadEmail(sRecordInfo_t *pRecordStruct, sEmailInfo *pEmailStruct) { - uint16_t status = NDEF_ERROR; - sRecordInfo_t *pSPRecordStruct; - uint32_t PayloadSize, RecordPosition; - uint8_t *pData; + uint16_t status = NDEF_ERROR; + sRecordInfo_t *pSPRecordStruct; + uint32_t PayloadSize, RecordPosition; + uint8_t *pData; + + + if (pRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { + NDEF_ReadURI_Email(pRecordStruct, pEmailStruct); + status = NDEF_OK; + } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { + for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { + pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; + if (pSPRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { + NDEF_ReadURI_Email(pSPRecordStruct, pEmailStruct); + status = NDEF_OK; + } + if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { + PayloadSize = pSPRecordStruct->PayloadLength; + /* The instruction content the UTF-8 language code that is not used here */ + pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; + PayloadSize -= *pData + 1; /* remove not useful data */ + pData += *pData + 1; - if (pRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { - NDEF_ReadURI_Email(pRecordStruct, pEmailStruct); - status = NDEF_OK; - } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { - for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { - pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; - if (pSPRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { - NDEF_ReadURI_Email(pSPRecordStruct, pEmailStruct); - status = NDEF_OK; - } - if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { - PayloadSize = pSPRecordStruct->PayloadLength; - - /* The instruction content the UTF-8 language code that is not used here */ - pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; - PayloadSize -= *pData + 1; /* remove not useful data */ - pData += *pData + 1; - - memcpy(pEmailStruct->Information, pData, PayloadSize); - } - } + memcpy(pEmailStruct->Information, pData, PayloadSize); + } } + } - return status; + return status; } /** @@ -239,13 +239,13 @@ uint16_t NDEF::NDEF_ReadEmail(sRecordInfo_t *pRecordStruct, sEmailInfo *pEmailSt */ uint16_t NDEF::NDEF_WriteEmail(sEmailInfo *pEmailStruct) { - uint16_t status = NDEF_ERROR, Offset = 0; + uint16_t status = NDEF_ERROR, Offset = 0; - NDEF_PrepareEmailMessage(pEmailStruct, NDEF_Buffer, &Offset); + NDEF_PrepareEmailMessage(pEmailStruct, NDEF_Buffer, &Offset); - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); - return status; + return status; } /** @@ -256,139 +256,139 @@ uint16_t NDEF::NDEF_WriteEmail(sEmailInfo *pEmailStruct) */ void NDEF::NDEF_PrepareEmailMessage(sEmailInfo *pEmailStruct, uint8_t *pNDEFMessage, uint16_t *size) { - uint16_t Offset = 0; - uint32_t emailSize = 0; - uint32_t infoSize = 0; - uint32_t totalSize = 0; - - /* Email is an URI but can be included in a smart poster to add text to give instruction to user for instance */ - - /* Email (smart poster) Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* Email : 1+@+1+subject+1+message */ - emailSize = 1 + strlen(pEmailStruct->EmailAdd) + URI_FIRST_DATA_END_LENGTH + SUBJECT_BEGIN_STRING_LENGTH + - strlen(pEmailStruct->Subject) + URI_SECOND_DATA_END_LENGTH + MESSAGE_BEGIN_STRING_LENGTH + strlen(pEmailStruct->Message); - - /* Check if a Smart poster is needed */ - if (pEmailStruct->Information[0] != '\0') { - /* Info : 1+2+info */ - infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pEmailStruct->Information); - /* Total */ - totalSize = 4 + emailSize + 4 + infoSize; - if (emailSize > 255) { - totalSize += 3; /* Normal Email size */ - } - if (infoSize > 255) { - totalSize += 3; /* Normal Info size */ - } - - /* SmartPoster header */ - if (totalSize > 255) { - pNDEFMessage[Offset++] = 0xC1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = totalSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0xD1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)totalSize; - } - memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); - Offset += SMART_POSTER_TYPE_STRING_LENGTH; - } - - /* Email header */ - pNDEFMessage[Offset] = 0x81; - if (emailSize < 256) { - pNDEFMessage[Offset] |= 0x10; // Set the SR bit + uint16_t Offset = 0; + uint32_t emailSize = 0; + uint32_t infoSize = 0; + uint32_t totalSize = 0; + + /* Email is an URI but can be included in a smart poster to add text to give instruction to user for instance */ + + /* Email (smart poster) Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* Email : 1+@+1+subject+1+message */ + emailSize = 1 + strlen(pEmailStruct->EmailAdd) + URI_FIRST_DATA_END_LENGTH + SUBJECT_BEGIN_STRING_LENGTH + + strlen(pEmailStruct->Subject) + URI_SECOND_DATA_END_LENGTH + MESSAGE_BEGIN_STRING_LENGTH + strlen(pEmailStruct->Message); + + /* Check if a Smart poster is needed */ + if (pEmailStruct->Information[0] != '\0') { + /* Info : 1+2+info */ + infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pEmailStruct->Information); + /* Total */ + totalSize = 4 + emailSize + 4 + infoSize; + if (emailSize > 255) { + totalSize += 3; /* Normal Email size */ } - if (pEmailStruct->Information[0] == '\0') { - pNDEFMessage[Offset] |= 0x40; // Set the ME bit + if (infoSize > 255) { + totalSize += 3; /* Normal Info size */ } - Offset++; - pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; - if (emailSize > 255) { - pNDEFMessage[Offset++] = (emailSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (emailSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (emailSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = emailSize & 0x000000FF; + /* SmartPoster header */ + if (totalSize > 255) { + pNDEFMessage[Offset++] = 0xC1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = totalSize & 0x000000FF; } else { - pNDEFMessage[Offset++] = (uint8_t)emailSize; + pNDEFMessage[Offset++] = 0xD1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)totalSize; + } + memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); + Offset += SMART_POSTER_TYPE_STRING_LENGTH; + } + + /* Email header */ + pNDEFMessage[Offset] = 0x81; + if (emailSize < 256) { + pNDEFMessage[Offset] |= 0x10; // Set the SR bit + } + if (pEmailStruct->Information[0] == '\0') { + pNDEFMessage[Offset] |= 0x40; // Set the ME bit + } + Offset++; + + pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; + if (emailSize > 255) { + pNDEFMessage[Offset++] = (emailSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (emailSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (emailSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = emailSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = (uint8_t)emailSize; + } + memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); + Offset += URI_TYPE_STRING_LENGTH; + + /* Email pay load */ + pNDEFMessage[Offset++] = URI_ID_0x06; + memcpy(&pNDEFMessage[Offset], pEmailStruct->EmailAdd, strlen(pEmailStruct->EmailAdd)); + Offset += strlen(pEmailStruct->EmailAdd); + memcpy(&pNDEFMessage[Offset], URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH); + Offset += URI_FIRST_DATA_END_LENGTH; + + memcpy(&pNDEFMessage[Offset], SUBJECT_BEGIN_STRING, SUBJECT_BEGIN_STRING_LENGTH); + Offset += SUBJECT_BEGIN_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], pEmailStruct->Subject, strlen(pEmailStruct->Subject)); + Offset += strlen(pEmailStruct->Subject); + memcpy(&pNDEFMessage[Offset], URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH); + Offset += URI_SECOND_DATA_END_LENGTH; + + memcpy(&pNDEFMessage[Offset], MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH); + Offset += MESSAGE_BEGIN_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], pEmailStruct->Message, strlen(pEmailStruct->Message)); + Offset += strlen(pEmailStruct->Message); + + /* Information header */ + if (pEmailStruct->Information[0] != '\0') { + if (infoSize > 255) { + pNDEFMessage[Offset++] = 0x41; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = infoSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = 0x51; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)infoSize; } - memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); - Offset += URI_TYPE_STRING_LENGTH; - - /* Email pay load */ - pNDEFMessage[Offset++] = URI_ID_0x06; - memcpy(&pNDEFMessage[Offset], pEmailStruct->EmailAdd, strlen(pEmailStruct->EmailAdd)); - Offset += strlen(pEmailStruct->EmailAdd); - memcpy(&pNDEFMessage[Offset], URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH); - Offset += URI_FIRST_DATA_END_LENGTH; - - memcpy(&pNDEFMessage[Offset], SUBJECT_BEGIN_STRING, SUBJECT_BEGIN_STRING_LENGTH); - Offset += SUBJECT_BEGIN_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], pEmailStruct->Subject, strlen(pEmailStruct->Subject)); - Offset += strlen(pEmailStruct->Subject); - memcpy(&pNDEFMessage[Offset], URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH); - Offset += URI_SECOND_DATA_END_LENGTH; - - memcpy(&pNDEFMessage[Offset], MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH); - Offset += MESSAGE_BEGIN_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], pEmailStruct->Message, strlen(pEmailStruct->Message)); - Offset += strlen(pEmailStruct->Message); - - /* Information header */ - if (pEmailStruct->Information[0] != '\0') { - if (infoSize > 255) { - pNDEFMessage[Offset++] = 0x41; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = infoSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0x51; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)infoSize; - } - memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); - Offset += TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ - memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); - Offset += ISO_ENGLISH_CODE_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); + Offset += TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ + memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); + Offset += ISO_ENGLISH_CODE_STRING_LENGTH; - /* Information payload */ - memcpy(&pNDEFMessage[Offset], pEmailStruct->Information, strlen(pEmailStruct->Information)); - Offset += strlen(pEmailStruct->Information); + /* Information payload */ + memcpy(&pNDEFMessage[Offset], pEmailStruct->Information, strlen(pEmailStruct->Information)); + Offset += strlen(pEmailStruct->Information); - } + } - *size = (uint16_t)(Offset); + *size = (uint16_t)(Offset); } @@ -399,21 +399,21 @@ void NDEF::NDEF_PrepareEmailMessage(sEmailInfo *pEmailStruct, uint8_t *pNDEFMess void NDEF::NDEF_closeEmail(sEmailInfo *pEmailStruct) { #ifdef NDEF_DYN_ALLOC - if (pEmailStruct->EmailAdd != NULL) { - free(pEmailStruct->EmailAdd); - } - if (pEmailStruct->Information != NULL) { - free(pEmailStruct->Information); - } - if (pEmailStruct->Message != NULL) { - free(pEmailStruct->Message); - } - if (pEmailStruct->Subject != NULL) { - free(pEmailStruct->Subject); - } + if (pEmailStruct->EmailAdd != NULL) { + free(pEmailStruct->EmailAdd); + } + if (pEmailStruct->Information != NULL) { + free(pEmailStruct->Information); + } + if (pEmailStruct->Message != NULL) { + free(pEmailStruct->Message); + } + if (pEmailStruct->Subject != NULL) { + free(pEmailStruct->Subject); + } #else - // Unused parameter - (void)(pEmailStruct); + // Unused parameter + (void)(pEmailStruct); #endif } diff --git a/src/libNDEF/lib_NDEF_Email.h b/src/libNDEF/lib_NDEF_Email.h index 8da5561..5b4df66 100755 --- a/src/libNDEF/lib_NDEF_Email.h +++ b/src/libNDEF/lib_NDEF_Email.h @@ -38,17 +38,17 @@ #ifdef NDEF_DYN_ALLOC typedef struct { - char *EmailAdd; - char *Subject; - char *Message; - char *Information; + char *EmailAdd; + char *Subject; + char *Message; + char *Information; } sEmailInfo; #else typedef struct { - char EmailAdd[64]; - char Subject[100]; - char Message[2000]; - char Information[400]; + char EmailAdd[64]; + char Subject[100]; + char Message[2000]; + char Information[400]; } sEmailInfo; #endif diff --git a/src/libNDEF/lib_NDEF_Geo.cpp b/src/libNDEF/lib_NDEF_Geo.cpp index dbadc0b..022784f 100755 --- a/src/libNDEF/lib_NDEF_Geo.cpp +++ b/src/libNDEF/lib_NDEF_Geo.cpp @@ -61,43 +61,43 @@ */ void NDEF::NDEF_FillGeoStruct(uint8_t *pPayload, uint32_t PayloadSize, sGeoInfo *pGeoStruct) { - uint8_t *pLastByteAdd, *pLook4Word, *pEndString; - const char *pKeyWord = GEO_TYPE_STRING; - uint32_t SizeOfKeyWord = GEO_TYPE_STRING_LENGTH; - pEndString = 0; - - /* First character force to NULL in case not matching found */ - *pGeoStruct->Latitude = 0; - *pGeoStruct->Longitude = 0; - - /* Interesting information are stored before picture if any */ - /* Moreover picture is not used in this demonstration SW */ - pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); - - pLook4Word = pPayload; - while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { - pLook4Word++; + uint8_t *pLastByteAdd, *pLook4Word, *pEndString; + const char *pKeyWord = GEO_TYPE_STRING; + uint32_t SizeOfKeyWord = GEO_TYPE_STRING_LENGTH; + pEndString = 0; + + /* First character force to NULL in case not matching found */ + *pGeoStruct->Latitude = 0; + *pGeoStruct->Longitude = 0; + + /* Interesting information are stored before picture if any */ + /* Moreover picture is not used in this demonstration SW */ + pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); + + pLook4Word = pPayload; + while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { + pLook4Word++; + } + + /* Retrieve phone number */ + if (pLook4Word != pLastByteAdd) { + pLook4Word += SizeOfKeyWord; + pEndString = pLook4Word; + while (memcmp(pEndString, URI_LATITUDE_END, URI_LATITUDE_END_LENGTH) && (pEndString < pLastByteAdd)) { + pEndString++; } - - /* Retrieve phone number */ - if (pLook4Word != pLastByteAdd) { - pLook4Word += SizeOfKeyWord; - pEndString = pLook4Word; - while (memcmp(pEndString, URI_LATITUDE_END, URI_LATITUDE_END_LENGTH) && (pEndString < pLastByteAdd)) { - pEndString++; - } - if (pEndString != pLastByteAdd) { - memcpy(pGeoStruct->Latitude, pLook4Word, pEndString - pLook4Word); - /* add end of string character */ - pGeoStruct->Latitude[pEndString - pLook4Word] = 0; - } + if (pEndString != pLastByteAdd) { + memcpy(pGeoStruct->Latitude, pLook4Word, pEndString - pLook4Word); + /* add end of string character */ + pGeoStruct->Latitude[pEndString - pLook4Word] = 0; } - pEndString += URI_LATITUDE_END_LENGTH; - pLook4Word = pEndString; + } + pEndString += URI_LATITUDE_END_LENGTH; + pLook4Word = pEndString; - memcpy(pGeoStruct->Longitude, pEndString, PayloadSize - (pEndString - pPayload)); - /* add end of string character */ - pGeoStruct->Longitude[PayloadSize - (pEndString - pPayload)] = 0; + memcpy(pGeoStruct->Longitude, pEndString, PayloadSize - (pEndString - pPayload)); + /* add end of string character */ + pGeoStruct->Longitude[PayloadSize - (pEndString - pPayload)] = 0; } @@ -108,17 +108,17 @@ void NDEF::NDEF_FillGeoStruct(uint8_t *pPayload, uint32_t PayloadSize, sGeoInfo */ void NDEF::NDEF_ReadURI_Geo(sRecordInfo_t *pRecordStruct, sGeoInfo *pGeoStruct) { - uint8_t *pPayload; - uint32_t PayloadSize; + uint8_t *pPayload; + uint32_t PayloadSize; - PayloadSize = pRecordStruct->PayloadLength; + PayloadSize = pRecordStruct->PayloadLength; - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - if (pRecordStruct->NDEF_Type == URI_GEO_TYPE) { - NDEF_FillGeoStruct(pPayload, PayloadSize, pGeoStruct); - } + if (pRecordStruct->NDEF_Type == URI_GEO_TYPE) { + NDEF_FillGeoStruct(pPayload, PayloadSize, pGeoStruct); + } } @@ -140,37 +140,37 @@ void NDEF::NDEF_ReadURI_Geo(sRecordInfo_t *pRecordStruct, sGeoInfo *pGeoStruct) */ uint16_t NDEF::NDEF_ReadGeo(sRecordInfo_t *pRecordStruct, sGeoInfo *pGeoStruct) { - uint16_t status = NDEF_ERROR; - sRecordInfo_t *pSPRecordStruct; - uint32_t PayloadSize, RecordPosition; - uint8_t *pData; - - if (pRecordStruct->NDEF_Type == URI_GEO_TYPE) { - NDEF_ReadURI_Geo(pRecordStruct, pGeoStruct); + uint16_t status = NDEF_ERROR; + sRecordInfo_t *pSPRecordStruct; + uint32_t PayloadSize, RecordPosition; + uint8_t *pData; + + if (pRecordStruct->NDEF_Type == URI_GEO_TYPE) { + NDEF_ReadURI_Geo(pRecordStruct, pGeoStruct); + status = NDEF_OK; + } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { + for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { + pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; + if (pSPRecordStruct->NDEF_Type == URI_GEO_TYPE) { + NDEF_ReadURI_Geo(pSPRecordStruct, pGeoStruct); status = NDEF_OK; - } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { - for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { - pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; - if (pSPRecordStruct->NDEF_Type == URI_GEO_TYPE) { - NDEF_ReadURI_Geo(pSPRecordStruct, pGeoStruct); - status = NDEF_OK; - } - if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { - PayloadSize = pSPRecordStruct->PayloadLength; - - /* The instruction content the UTF-8 language code that is not used here */ - pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; - PayloadSize -= *pData + 1; /* remove not useful data */ - pData += *pData + 1; /* set pointer on useful data */ - - memcpy(pGeoStruct->Information, pData, PayloadSize); - /* add end of string character */ - pGeoStruct->Information[PayloadSize] = 0; - } - } + } + if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { + PayloadSize = pSPRecordStruct->PayloadLength; + + /* The instruction content the UTF-8 language code that is not used here */ + pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; + PayloadSize -= *pData + 1; /* remove not useful data */ + pData += *pData + 1; /* set pointer on useful data */ + + memcpy(pGeoStruct->Information, pData, PayloadSize); + /* add end of string character */ + pGeoStruct->Information[PayloadSize] = 0; + } } + } - return status; + return status; } /** @@ -184,13 +184,13 @@ uint16_t NDEF::NDEF_ReadGeo(sRecordInfo_t *pRecordStruct, sGeoInfo *pGeoStruct) */ uint16_t NDEF::NDEF_WriteGeo(sGeoInfo *pGeoStruct) { - uint16_t status = NDEF_ERROR, Offset = 0; + uint16_t status = NDEF_ERROR, Offset = 0; - NDEF_PrepareGeoMessage(pGeoStruct, NDEF_Buffer, &Offset); + NDEF_PrepareGeoMessage(pGeoStruct, NDEF_Buffer, &Offset); - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); - return status; + return status; } /** @@ -201,129 +201,129 @@ uint16_t NDEF::NDEF_WriteGeo(sGeoInfo *pGeoStruct) */ void NDEF::NDEF_PrepareGeoMessage(sGeoInfo *pGeoStruct, uint8_t *pNDEFMessage, uint16_t *size) { - uint16_t Offset = 0; - uint32_t geoSize = 0; - uint32_t infoSize = 0; - uint32_t totalSize = 0; - - /* GEO is an URI but can be included in a smart poster to add text to give instruction to user for instance */ - - /* GEO (smart poster) Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* GEO : 1+geo:+latitude+1+longitude */ - geoSize = 1 + GEO_TYPE_STRING_LENGTH + strlen(pGeoStruct->Latitude) + URI_LATITUDE_END_LENGTH + strlen(pGeoStruct->Longitude); - - /* Check if a Smart poster is needed */ - if (pGeoStruct->Information[0] != '\0') { - /* Info : 1+2+info */ - infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pGeoStruct->Information); - /* Total */ - totalSize = 4 + geoSize + 4 + infoSize; - if (geoSize > 255) { - totalSize += 3; /* Normal Geo size */ - } - if (infoSize > 255) { - totalSize += 3; /* Normal Info size */ - } - - /* SmartPoster header */ - if (totalSize > 255) { - pNDEFMessage[Offset++] = 0xC1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = totalSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0xD1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)totalSize; - } - memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); - Offset += SMART_POSTER_TYPE_STRING_LENGTH; - } - - /* GEO header */ - pNDEFMessage[Offset] = 0x81; - if (geoSize < 256) { - pNDEFMessage[Offset] |= 0x10; // Set the SR bit + uint16_t Offset = 0; + uint32_t geoSize = 0; + uint32_t infoSize = 0; + uint32_t totalSize = 0; + + /* GEO is an URI but can be included in a smart poster to add text to give instruction to user for instance */ + + /* GEO (smart poster) Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* GEO : 1+geo:+latitude+1+longitude */ + geoSize = 1 + GEO_TYPE_STRING_LENGTH + strlen(pGeoStruct->Latitude) + URI_LATITUDE_END_LENGTH + strlen(pGeoStruct->Longitude); + + /* Check if a Smart poster is needed */ + if (pGeoStruct->Information[0] != '\0') { + /* Info : 1+2+info */ + infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pGeoStruct->Information); + /* Total */ + totalSize = 4 + geoSize + 4 + infoSize; + if (geoSize > 255) { + totalSize += 3; /* Normal Geo size */ } - if (pGeoStruct->Information[0] == '\0') { - pNDEFMessage[Offset] |= 0x40; // Set the ME bit + if (infoSize > 255) { + totalSize += 3; /* Normal Info size */ } - Offset++; - pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; - if (geoSize > 255) { - pNDEFMessage[Offset++] = (geoSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (geoSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (geoSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = geoSize & 0x000000FF; + /* SmartPoster header */ + if (totalSize > 255) { + pNDEFMessage[Offset++] = 0xC1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = totalSize & 0x000000FF; } else { - pNDEFMessage[Offset++] = (uint8_t)geoSize; + pNDEFMessage[Offset++] = 0xD1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)totalSize; } - memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); - Offset += URI_TYPE_STRING_LENGTH; - - /* GEO payload */ - pNDEFMessage[Offset++] = URI_ID_0x00; /* URI identifier no abbreviation */ - memcpy(&pNDEFMessage[Offset], GEO_TYPE_STRING, GEO_TYPE_STRING_LENGTH); - Offset += GEO_TYPE_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], pGeoStruct->Latitude, strlen(pGeoStruct->Latitude)); - Offset += strlen(pGeoStruct->Latitude); - memcpy(&pNDEFMessage[Offset], URI_LATITUDE_END, URI_LATITUDE_END_LENGTH); - Offset += URI_LATITUDE_END_LENGTH; - memcpy(&pNDEFMessage[Offset], pGeoStruct->Longitude, strlen(pGeoStruct->Longitude)); - Offset += strlen(pGeoStruct->Longitude); - - /* Information header */ - if (pGeoStruct->Information[0] != '\0') { - if (infoSize > 255) { - pNDEFMessage[Offset++] = 0x41; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = infoSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0x51; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)infoSize; - } - - memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); - Offset += TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ - memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); - Offset += ISO_ENGLISH_CODE_STRING_LENGTH; - - /* Information payload */ - memcpy(&pNDEFMessage[Offset], pGeoStruct->Information, strlen(pGeoStruct->Information)); - Offset += strlen(pGeoStruct->Information); + memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); + Offset += SMART_POSTER_TYPE_STRING_LENGTH; + } + + /* GEO header */ + pNDEFMessage[Offset] = 0x81; + if (geoSize < 256) { + pNDEFMessage[Offset] |= 0x10; // Set the SR bit + } + if (pGeoStruct->Information[0] == '\0') { + pNDEFMessage[Offset] |= 0x40; // Set the ME bit + } + Offset++; + + pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; + if (geoSize > 255) { + pNDEFMessage[Offset++] = (geoSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (geoSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (geoSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = geoSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = (uint8_t)geoSize; + } + memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); + Offset += URI_TYPE_STRING_LENGTH; + + /* GEO payload */ + pNDEFMessage[Offset++] = URI_ID_0x00; /* URI identifier no abbreviation */ + memcpy(&pNDEFMessage[Offset], GEO_TYPE_STRING, GEO_TYPE_STRING_LENGTH); + Offset += GEO_TYPE_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], pGeoStruct->Latitude, strlen(pGeoStruct->Latitude)); + Offset += strlen(pGeoStruct->Latitude); + memcpy(&pNDEFMessage[Offset], URI_LATITUDE_END, URI_LATITUDE_END_LENGTH); + Offset += URI_LATITUDE_END_LENGTH; + memcpy(&pNDEFMessage[Offset], pGeoStruct->Longitude, strlen(pGeoStruct->Longitude)); + Offset += strlen(pGeoStruct->Longitude); + + /* Information header */ + if (pGeoStruct->Information[0] != '\0') { + if (infoSize > 255) { + pNDEFMessage[Offset++] = 0x41; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = infoSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = 0x51; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)infoSize; } - *size = (uint16_t)(Offset); + memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); + Offset += TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ + memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); + Offset += ISO_ENGLISH_CODE_STRING_LENGTH; + + /* Information payload */ + memcpy(&pNDEFMessage[Offset], pGeoStruct->Information, strlen(pGeoStruct->Information)); + Offset += strlen(pGeoStruct->Information); + } + + *size = (uint16_t)(Offset); } /** diff --git a/src/libNDEF/lib_NDEF_Geo.h b/src/libNDEF/lib_NDEF_Geo.h index 346ea3b..2ba6569 100755 --- a/src/libNDEF/lib_NDEF_Geo.h +++ b/src/libNDEF/lib_NDEF_Geo.h @@ -35,9 +35,9 @@ #include "lib_NDEF.h" typedef struct { - char Latitude[GEO_LATITUDE_MAX_SIZE]; - char Longitude[GEO_LONGITUDE_MAX_SIZE]; - char Information[GEO_INFO_MAX_SIZE]; + char Latitude[GEO_LATITUDE_MAX_SIZE]; + char Longitude[GEO_LONGITUDE_MAX_SIZE]; + char Information[GEO_INFO_MAX_SIZE]; } sGeoInfo; #endif /* __LIB_NDEF_GEO_H */ diff --git a/src/libNDEF/lib_NDEF_Handover.cpp b/src/libNDEF/lib_NDEF_Handover.cpp index 96e50e1..91c8354 100755 --- a/src/libNDEF/lib_NDEF_Handover.cpp +++ b/src/libNDEF/lib_NDEF_Handover.cpp @@ -147,52 +147,52 @@ */ uint16_t NDEF::NDEF_ReadAuxData(uint8_t aux_data_nb, Ndef_Handover_alternative_carrier_t *pAC, sRecordInfo_t *pRecord) { - uint16_t status; - uint8_t *pData = pAC->aux_data_ref_start; - uint8_t current_aux = 0; - uint8_t *aux_id = NULL; - uint8_t aux_id_length = 0; - - if ((pAC->aux_data_ref_start == NULL) || - (pAC->aux_data_ref_end == NULL) || - (pAC->aux_data_ref_count == 0) || - (aux_data_nb >= pAC->aux_data_ref_count)) { - return NDEF_ERROR; - } - - - while ((current_aux < aux_data_nb) && (pData < pAC->aux_data_ref_end)) { - aux_id_length = *pData++; - aux_id = pData; - pData += aux_id_length; - current_aux++; - } - - pData = pAC->aux_data_ref_end; - /* if ac has been found */ - if (current_aux == aux_data_nb) { - /* let's now look for the corresponding record - must be after the Handover record */ - do { - status = NDEF_IdentifyBuffer(pRecord, pData); - if (status != NDEF_OK) { - return status; - } - pData = pAC->ac_record.PayloadBufferAdd; - - if ((pRecord->IDLength == aux_id_length) && - !memcmp(pRecord->ID, aux_id, aux_id_length)) { - /* this is the record we were looking for, so exit */ - return NDEF_OK; - } - - // go to next record - pData = pRecord->PayloadBufferAdd + pRecord->PayloadLength; - - } while (!(pRecord->RecordFlags & MB_Mask)); - - } - // if we go there, it means that the record ID is not found + uint16_t status; + uint8_t *pData = pAC->aux_data_ref_start; + uint8_t current_aux = 0; + uint8_t *aux_id = NULL; + uint8_t aux_id_length = 0; + + if ((pAC->aux_data_ref_start == NULL) || + (pAC->aux_data_ref_end == NULL) || + (pAC->aux_data_ref_count == 0) || + (aux_data_nb >= pAC->aux_data_ref_count)) { return NDEF_ERROR; + } + + + while ((current_aux < aux_data_nb) && (pData < pAC->aux_data_ref_end)) { + aux_id_length = *pData++; + aux_id = pData; + pData += aux_id_length; + current_aux++; + } + + pData = pAC->aux_data_ref_end; + /* if ac has been found */ + if (current_aux == aux_data_nb) { + /* let's now look for the corresponding record - must be after the Handover record */ + do { + status = NDEF_IdentifyBuffer(pRecord, pData); + if (status != NDEF_OK) { + return status; + } + pData = pAC->ac_record.PayloadBufferAdd; + + if ((pRecord->IDLength == aux_id_length) && + !memcmp(pRecord->ID, aux_id, aux_id_length)) { + /* this is the record we were looking for, so exit */ + return NDEF_OK; + } + + // go to next record + pData = pRecord->PayloadBufferAdd + pRecord->PayloadLength; + + } while (!(pRecord->RecordFlags & MB_Mask)); + + } + // if we go there, it means that the record ID is not found + return NDEF_ERROR; } @@ -207,73 +207,73 @@ uint16_t NDEF::NDEF_ReadAuxData(uint8_t aux_data_nb, Ndef_Handover_alternative_c */ uint16_t NDEF::NDEF_ReadAC(uint8_t ac_nb, Ndef_Handover_t *pHandover, Ndef_Handover_alternative_carrier_t *pAC) { - uint16_t status; - uint8_t *pData = pHandover->ac_start; - uint8_t current_ac = 0; - uint8_t *ac_id; - uint8_t ac_id_length; - sRecordInfo_t NestedRecord; - uint8_t ac_found = 0; - - if ((pHandover->ac_start == NULL) || - (pHandover->ac_end == NULL) || - (pHandover->nb_alternative_carrier == 0) || - (ac_nb >= pHandover->nb_alternative_carrier)) { - return NDEF_ERROR; - } + uint16_t status; + uint8_t *pData = pHandover->ac_start; + uint8_t current_ac = 0; + uint8_t *ac_id; + uint8_t ac_id_length; + sRecordInfo_t NestedRecord; + uint8_t ac_found = 0; + + if ((pHandover->ac_start == NULL) || + (pHandover->ac_end == NULL) || + (pHandover->nb_alternative_carrier == 0) || + (ac_nb >= pHandover->nb_alternative_carrier)) { + return NDEF_ERROR; + } - // Default handover init - pAC->aux_data_ref_count = 0; - - while ((current_ac <= ac_nb) && (current_ac <= pHandover->nb_alternative_carrier) && (pData < pHandover->ac_end)) { - status = NDEF_IdentifyBuffer(&NestedRecord, pData); - if (status != NDEF_OK) { - return status; - } - // go to payload address - pData = NestedRecord.PayloadBufferAdd; - - if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR))) { - if (current_ac == ac_nb) { - // parse the AC now - pAC->cps = pData[0] & NDEF_HANDOVER_AC_CPS_MASK; - ac_id_length = pData[1]; - ac_id = &pData[2]; - pAC->aux_data_ref_count = pData[2 + ac_id_length]; - pAC->aux_data_ref_start = &pData[3 + ac_id_length]; - pAC->aux_data_ref_end = pData + NestedRecord.PayloadLength; - ac_found = 1; - } - current_ac++; - } - // go to next record - pData += NestedRecord.PayloadLength; - } - pData = pHandover->ac_end; - /* if ac has been found */ - if (ac_found) { - /* let's now look for the corresponding record - must be after the Handover record */ - do { - status = NDEF_IdentifyBuffer(&pAC->ac_record, pData); - if (status != NDEF_OK) { - return status; - } - pData = pAC->ac_record.PayloadBufferAdd; - - if ((pAC->ac_record.IDLength == ac_id_length) && - !memcmp(pAC->ac_record.ID, ac_id, ac_id_length)) { - /* this is the record we were looking for, so exit */ - return NDEF_OK; - } - - // go to next record - pData = pAC->ac_record.PayloadBufferAdd + pAC->ac_record.PayloadLength; - // TO DO: add a security condition to avoid infinite loop if NDEF file is corrupted - } while (!(pAC->ac_record.RecordFlags & ME_Mask)); + // Default handover init + pAC->aux_data_ref_count = 0; + while ((current_ac <= ac_nb) && (current_ac <= pHandover->nb_alternative_carrier) && (pData < pHandover->ac_end)) { + status = NDEF_IdentifyBuffer(&NestedRecord, pData); + if (status != NDEF_OK) { + return status; } - // if we go there, it means that the record ID is not found - return NDEF_ERROR; + // go to payload address + pData = NestedRecord.PayloadBufferAdd; + + if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR))) { + if (current_ac == ac_nb) { + // parse the AC now + pAC->cps = pData[0] & NDEF_HANDOVER_AC_CPS_MASK; + ac_id_length = pData[1]; + ac_id = &pData[2]; + pAC->aux_data_ref_count = pData[2 + ac_id_length]; + pAC->aux_data_ref_start = &pData[3 + ac_id_length]; + pAC->aux_data_ref_end = pData + NestedRecord.PayloadLength; + ac_found = 1; + } + current_ac++; + } + // go to next record + pData += NestedRecord.PayloadLength; + } + pData = pHandover->ac_end; + /* if ac has been found */ + if (ac_found) { + /* let's now look for the corresponding record - must be after the Handover record */ + do { + status = NDEF_IdentifyBuffer(&pAC->ac_record, pData); + if (status != NDEF_OK) { + return status; + } + pData = pAC->ac_record.PayloadBufferAdd; + + if ((pAC->ac_record.IDLength == ac_id_length) && + !memcmp(pAC->ac_record.ID, ac_id, ac_id_length)) { + /* this is the record we were looking for, so exit */ + return NDEF_OK; + } + + // go to next record + pData = pAC->ac_record.PayloadBufferAdd + pAC->ac_record.PayloadLength; + // TO DO: add a security condition to avoid infinite loop if NDEF file is corrupted + } while (!(pAC->ac_record.RecordFlags & ME_Mask)); + + } + // if we go there, it means that the record ID is not found + return NDEF_ERROR; } @@ -286,71 +286,71 @@ uint16_t NDEF::NDEF_ReadAC(uint8_t ac_nb, Ndef_Handover_t *pHandover, Ndef_Hando */ uint16_t NDEF::NDEF_ReadHandover(sRecordInfo_t *pRecord, Ndef_Handover_t *pHandover) { - uint16_t status; - uint8_t *pData = pRecord->PayloadBufferAdd; - uint8_t *pEnd = pData + pRecord->PayloadLength; - sRecordInfo_t NestedRecord; - - /* Default Handover Structure init */ - pHandover->version = 0; - pHandover->nb_alternative_carrier = 0; - pHandover->has_cr = 0; - pHandover->ac_start = NULL; - pHandover->ac_end = NULL; - - /* A Handover record should never be the end of the NDEF message */ - if (pRecord->RecordFlags & ME_Mask) { - return NDEF_ERROR; + uint16_t status; + uint8_t *pData = pRecord->PayloadBufferAdd; + uint8_t *pEnd = pData + pRecord->PayloadLength; + sRecordInfo_t NestedRecord; + + /* Default Handover Structure init */ + pHandover->version = 0; + pHandover->nb_alternative_carrier = 0; + pHandover->has_cr = 0; + pHandover->ac_start = NULL; + pHandover->ac_end = NULL; + + /* A Handover record should never be the end of the NDEF message */ + if (pRecord->RecordFlags & ME_Mask) { + return NDEF_ERROR; + } + + if (!memcmp(pRecord->Type, NDEF_HANDOVER_REQUEST_TYPE_STR, strlen(NDEF_HANDOVER_REQUEST_TYPE_STR))) { + pHandover->type = NDEF_HANDOVER_REQUEST_TYPE; + } else if (!memcmp(pRecord->Type, NDEF_HANDOVER_SELECT_TYPE_STR, strlen(NDEF_HANDOVER_SELECT_TYPE_STR))) { + pHandover->type = NDEF_HANDOVER_SELECT_TYPE; + } else { + /* This is not a Handover record! */ + return NDEF_ERROR; + } + + pHandover->version = *pData++; + + /* Following records are nested into Hr/s record */ + while (pData < pEnd) { + status = NDEF_IdentifyBuffer(&NestedRecord, pData); + if (status != NDEF_OK) { + return status; + } + /* save record address */ + uint8_t *pACRecord = pData; + /* go to payload address */ + pData = NestedRecord.PayloadBufferAdd; + + /* Parse Collision Resolution if Handover request */ + if (pHandover->type == NDEF_HANDOVER_REQUEST_TYPE) { + + if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_COLLISION_RESOLUTION_TYPE_STR, strlen(NDEF_HANDOVER_COLLISION_RESOLUTION_TYPE_STR))) { + pHandover->has_cr = 1; + pHandover->cr_random_number = *(uint16_t *)pData; + } } - if (!memcmp(pRecord->Type, NDEF_HANDOVER_REQUEST_TYPE_STR, strlen(NDEF_HANDOVER_REQUEST_TYPE_STR))) { - pHandover->type = NDEF_HANDOVER_REQUEST_TYPE; - } else if (!memcmp(pRecord->Type, NDEF_HANDOVER_SELECT_TYPE_STR, strlen(NDEF_HANDOVER_SELECT_TYPE_STR))) { - pHandover->type = NDEF_HANDOVER_SELECT_TYPE; + /* Parse AlternativeCarriers just to know how many they are */ + else if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR))) { + pHandover->nb_alternative_carrier++; + if (pHandover->ac_start == NULL) { + pHandover->ac_start = pACRecord; + } + pHandover->ac_end = pData + NestedRecord.PayloadLength; + /* don't parse the AC now */ } else { - /* This is not a Handover record! */ - return NDEF_ERROR; + /* this is an unexpected type, just ignore it */ } + /* go to next record */ + pData += NestedRecord.PayloadLength; - pHandover->version = *pData++; - - /* Following records are nested into Hr/s record */ - while (pData < pEnd) { - status = NDEF_IdentifyBuffer(&NestedRecord, pData); - if (status != NDEF_OK) { - return status; - } - /* save record address */ - uint8_t *pACRecord = pData; - /* go to payload address */ - pData = NestedRecord.PayloadBufferAdd; - - /* Parse Collision Resolution if Handover request */ - if (pHandover->type == NDEF_HANDOVER_REQUEST_TYPE) { - - if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_COLLISION_RESOLUTION_TYPE_STR, strlen(NDEF_HANDOVER_COLLISION_RESOLUTION_TYPE_STR))) { - pHandover->has_cr = 1; - pHandover->cr_random_number = *(uint16_t *)pData; - } - } - - /* Parse AlternativeCarriers just to know how many they are */ - else if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR))) { - pHandover->nb_alternative_carrier++; - if (pHandover->ac_start == NULL) { - pHandover->ac_start = pACRecord; - } - pHandover->ac_end = pData + NestedRecord.PayloadLength; - /* don't parse the AC now */ - } else { - /* this is an unexpected type, just ignore it */ - } - /* go to next record */ - pData += NestedRecord.PayloadLength; + } - } - - return NDEF_OK; + return NDEF_OK; } /** @@ -362,34 +362,34 @@ uint16_t NDEF::NDEF_ReadHandover(sRecordInfo_t *pRecord, Ndef_Handover_t *pHand */ uint16_t NDEF::NDEF_CreateHandover(Ndef_Handover_t *pHandover, sRecordInfo_t *pRecord) { - uint16_t status = NDEF_ERROR; - - /* Use a static buffer to prepare the Handover record */ - pRecord->PayloadBufferAdd = NDEF_Record_Buffer; - /* Alternative, where the user must first allocate the Payload buffer in the record: - * if (pRecord->PayloadBufferAdd == NULL) - * return NDEF_ERROR; - */ - - /* Handover MUST be the first record (SR mask to be updated when actually writing the record) */ - pRecord->RecordFlags = MB_Mask | ME_Mask | TNF_WellKnown; - - if (pHandover->type == NDEF_HANDOVER_SELECT_TYPE) { - pRecord->TypeLength = strlen(NDEF_HANDOVER_SELECT_TYPE_STR); - memcpy(pRecord->Type, NDEF_HANDOVER_SELECT_TYPE_STR, pRecord->TypeLength); - } else if (pHandover->type == NDEF_HANDOVER_REQUEST_TYPE) { - pRecord->TypeLength = strlen(NDEF_HANDOVER_SELECT_TYPE_STR); - memcpy(pRecord->Type, NDEF_HANDOVER_REQUEST_TYPE_STR, pRecord->TypeLength); - } else { - return NDEF_ERROR; - } + uint16_t status = NDEF_ERROR; + + /* Use a static buffer to prepare the Handover record */ + pRecord->PayloadBufferAdd = NDEF_Record_Buffer; + /* Alternative, where the user must first allocate the Payload buffer in the record: + * if (pRecord->PayloadBufferAdd == NULL) + * return NDEF_ERROR; + */ + + /* Handover MUST be the first record (SR mask to be updated when actually writing the record) */ + pRecord->RecordFlags = MB_Mask | ME_Mask | TNF_WellKnown; + + if (pHandover->type == NDEF_HANDOVER_SELECT_TYPE) { + pRecord->TypeLength = strlen(NDEF_HANDOVER_SELECT_TYPE_STR); + memcpy(pRecord->Type, NDEF_HANDOVER_SELECT_TYPE_STR, pRecord->TypeLength); + } else if (pHandover->type == NDEF_HANDOVER_REQUEST_TYPE) { + pRecord->TypeLength = strlen(NDEF_HANDOVER_SELECT_TYPE_STR); + memcpy(pRecord->Type, NDEF_HANDOVER_REQUEST_TYPE_STR, pRecord->TypeLength); + } else { + return NDEF_ERROR; + } - pRecord->PayloadLength = sizeof(pHandover->version); - *pRecord->PayloadBufferAdd = pHandover->version; + pRecord->PayloadLength = sizeof(pHandover->version); + *pRecord->PayloadBufferAdd = pHandover->version; - /* Don't write the record for now, additional Alternative Carriers to come as nested records. */ + /* Don't write the record for now, additional Alternative Carriers to come as nested records. */ - return status; + return status; } @@ -405,50 +405,50 @@ uint16_t NDEF::NDEF_CreateHandover(Ndef_Handover_t *pHandover, sRecordInfo_t *p */ uint16_t NDEF::NDEF_AddAlternativeCarrier(Ndef_Handover_alternative_carrier_t *pAC, char *CarrierDataRef, char **AuxDataRefID, sRecordInfo_t *pRecord) { - memset(NDEF_AlternativeCarrier_Buffer, 0x0, ((sizeof(uint8_t))*NDEF_AC_BUFFER_SIZE)); - - /* check that there is enough space in the buffers */ - pAC->ac_record.PayloadLength = NDEF_GetACDataLength(pAC, CarrierDataRef, AuxDataRefID); - if (((pRecord->PayloadLength + pAC->ac_record.PayloadLength) > NDEF_RECORD_MAX_SIZE) || - (pAC->ac_record.PayloadLength > NDEF_AC_BUFFER_SIZE)) { - return NDEF_ERROR_MEMORY_INTERNAL; - } - - /* Use specific buffer to prepare the nested record */ - uint8_t *pData = NDEF_AlternativeCarrier_Buffer; - pAC->ac_record.PayloadBufferAdd = pData; - /* Following line is an alternative where the user must allocate the payload buffer of the ac_record: - * uint8_t* pData = pAC->ac_record.PayloadBufferAdd ; - */ - - if ((pRecord->PayloadBufferAdd == NULL) || - (pRecord->PayloadLength == 0)) { - return NDEF_ERROR; - } - - /* AC is not the first record */ - pAC->ac_record.RecordFlags = TNF_WellKnown; - - pAC->ac_record.TypeLength = strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR); - memcpy(pAC->ac_record.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, pAC->ac_record.TypeLength); - - /* Length : cps byte + data ref length byte + auxiliary data ref count byte + data ref length */ - *pData++ = pAC->cps & NDEF_HANDOVER_AC_CPS_MASK; - *pData++ = strlen(CarrierDataRef); - memcpy(pData, CarrierDataRef, strlen(CarrierDataRef)); - pData += strlen(CarrierDataRef); - *pData++ = pAC->aux_data_ref_count; - - uint8_t AuxDataIndex; - for (AuxDataIndex = 0; AuxDataIndex < pAC->aux_data_ref_count; AuxDataIndex++) { - *pData++ = strlen(AuxDataRefID[AuxDataIndex]); - memcpy(pData, AuxDataRefID[AuxDataIndex], strlen(AuxDataRefID[AuxDataIndex])); - pData += strlen(AuxDataRefID[AuxDataIndex]); - } - - /* Append the nested record right after the Handover record - increase its length accordingly */ - pRecord->PayloadLength += NDEF_WriteRecord(&pAC->ac_record, pRecord->PayloadBufferAdd + pRecord->PayloadLength); - return NDEF_OK; + memset(NDEF_AlternativeCarrier_Buffer, 0x0, ((sizeof(uint8_t))*NDEF_AC_BUFFER_SIZE)); + + /* check that there is enough space in the buffers */ + pAC->ac_record.PayloadLength = NDEF_GetACDataLength(pAC, CarrierDataRef, AuxDataRefID); + if (((pRecord->PayloadLength + pAC->ac_record.PayloadLength) > NDEF_RECORD_MAX_SIZE) || + (pAC->ac_record.PayloadLength > NDEF_AC_BUFFER_SIZE)) { + return NDEF_ERROR_MEMORY_INTERNAL; + } + + /* Use specific buffer to prepare the nested record */ + uint8_t *pData = NDEF_AlternativeCarrier_Buffer; + pAC->ac_record.PayloadBufferAdd = pData; + /* Following line is an alternative where the user must allocate the payload buffer of the ac_record: + * uint8_t* pData = pAC->ac_record.PayloadBufferAdd ; + */ + + if ((pRecord->PayloadBufferAdd == NULL) || + (pRecord->PayloadLength == 0)) { + return NDEF_ERROR; + } + + /* AC is not the first record */ + pAC->ac_record.RecordFlags = TNF_WellKnown; + + pAC->ac_record.TypeLength = strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR); + memcpy(pAC->ac_record.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, pAC->ac_record.TypeLength); + + /* Length : cps byte + data ref length byte + auxiliary data ref count byte + data ref length */ + *pData++ = pAC->cps & NDEF_HANDOVER_AC_CPS_MASK; + *pData++ = strlen(CarrierDataRef); + memcpy(pData, CarrierDataRef, strlen(CarrierDataRef)); + pData += strlen(CarrierDataRef); + *pData++ = pAC->aux_data_ref_count; + + uint8_t AuxDataIndex; + for (AuxDataIndex = 0; AuxDataIndex < pAC->aux_data_ref_count; AuxDataIndex++) { + *pData++ = strlen(AuxDataRefID[AuxDataIndex]); + memcpy(pData, AuxDataRefID[AuxDataIndex], strlen(AuxDataRefID[AuxDataIndex])); + pData += strlen(AuxDataRefID[AuxDataIndex]); + } + + /* Append the nested record right after the Handover record - increase its length accordingly */ + pRecord->PayloadLength += NDEF_WriteRecord(&pAC->ac_record, pRecord->PayloadBufferAdd + pRecord->PayloadLength); + return NDEF_OK; } @@ -461,21 +461,21 @@ uint16_t NDEF::NDEF_AddAlternativeCarrier(Ndef_Handover_alternative_carrier_t *p */ uint32_t NDEF::NDEF_GetACDataLength(Ndef_Handover_alternative_carrier_t *pAC, char *CarrierDataRef, char **AuxDataRefID) { - uint8_t AuxDataIndex; - - /* First compute the Data length */ - uint32_t length = 1 + // cps - 1 + // Carrier data ref length - strlen(CarrierDataRef) + // Carrier data ref - 1 + // auxiliary data count - pAC->aux_data_ref_count * 1; // auxiliary data lengths - - /* Then adds the length of the Auxiliary Data */ - for (AuxDataIndex = 0; AuxDataIndex < pAC->aux_data_ref_count; AuxDataIndex++) { - length += strlen(AuxDataRefID[AuxDataIndex]); - } + uint8_t AuxDataIndex; + + /* First compute the Data length */ + uint32_t length = 1 + // cps + 1 + // Carrier data ref length + strlen(CarrierDataRef) + // Carrier data ref + 1 + // auxiliary data count + pAC->aux_data_ref_count * 1; // auxiliary data lengths + + /* Then adds the length of the Auxiliary Data */ + for (AuxDataIndex = 0; AuxDataIndex < pAC->aux_data_ref_count; AuxDataIndex++) { + length += strlen(AuxDataRefID[AuxDataIndex]); + } - return length; + return length; } /** @@ -490,10 +490,10 @@ uint32_t NDEF::NDEF_GetACDataLength(Ndef_Handover_alternative_carrier_t *pAC, ch */ uint16_t NDEF::NDEF_WriteHandover(sRecordInfo_t *pRecord, uint8_t *pNdef) { - /* Note: in case of Handover Select for no matching alternative carrier, the ME bit flag must be set by the caller */ + /* Note: in case of Handover Select for no matching alternative carrier, the ME bit flag must be set by the caller */ - uint32_t Size = NDEF_WriteRecord(pRecord, pNdef); - return NDEF_WriteNDEF(Size, pNdef); + uint32_t Size = NDEF_WriteRecord(pRecord, pNdef); + return NDEF_WriteNDEF(Size, pNdef); } /** diff --git a/src/libNDEF/lib_NDEF_Handover.h b/src/libNDEF/lib_NDEF_Handover.h index 6d5b3b6..6b7fcfb 100755 --- a/src/libNDEF/lib_NDEF_Handover.h +++ b/src/libNDEF/lib_NDEF_Handover.h @@ -64,33 +64,33 @@ #define NDEF_HANDOVER_AC_CPS_MASK (0x3) /** @brief Enumerates the NFC Forum Power States possible values */ typedef enum { - NDEF_HANDOVER_AC_CPS_INACTIVE = 0x0, /**< The HW for this Alternative Carrier has to be switch on before proceeding. */ - NDEF_HANDOVER_AC_CPS_ACTIVE = 0x1, /**< The HW for this Alternative Carrier is currently running. */ - NDEF_HANDOVER_AC_CPS_ACTIVATING = 0x2, /**< The HW for this Alternative Carrier is being activated. */ - NDEF_HANDOVER_AC_CPS_UNKNOWN = 0x3 /**< The HW for this Alternative Carrier is unknown. */ + NDEF_HANDOVER_AC_CPS_INACTIVE = 0x0, /**< The HW for this Alternative Carrier has to be switch on before proceeding. */ + NDEF_HANDOVER_AC_CPS_ACTIVE = 0x1, /**< The HW for this Alternative Carrier is currently running. */ + NDEF_HANDOVER_AC_CPS_ACTIVATING = 0x2, /**< The HW for this Alternative Carrier is being activated. */ + NDEF_HANDOVER_AC_CPS_UNKNOWN = 0x3 /**< The HW for this Alternative Carrier is unknown. */ } Ndef_Handover_ac_cps_t; typedef struct { - uint8_t cps; /**< Current Power State for this Alternative Carrier Hardware. */ - sRecordInfo_t ac_record; /**< The record structure used to store/build the Alternative Carrier record. */ - uint8_t aux_data_ref_count; /**< The number of Auxiliary Data Reference for this Alternative Carrier. */ - /* following fields are only used when reading NDEF */ - uint8_t *aux_data_ref_start; /**< Internal field, managed by the library, to keep track of the Auxiliary Data Reference start address in the AC record. */ - uint8_t *aux_data_ref_end; /**< Internal field, managed by the library, to keep track of the Auxiliary Data Reference end address in the AC record. */ + uint8_t cps; /**< Current Power State for this Alternative Carrier Hardware. */ + sRecordInfo_t ac_record; /**< The record structure used to store/build the Alternative Carrier record. */ + uint8_t aux_data_ref_count; /**< The number of Auxiliary Data Reference for this Alternative Carrier. */ + /* following fields are only used when reading NDEF */ + uint8_t *aux_data_ref_start; /**< Internal field, managed by the library, to keep track of the Auxiliary Data Reference start address in the AC record. */ + uint8_t *aux_data_ref_end; /**< Internal field, managed by the library, to keep track of the Auxiliary Data Reference end address in the AC record. */ } Ndef_Handover_alternative_carrier_t; typedef struct { - uint16_t type; /**< Handover type: could be Select or Request. */ - uint8_t version; /**< Version of the Handover record. */ - /* following fields are only used when reading NDEF */ - uint8_t has_cr; /**< Boolean, if true this Handover has a Collision Resolution nested record. */ - uint16_t cr_random_number; /**< Random number for the Collision Resolution. */ - uint8_t nb_alternative_carrier; /**< Number of Alternative Carrier nested records un this Handover. */ - uint8_t *ac_start; /**< Internal field, managed by the library, to keep track of the Alternative Carrier Reference Data start address in the Handover record. */ - uint8_t *ac_end; /**< Internal field, managed by the library, to keep track of the Alternative Carrier Reference Data end address in the Handover record. */ + uint16_t type; /**< Handover type: could be Select or Request. */ + uint8_t version; /**< Version of the Handover record. */ + /* following fields are only used when reading NDEF */ + uint8_t has_cr; /**< Boolean, if true this Handover has a Collision Resolution nested record. */ + uint16_t cr_random_number; /**< Random number for the Collision Resolution. */ + uint8_t nb_alternative_carrier; /**< Number of Alternative Carrier nested records un this Handover. */ + uint8_t *ac_start; /**< Internal field, managed by the library, to keep track of the Alternative Carrier Reference Data start address in the Handover record. */ + uint8_t *ac_end; /**< Internal field, managed by the library, to keep track of the Alternative Carrier Reference Data end address in the Handover record. */ } Ndef_Handover_t; /** @} diff --git a/src/libNDEF/lib_NDEF_MyApp.cpp b/src/libNDEF/lib_NDEF_MyApp.cpp index ff61bc8..973a812 100755 --- a/src/libNDEF/lib_NDEF_MyApp.cpp +++ b/src/libNDEF/lib_NDEF_MyApp.cpp @@ -62,53 +62,53 @@ */ void NDEF::NDEF_Extract_M24SRDiscoveryApp_Input(sRecordInfo_t *pRecordStruct, sMyAppInfo *pMyAppStruct) { - uint8_t *pPayload; - uint8_t *pLook4Word; - uint16_t BackGroundColor, FontColor; - uint8_t i; - - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - - /* initialize struct in case not matching found */ - for (i = 0; i < 8; i++) { - /* Set the Back Color */ - pMyAppStruct->LineX[i].BackGroundColor = 0xFFFF; - /* Set the Text Color */ - pMyAppStruct->LineX[i].FontColor = 0x0000; - /* Set the line number */ - pMyAppStruct->LineX[i].LineNb = i + 1; - /* Set the line content */ - memcpy(pMyAppStruct->LineX[i].String, " ", 20); - } - - pLook4Word = pPayload; - - for (i = 0; i < 4; i++) { - pMyAppStruct->LedBlinkConf.LedConf[i] = *pLook4Word; - pLook4Word++; - } - pMyAppStruct->LedBlinkConf.Speed = *pLook4Word; + uint8_t *pPayload; + uint8_t *pLook4Word; + uint16_t BackGroundColor, FontColor; + uint8_t i; + + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + + /* initialize struct in case not matching found */ + for (i = 0; i < 8; i++) { + /* Set the Back Color */ + pMyAppStruct->LineX[i].BackGroundColor = 0xFFFF; + /* Set the Text Color */ + pMyAppStruct->LineX[i].FontColor = 0x0000; + /* Set the line number */ + pMyAppStruct->LineX[i].LineNb = i + 1; + /* Set the line content */ + memcpy(pMyAppStruct->LineX[i].String, " ", 20); + } + + pLook4Word = pPayload; + + for (i = 0; i < 4; i++) { + pMyAppStruct->LedBlinkConf.LedConf[i] = *pLook4Word; pLook4Word++; + } + pMyAppStruct->LedBlinkConf.Speed = *pLook4Word; + pLook4Word++; - for (i = 0; i < 8; i++) { - /* Set the line number */ - pMyAppStruct->LineX[i].LineNb = *pLook4Word; - pLook4Word++; - /* Set the Back Color */ - BackGroundColor = (uint16_t)(*pLook4Word << 8); - BackGroundColor = BackGroundColor | (uint16_t)(*++pLook4Word); - pMyAppStruct->LineX[i].BackGroundColor = BackGroundColor; - pLook4Word++; - /* Set the Text Color */ - FontColor = (uint16_t)(*pLook4Word << 8); - FontColor = FontColor | (uint16_t)(*++pLook4Word); - pMyAppStruct->LineX[i].FontColor = FontColor; - pLook4Word++; - /* Set the line content */ - memcpy(pMyAppStruct->LineX[i].String, (char *)pLook4Word, 20); - pLook4Word += 20; - } + for (i = 0; i < 8; i++) { + /* Set the line number */ + pMyAppStruct->LineX[i].LineNb = *pLook4Word; + pLook4Word++; + /* Set the Back Color */ + BackGroundColor = (uint16_t)(*pLook4Word << 8); + BackGroundColor = BackGroundColor | (uint16_t)(*++pLook4Word); + pMyAppStruct->LineX[i].BackGroundColor = BackGroundColor; + pLook4Word++; + /* Set the Text Color */ + FontColor = (uint16_t)(*pLook4Word << 8); + FontColor = FontColor | (uint16_t)(*++pLook4Word); + pMyAppStruct->LineX[i].FontColor = FontColor; + pLook4Word++; + /* Set the line content */ + memcpy(pMyAppStruct->LineX[i].String, (char *)pLook4Word, 20); + pLook4Word += 20; + } } @@ -130,16 +130,16 @@ void NDEF::NDEF_Extract_M24SRDiscoveryApp_Input(sRecordInfo_t *pRecordStruct, sM */ uint16_t NDEF::NDEF_ReadMyApp(sRecordInfo_t *pRecordStruct, sMyAppInfo *pMyAppStruct) { - uint16_t status = NDEF_ERROR; + uint16_t status = NDEF_ERROR; - if (pRecordStruct->NDEF_Type == M24SR_DISCOVERY_APP_TYPE) { - NDEF_Extract_M24SRDiscoveryApp_Input(pRecordStruct, pMyAppStruct); - status = NDEF_OK; - } else { - status = NDEF_ERROR; - } + if (pRecordStruct->NDEF_Type == M24SR_DISCOVERY_APP_TYPE) { + NDEF_Extract_M24SRDiscoveryApp_Input(pRecordStruct, pMyAppStruct); + status = NDEF_OK; + } else { + status = NDEF_ERROR; + } - return status; + return status; } /** @@ -155,105 +155,105 @@ uint16_t NDEF::NDEF_ReadMyApp(sRecordInfo_t *pRecordStruct, sMyAppInfo *pMyAppSt */ uint16_t NDEF::NDEF_WriteMyApp(sMyAppInfo *pMyAppStruct) { - uint16_t status = NDEF_ERROR; - uint16_t DataSize; - uint32_t PayloadSize; - uint8_t i; - uint8_t *pPayload; - - // Unused parameter - (void)(pMyAppStruct); - - /* External Type Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- IL=0, CF=0 and SR=1 TNF=4 NFC Forum external type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ /* The payload will always be 5 + 25*8=205 bytes for this application */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ /* st.com:m24sr_discovery_democtrl */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - - /* fill URI record header */ - NDEF_Buffer[0] = 0xD4; /* Record Flag */ - NDEF_Buffer[1] = M24SR_DISCOVERY_APP_STRING_LENGTH; - NDEF_Buffer[2] = 0x00; /* Will be filled at the end when payload size is known */ - - memcpy(&NDEF_Buffer[3], M24SR_DISCOVERY_APP_STRING, M24SR_DISCOVERY_APP_STRING_LENGTH); - - pPayload = &NDEF_Buffer[ 3 + M24SR_DISCOVERY_APP_STRING_LENGTH]; - PayloadSize = 0; - - /**************************************************************/ - /* BLINK CONFIG data */ - - /* led 1 blinking */ - *pPayload = 0x03; + uint16_t status = NDEF_ERROR; + uint16_t DataSize; + uint32_t PayloadSize; + uint8_t i; + uint8_t *pPayload; + + // Unused parameter + (void)(pMyAppStruct); + + /* External Type Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- IL=0, CF=0 and SR=1 TNF=4 NFC Forum external type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ /* The payload will always be 5 + 25*8=205 bytes for this application */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ /* st.com:m24sr_discovery_democtrl */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + + /* fill URI record header */ + NDEF_Buffer[0] = 0xD4; /* Record Flag */ + NDEF_Buffer[1] = M24SR_DISCOVERY_APP_STRING_LENGTH; + NDEF_Buffer[2] = 0x00; /* Will be filled at the end when payload size is known */ + + memcpy(&NDEF_Buffer[3], M24SR_DISCOVERY_APP_STRING, M24SR_DISCOVERY_APP_STRING_LENGTH); + + pPayload = &NDEF_Buffer[ 3 + M24SR_DISCOVERY_APP_STRING_LENGTH]; + PayloadSize = 0; + + /**************************************************************/ + /* BLINK CONFIG data */ + + /* led 1 blinking */ + *pPayload = 0x03; + pPayload++; + /* led 2 blinking */ + *pPayload = 0x02; + pPayload++; + /* led 3 blinking */ + *pPayload = 0x02; + pPayload++; + /* led 4 blinking */ + *pPayload = 0x03; + pPayload++; + /* speed */ + *pPayload = 0x03; + pPayload++; + + PayloadSize += 5; + + /**************************************************************/ + + /**************************************************************/ + /* SCREEN config data */ + for (i = 0; i < 8; i++) { + /* Line number */ + *pPayload = (uint8_t)(i + 1); pPayload++; - /* led 2 blinking */ - *pPayload = 0x02; + /* Background color */ + *pPayload = 0xFF - (0xFF / i); pPayload++; - /* led 3 blinking */ - *pPayload = 0x02; + *pPayload = 0xFF - (0xFF / i); pPayload++; - /* led 4 blinking */ - *pPayload = 0x03; + /* Font Color */ + *pPayload = 0xFF / i; pPayload++; - /* speed */ - *pPayload = 0x03; + *pPayload = 0xFF / i; pPayload++; + /* String */ + memcpy(pPayload, "ABCDEFGHIJKLMNOPQRST", 20); + pPayload += 20; - PayloadSize += 5; - - /**************************************************************/ - - /**************************************************************/ - /* SCREEN config data */ - for (i = 0; i < 8; i++) { - /* Line number */ - *pPayload = (uint8_t)(i + 1); - pPayload++; - /* Background color */ - *pPayload = 0xFF - (0xFF / i); - pPayload++; - *pPayload = 0xFF - (0xFF / i); - pPayload++; - /* Font Color */ - *pPayload = 0xFF / i; - pPayload++; - *pPayload = 0xFF / i; - pPayload++; - /* String */ - memcpy(pPayload, "ABCDEFGHIJKLMNOPQRST", 20); - pPayload += 20; - - PayloadSize += 25; + PayloadSize += 25; - } + } - NDEF_Buffer[2] = PayloadSize & 0x000000FF; + NDEF_Buffer[2] = PayloadSize & 0x000000FF; - DataSize = PayloadSize + 5 + M24SR_DISCOVERY_APP_STRING_LENGTH; + DataSize = PayloadSize + 5 + M24SR_DISCOVERY_APP_STRING_LENGTH; - /* Write NDEF */ - status = NfcTag_WriteNDEF(DataSize, NDEF_Buffer); + /* Write NDEF */ + status = NfcTag_WriteNDEF(DataSize, NDEF_Buffer); - return status; + return status; } diff --git a/src/libNDEF/lib_NDEF_MyApp.h b/src/libNDEF/lib_NDEF_MyApp.h index adc1709..c280c49 100755 --- a/src/libNDEF/lib_NDEF_MyApp.h +++ b/src/libNDEF/lib_NDEF_MyApp.h @@ -54,20 +54,20 @@ #define MYAPP_LED_CONF_BLINKING ((uint8_t) 0x2) typedef struct { - uint8_t LedConf[4]; - uint8_t Speed; + uint8_t LedConf[4]; + uint8_t Speed; } sLedBlinkConfig; typedef struct { - uint8_t LineNb; - uint16_t BackGroundColor; - uint16_t FontColor; - char String[20]; + uint8_t LineNb; + uint16_t BackGroundColor; + uint16_t FontColor; + char String[20]; } sLineConfig; typedef struct { - sLedBlinkConfig LedBlinkConf; - sLineConfig LineX[MYAPP_NB_LINES]; + sLedBlinkConfig LedBlinkConf; + sLineConfig LineX[MYAPP_NB_LINES]; } sMyAppInfo; #endif /* __LIB_NDEF_MYAPP_H */ diff --git a/src/libNDEF/lib_NDEF_SMS.cpp b/src/libNDEF/lib_NDEF_SMS.cpp index ff22c50..eac14bc 100755 --- a/src/libNDEF/lib_NDEF_SMS.cpp +++ b/src/libNDEF/lib_NDEF_SMS.cpp @@ -63,48 +63,48 @@ */ void NDEF::NDEF_FillSMSStruct(uint8_t *pPayload, uint32_t PayloadSize, sSMSInfo *pSMSStruct) { - uint8_t *pLastByteAdd, *pLook4Word, *pEndString; - const char *pKeyWord = SMS_TYPE_STRING; - uint32_t SizeOfKeyWord = SMS_TYPE_STRING_LENGTH; - pEndString = 0; - - /* First character force to NULL in case not matching found */ - *pSMSStruct->PhoneNumber = 0; - *pSMSStruct->Message = 0; - - /* Interesting information are stored before picture if any */ - /* Moreover picture is not used in this demonstration SW */ - pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); - - pLook4Word = pPayload; - while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { - pLook4Word++; + uint8_t *pLastByteAdd, *pLook4Word, *pEndString; + const char *pKeyWord = SMS_TYPE_STRING; + uint32_t SizeOfKeyWord = SMS_TYPE_STRING_LENGTH; + pEndString = 0; + + /* First character force to NULL in case not matching found */ + *pSMSStruct->PhoneNumber = 0; + *pSMSStruct->Message = 0; + + /* Interesting information are stored before picture if any */ + /* Moreover picture is not used in this demonstration SW */ + pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); + + pLook4Word = pPayload; + while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { + pLook4Word++; + } + + /* Retrieve phone number */ + if (pLook4Word != pLastByteAdd) { + pLook4Word += SizeOfKeyWord; + pEndString = pLook4Word; + while (memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { + pEndString++; } - - /* Retrieve phone number */ - if (pLook4Word != pLastByteAdd) { - pLook4Word += SizeOfKeyWord; - pEndString = pLook4Word; - while (memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { - pEndString++; - } - if (pEndString != pLastByteAdd) { - memcpy(pSMSStruct->PhoneNumber, pLook4Word, pEndString - pLook4Word); - /* add end of string character */ - pSMSStruct->PhoneNumber[pEndString - pLook4Word] = 0; - } - } - pEndString += URI_FIRST_DATA_END_LENGTH; - pLook4Word = pEndString; - - /* check if e-mail subject is present */ - if (!memcmp(pLook4Word, MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH)) { - pEndString += MESSAGE_BEGIN_STRING_LENGTH; - /* Retrieve message */ - memcpy(pSMSStruct->Message, pEndString, PayloadSize - (pEndString - pPayload)); - /* add end of string character */ - pSMSStruct->Message[PayloadSize - (pEndString - pPayload)] = 0; + if (pEndString != pLastByteAdd) { + memcpy(pSMSStruct->PhoneNumber, pLook4Word, pEndString - pLook4Word); + /* add end of string character */ + pSMSStruct->PhoneNumber[pEndString - pLook4Word] = 0; } + } + pEndString += URI_FIRST_DATA_END_LENGTH; + pLook4Word = pEndString; + + /* check if e-mail subject is present */ + if (!memcmp(pLook4Word, MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH)) { + pEndString += MESSAGE_BEGIN_STRING_LENGTH; + /* Retrieve message */ + memcpy(pSMSStruct->Message, pEndString, PayloadSize - (pEndString - pPayload)); + /* add end of string character */ + pSMSStruct->Message[PayloadSize - (pEndString - pPayload)] = 0; + } } /** @@ -114,17 +114,17 @@ void NDEF::NDEF_FillSMSStruct(uint8_t *pPayload, uint32_t PayloadSize, sSMSInfo */ void NDEF::NDEF_ReadURI_SMS(sRecordInfo_t *pRecordStruct, sSMSInfo *pSMSStruct) { - uint8_t *pPayload; - uint32_t PayloadSize; + uint8_t *pPayload; + uint32_t PayloadSize; - PayloadSize = pRecordStruct->PayloadLength; + PayloadSize = pRecordStruct->PayloadLength; - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - if (pRecordStruct->NDEF_Type == URI_SMS_TYPE) { - NDEF_FillSMSStruct(pPayload, PayloadSize, pSMSStruct); - } + if (pRecordStruct->NDEF_Type == URI_SMS_TYPE) { + NDEF_FillSMSStruct(pPayload, PayloadSize, pSMSStruct); + } } @@ -146,37 +146,37 @@ void NDEF::NDEF_ReadURI_SMS(sRecordInfo_t *pRecordStruct, sSMSInfo *pSMSStruct) */ uint16_t NDEF::NDEF_ReadSMS(sRecordInfo_t *pRecordStruct, sSMSInfo *pSMSStruct) { - uint16_t status = NDEF_ERROR; - sRecordInfo_t *pSPRecordStruct; - uint32_t PayloadSize, RecordPosition; - uint8_t *pData; - - if (pRecordStruct->NDEF_Type == URI_SMS_TYPE) { - NDEF_ReadURI_SMS(pRecordStruct, pSMSStruct); + uint16_t status = NDEF_ERROR; + sRecordInfo_t *pSPRecordStruct; + uint32_t PayloadSize, RecordPosition; + uint8_t *pData; + + if (pRecordStruct->NDEF_Type == URI_SMS_TYPE) { + NDEF_ReadURI_SMS(pRecordStruct, pSMSStruct); + status = NDEF_OK; + } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { + for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { + pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; + if (pSPRecordStruct->NDEF_Type == URI_SMS_TYPE) { + NDEF_ReadURI_SMS(pSPRecordStruct, pSMSStruct); status = NDEF_OK; - } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { - for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { - pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; - if (pSPRecordStruct->NDEF_Type == URI_SMS_TYPE) { - NDEF_ReadURI_SMS(pSPRecordStruct, pSMSStruct); - status = NDEF_OK; - } - if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { - PayloadSize = pSPRecordStruct->PayloadLength; - - /* The instruction content the UTF-8 language code that is not used here */ - pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; - PayloadSize -= *pData + 1; /* remove not useful data */ - pData += *pData + 1; /* set pointer on useful data */ - - memcpy(pSMSStruct->Information, pData, PayloadSize); - /* add end of string character */ - pSMSStruct->Information[PayloadSize] = 0; - } - } + } + if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { + PayloadSize = pSPRecordStruct->PayloadLength; + + /* The instruction content the UTF-8 language code that is not used here */ + pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; + PayloadSize -= *pData + 1; /* remove not useful data */ + pData += *pData + 1; /* set pointer on useful data */ + + memcpy(pSMSStruct->Information, pData, PayloadSize); + /* add end of string character */ + pSMSStruct->Information[PayloadSize] = 0; + } } + } - return status; + return status; } /** @@ -191,13 +191,13 @@ uint16_t NDEF::NDEF_ReadSMS(sRecordInfo_t *pRecordStruct, sSMSInfo *pSMSStruct) */ uint16_t NDEF::NDEF_WriteSMS(sSMSInfo *pSMSStruct) { - uint16_t status = NDEF_ERROR, Offset = 0; + uint16_t status = NDEF_ERROR, Offset = 0; - NDEF_PrepareSMSMessage(pSMSStruct, NDEF_Buffer, &Offset); + NDEF_PrepareSMSMessage(pSMSStruct, NDEF_Buffer, &Offset); - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); - return status; + return status; } /** @@ -208,133 +208,133 @@ uint16_t NDEF::NDEF_WriteSMS(sSMSInfo *pSMSStruct) */ void NDEF::NDEF_PrepareSMSMessage(sSMSInfo *pSMSStruct, uint8_t *pNDEFMessage, uint16_t *size) { - uint16_t Offset = 0; - uint32_t smsSize = 0; - uint32_t infoSize = 0; - uint32_t totalSize = 0; - - /* SMS is an URI but can be included in a smart poster to add text to give instruction to user for instance */ - - /* SMS (smart poster) Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* SMS : 1+sms:+tel+1+body=+message */ - smsSize = 1 + SMS_TYPE_STRING_LENGTH + strlen(pSMSStruct->PhoneNumber) + URI_FIRST_DATA_END_LENGTH + - MESSAGE_BEGIN_STRING_LENGTH + strlen(pSMSStruct->Message); - - /* Check if a Smart poster is needed */ - if (pSMSStruct->Information[0] != '\0') { - /* Info : 1+2+info */ - infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pSMSStruct->Information); - /* Total */ - totalSize = 4 + smsSize + 4 + infoSize; - if (smsSize > 255) { - totalSize += 3; /* Normal Email size */ - } - if (infoSize > 255) { - totalSize += 3; /* Normal Info size */ - } - - /* SmartPoster header */ - if (totalSize > 255) { - pNDEFMessage[Offset++] = 0xC1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = totalSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0xD1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)totalSize; - } - memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); - Offset += SMART_POSTER_TYPE_STRING_LENGTH; - } - - /* SMS header */ - pNDEFMessage[Offset] = 0x81; - if (smsSize < 256) { - pNDEFMessage[Offset] |= 0x10; // Set the SR bit + uint16_t Offset = 0; + uint32_t smsSize = 0; + uint32_t infoSize = 0; + uint32_t totalSize = 0; + + /* SMS is an URI but can be included in a smart poster to add text to give instruction to user for instance */ + + /* SMS (smart poster) Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* SMS : 1+sms:+tel+1+body=+message */ + smsSize = 1 + SMS_TYPE_STRING_LENGTH + strlen(pSMSStruct->PhoneNumber) + URI_FIRST_DATA_END_LENGTH + + MESSAGE_BEGIN_STRING_LENGTH + strlen(pSMSStruct->Message); + + /* Check if a Smart poster is needed */ + if (pSMSStruct->Information[0] != '\0') { + /* Info : 1+2+info */ + infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pSMSStruct->Information); + /* Total */ + totalSize = 4 + smsSize + 4 + infoSize; + if (smsSize > 255) { + totalSize += 3; /* Normal Email size */ } - if (pSMSStruct->Information[0] == '\0') { - pNDEFMessage[Offset] |= 0x40; // Set the ME bit + if (infoSize > 255) { + totalSize += 3; /* Normal Info size */ } - Offset++; - pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; - if (smsSize > 255) { - pNDEFMessage[Offset++] = (smsSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (smsSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (smsSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = smsSize & 0x000000FF; + /* SmartPoster header */ + if (totalSize > 255) { + pNDEFMessage[Offset++] = 0xC1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = totalSize & 0x000000FF; } else { - pNDEFMessage[Offset++] = (uint8_t)smsSize; + pNDEFMessage[Offset++] = 0xD1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)totalSize; } - memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); - Offset += URI_TYPE_STRING_LENGTH; - - /* SMS payload */ - pNDEFMessage[Offset++] = URI_ID_0x00; - memcpy(&pNDEFMessage[Offset], SMS_TYPE_STRING, SMS_TYPE_STRING_LENGTH); - Offset += SMS_TYPE_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], pSMSStruct->PhoneNumber, strlen(pSMSStruct->PhoneNumber)); - Offset += strlen(pSMSStruct->PhoneNumber); - memcpy(&pNDEFMessage[Offset], URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH); - Offset += URI_FIRST_DATA_END_LENGTH; - - memcpy(&pNDEFMessage[Offset], MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH); - Offset += MESSAGE_BEGIN_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], pSMSStruct->Message, strlen(pSMSStruct->Message)); - Offset += strlen(pSMSStruct->Message); - - /* Information header */ - if (pSMSStruct->Information[0] != '\0') { - if (infoSize > 255) { - pNDEFMessage[Offset++] = 0x41; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = infoSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0x51; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)infoSize; - } - - memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); - Offset += TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ - memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); - Offset += ISO_ENGLISH_CODE_STRING_LENGTH; - - /* Information payload */ - memcpy(&pNDEFMessage[Offset], pSMSStruct->Information, strlen(pSMSStruct->Information)); - Offset += strlen(pSMSStruct->Information); + memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); + Offset += SMART_POSTER_TYPE_STRING_LENGTH; + } + + /* SMS header */ + pNDEFMessage[Offset] = 0x81; + if (smsSize < 256) { + pNDEFMessage[Offset] |= 0x10; // Set the SR bit + } + if (pSMSStruct->Information[0] == '\0') { + pNDEFMessage[Offset] |= 0x40; // Set the ME bit + } + Offset++; + + pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; + if (smsSize > 255) { + pNDEFMessage[Offset++] = (smsSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (smsSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (smsSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = smsSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = (uint8_t)smsSize; + } + memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); + Offset += URI_TYPE_STRING_LENGTH; + + /* SMS payload */ + pNDEFMessage[Offset++] = URI_ID_0x00; + memcpy(&pNDEFMessage[Offset], SMS_TYPE_STRING, SMS_TYPE_STRING_LENGTH); + Offset += SMS_TYPE_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], pSMSStruct->PhoneNumber, strlen(pSMSStruct->PhoneNumber)); + Offset += strlen(pSMSStruct->PhoneNumber); + memcpy(&pNDEFMessage[Offset], URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH); + Offset += URI_FIRST_DATA_END_LENGTH; + + memcpy(&pNDEFMessage[Offset], MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH); + Offset += MESSAGE_BEGIN_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], pSMSStruct->Message, strlen(pSMSStruct->Message)); + Offset += strlen(pSMSStruct->Message); + + /* Information header */ + if (pSMSStruct->Information[0] != '\0') { + if (infoSize > 255) { + pNDEFMessage[Offset++] = 0x41; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = infoSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = 0x51; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)infoSize; } - *size = (uint16_t)(Offset); + memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); + Offset += TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ + memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); + Offset += ISO_ENGLISH_CODE_STRING_LENGTH; + + /* Information payload */ + memcpy(&pNDEFMessage[Offset], pSMSStruct->Information, strlen(pSMSStruct->Information)); + Offset += strlen(pSMSStruct->Information); + } + + *size = (uint16_t)(Offset); } diff --git a/src/libNDEF/lib_NDEF_SMS.h b/src/libNDEF/lib_NDEF_SMS.h index 64f2548..2b86ef7 100755 --- a/src/libNDEF/lib_NDEF_SMS.h +++ b/src/libNDEF/lib_NDEF_SMS.h @@ -36,9 +36,9 @@ typedef struct { - char PhoneNumber[SMS_PHONE_MAX_SIZE]; - char Message[SMS_MESSAGE_MAX_SIZE]; - char Information[SMS_INFO_MAX_SIZE]; + char PhoneNumber[SMS_PHONE_MAX_SIZE]; + char Message[SMS_MESSAGE_MAX_SIZE]; + char Information[SMS_INFO_MAX_SIZE]; } sSMSInfo; #endif /* __LIB_NDEF_SMS_H */ diff --git a/src/libNDEF/lib_NDEF_Text.cpp b/src/libNDEF/lib_NDEF_Text.cpp index 3e640d8..4993706 100755 --- a/src/libNDEF/lib_NDEF_Text.cpp +++ b/src/libNDEF/lib_NDEF_Text.cpp @@ -70,45 +70,47 @@ */ uint16_t NDEF::NDEF_WriteText(NDEF_Text_info_t *text_info) { - uint16_t status = NDEF_ERROR; - uint32_t textSize, Offset = 0; - - if(strlen(text_info->language_code) > 10) return status; - - /* TEXT : 1+en+message */ - textSize = 1 + strlen(text_info->language_code) + strlen(text_info->text); - - /* TEXT header */ - NDEF_Buffer[Offset] = 0xC1; - if (textSize < 256) { - NDEF_Buffer[Offset] |= 0x10; // Set the SR bit - } - Offset++; - - NDEF_Buffer[Offset++] = TEXT_TYPE_STRING_LENGTH; - if (textSize > 255) { - NDEF_Buffer[Offset++] = (textSize & 0xFF000000) >> 24; - NDEF_Buffer[Offset++] = (textSize & 0x00FF0000) >> 16; - NDEF_Buffer[Offset++] = (textSize & 0x0000FF00) >> 8; - NDEF_Buffer[Offset++] = textSize & 0x000000FF; - } else { - NDEF_Buffer[Offset++] = (uint8_t)textSize; - } - memcpy(&NDEF_Buffer[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); - Offset += TEXT_TYPE_STRING_LENGTH; - - /* TEXT payload */ - NDEF_Buffer[Offset++] = strlen(text_info->language_code) | text_info->encoding << 7; - - memcpy(&NDEF_Buffer[Offset], text_info->language_code, strlen(text_info->language_code)); - Offset += strlen(text_info->language_code); - - memcpy(&NDEF_Buffer[Offset], text_info->text, strlen(text_info->text)); - Offset += strlen(text_info->text); - - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + uint16_t status = NDEF_ERROR; + uint32_t textSize, Offset = 0; + if (strlen(text_info->language_code) > 10) { return status; + } + + /* TEXT : 1+en+message */ + textSize = 1 + strlen(text_info->language_code) + strlen(text_info->text); + + /* TEXT header */ + NDEF_Buffer[Offset] = 0xC1; + if (textSize < 256) { + NDEF_Buffer[Offset] |= 0x10; // Set the SR bit + } + Offset++; + + NDEF_Buffer[Offset++] = TEXT_TYPE_STRING_LENGTH; + if (textSize > 255) { + NDEF_Buffer[Offset++] = (textSize & 0xFF000000) >> 24; + NDEF_Buffer[Offset++] = (textSize & 0x00FF0000) >> 16; + NDEF_Buffer[Offset++] = (textSize & 0x0000FF00) >> 8; + NDEF_Buffer[Offset++] = textSize & 0x000000FF; + } else { + NDEF_Buffer[Offset++] = (uint8_t)textSize; + } + memcpy(&NDEF_Buffer[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); + Offset += TEXT_TYPE_STRING_LENGTH; + + /* TEXT payload */ + NDEF_Buffer[Offset++] = strlen(text_info->language_code) | text_info->encoding << 7; + + memcpy(&NDEF_Buffer[Offset], text_info->language_code, strlen(text_info->language_code)); + Offset += strlen(text_info->language_code); + + memcpy(&NDEF_Buffer[Offset], text_info->text, strlen(text_info->text)); + Offset += strlen(text_info->text); + + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + + return status; } @@ -122,40 +124,40 @@ uint16_t NDEF::NDEF_WriteText(NDEF_Text_info_t *text_info) */ uint16_t NDEF::NDEF_ReadText(sRecordInfo_t *pRecordStruct, NDEF_Text_info_t *pText) { - uint16_t status = NDEF_ERROR; + uint16_t status = NDEF_ERROR; - if (pRecordStruct->NDEF_Type == TEXT_TYPE) { - /* Get the text metadata (status byte (encoding & language code length) + language code) */ - NDEF_Text_metadata_t *text_record_info = (NDEF_Text_metadata_t *)pRecordStruct->PayloadBufferAdd; + if (pRecordStruct->NDEF_Type == TEXT_TYPE) { + /* Get the text metadata (status byte (encoding & language code length) + language code) */ + NDEF_Text_metadata_t *text_record_info = (NDEF_Text_metadata_t *)pRecordStruct->PayloadBufferAdd; - uint32_t text_length = pRecordStruct->PayloadLength /* record length */ - - text_record_info->language_length /* minus language code length */ - - sizeof(uint8_t); /* minus the status byte length */ + uint32_t text_length = pRecordStruct->PayloadLength /* record length */ + - text_record_info->language_length /* minus language code length */ + - sizeof(uint8_t); /* minus the status byte length */ - if ((text_record_info->language_length >= TEXT_LANGUAGE_CODE_MAX_SIZE) || - (text_length >= TEXT_MAX_SIZE)) { - /* One of the text info structure buffer is too small */ - return NDEF_ERROR_MEMORY_INTERNAL; - } + if ((text_record_info->language_length >= TEXT_LANGUAGE_CODE_MAX_SIZE) || + (text_length >= TEXT_MAX_SIZE)) { + /* One of the text info structure buffer is too small */ + return NDEF_ERROR_MEMORY_INTERNAL; + } - /* Retrieve the encoding */ - pText->encoding = (NDEF_Text_encoding_t)text_record_info->encoding; + /* Retrieve the encoding */ + pText->encoding = (NDEF_Text_encoding_t)text_record_info->encoding; - /* Save the language code string (adding null char at the end) */ - memcpy(&pText->language_code, text_record_info->language, text_record_info->language_length); - pText->language_code[text_record_info->language_length] = '\0'; + /* Save the language code string (adding null char at the end) */ + memcpy(&pText->language_code, text_record_info->language, text_record_info->language_length); + pText->language_code[text_record_info->language_length] = '\0'; - /* Copy the text string itself (adding null char at the end) */ - memcpy(&pText->text, text_record_info->language + text_record_info->language_length, text_length); - pText->text[text_length] = '\0'; + /* Copy the text string itself (adding null char at the end) */ + memcpy(&pText->text, text_record_info->language + text_record_info->language_length, text_length); + pText->text[text_length] = '\0'; - status = NDEF_OK; - } else { - /* Not a text record, exit in error */ - status = NDEF_ERROR; - } + status = NDEF_OK; + } else { + /* Not a text record, exit in error */ + status = NDEF_ERROR; + } - return status; + return status; } /** diff --git a/src/libNDEF/lib_NDEF_Text.h b/src/libNDEF/lib_NDEF_Text.h index 4fe2493..74d6e64 100755 --- a/src/libNDEF/lib_NDEF_Text.h +++ b/src/libNDEF/lib_NDEF_Text.h @@ -36,24 +36,24 @@ /** @brief NDEF Text encoding possible values. */ typedef enum { - NDEF_TEXT_UTF8 = 0, - NDEF_TEXT_UTF16 = 1 + NDEF_TEXT_UTF8 = 0, + NDEF_TEXT_UTF16 = 1 } NDEF_Text_encoding_t; /** @brief This structure is used to handle information from a NDEF Text record. */ typedef struct { - NDEF_Text_encoding_t encoding; /**< metadata: UTF-8 / UTF-16. */ - char language_code[TEXT_LANGUAGE_CODE_MAX_SIZE]; /**< metadata: Language code as specified by IANA. */ - char text[TEXT_MAX_SIZE]; /**< The text itself. */ + NDEF_Text_encoding_t encoding; /**< metadata: UTF-8 / UTF-16. */ + char language_code[TEXT_LANGUAGE_CODE_MAX_SIZE]; /**< metadata: Language code as specified by IANA. */ + char text[TEXT_MAX_SIZE]; /**< The text itself. */ } NDEF_Text_info_t; /** @brief This structure is used to parse the raw data from a text record and access its metadata. */ typedef struct { - uint8_t language_length: 4; /**< Language code length. */ - uint8_t rfu: 3; /**< reserved for futur usage */ - uint8_t encoding: 1; /**< UTF-8 (0) or UTF-16 (1) encoding. */ - char language[1]; /**< IANA language code. */ + uint8_t language_length: 4; /**< Language code length. */ + uint8_t rfu: 3; /**< reserved for futur usage */ + uint8_t encoding: 1; /**< UTF-8 (0) or UTF-16 (1) encoding. */ + char language[1]; /**< IANA language code. */ } NDEF_Text_metadata_t; #endif /* __LIB_NDEF_TEXT_H */ diff --git a/src/libNDEF/lib_NDEF_URI.cpp b/src/libNDEF/lib_NDEF_URI.cpp index 67630f9..4e7c796 100755 --- a/src/libNDEF/lib_NDEF_URI.cpp +++ b/src/libNDEF/lib_NDEF_URI.cpp @@ -60,203 +60,203 @@ */ void NDEF::NDEF_Parse_WellKnowType(sRecordInfo_t *pRecordStruct, sURI_Info *pURI) { - uint32_t PayloadSize; - uint8_t Offset; - uint8_t *pPayload; + uint32_t PayloadSize; + uint8_t Offset; + uint8_t *pPayload; - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - switch (*pPayload) { + switch (*pPayload) { case URI_ID_0x01: - memcpy(pURI->protocol, URI_ID_0x01_STRING, strlen(URI_ID_0x01_STRING)); - Offset = strlen(URI_ID_0x01_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x01_STRING, strlen(URI_ID_0x01_STRING)); + Offset = strlen(URI_ID_0x01_STRING); + break; case URI_ID_0x02: - memcpy(pURI->protocol, URI_ID_0x02_STRING, strlen(URI_ID_0x02_STRING)); - Offset = strlen(URI_ID_0x02_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x02_STRING, strlen(URI_ID_0x02_STRING)); + Offset = strlen(URI_ID_0x02_STRING); + break; case URI_ID_0x03: - memcpy(pURI->protocol, URI_ID_0x03_STRING, strlen(URI_ID_0x03_STRING)); - Offset = strlen(URI_ID_0x03_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x03_STRING, strlen(URI_ID_0x03_STRING)); + Offset = strlen(URI_ID_0x03_STRING); + break; case URI_ID_0x04: - memcpy(pURI->protocol, URI_ID_0x04_STRING, strlen(URI_ID_0x04_STRING)); - Offset = strlen(URI_ID_0x04_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x04_STRING, strlen(URI_ID_0x04_STRING)); + Offset = strlen(URI_ID_0x04_STRING); + break; case URI_ID_0x05: - memcpy(pURI->protocol, URI_ID_0x05_STRING, strlen(URI_ID_0x05_STRING)); - Offset = strlen(URI_ID_0x05_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x05_STRING, strlen(URI_ID_0x05_STRING)); + Offset = strlen(URI_ID_0x05_STRING); + break; case URI_ID_0x06: - memcpy(pURI->protocol, URI_ID_0x06_STRING, strlen(URI_ID_0x06_STRING)); - Offset = strlen(URI_ID_0x06_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x06_STRING, strlen(URI_ID_0x06_STRING)); + Offset = strlen(URI_ID_0x06_STRING); + break; case URI_ID_0x07: - memcpy(pURI->protocol, URI_ID_0x07_STRING, strlen(URI_ID_0x07_STRING)); - Offset = strlen(URI_ID_0x07_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x07_STRING, strlen(URI_ID_0x07_STRING)); + Offset = strlen(URI_ID_0x07_STRING); + break; case URI_ID_0x08: - memcpy(pURI->protocol, URI_ID_0x08_STRING, strlen(URI_ID_0x08_STRING)); - Offset = strlen(URI_ID_0x08_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x08_STRING, strlen(URI_ID_0x08_STRING)); + Offset = strlen(URI_ID_0x08_STRING); + break; case URI_ID_0x09: - memcpy(pURI->protocol, URI_ID_0x09_STRING, strlen(URI_ID_0x09_STRING)); - Offset = strlen(URI_ID_0x09_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x09_STRING, strlen(URI_ID_0x09_STRING)); + Offset = strlen(URI_ID_0x09_STRING); + break; case URI_ID_0x0A: - memcpy(pURI->protocol, URI_ID_0x0A_STRING, strlen(URI_ID_0x0A_STRING)); - Offset = strlen(URI_ID_0x0A_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0A_STRING, strlen(URI_ID_0x0A_STRING)); + Offset = strlen(URI_ID_0x0A_STRING); + break; case URI_ID_0x0B: - memcpy(pURI->protocol, URI_ID_0x0B_STRING, strlen(URI_ID_0x0B_STRING)); - Offset = strlen(URI_ID_0x0B_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0B_STRING, strlen(URI_ID_0x0B_STRING)); + Offset = strlen(URI_ID_0x0B_STRING); + break; case URI_ID_0x0C: - memcpy(pURI->protocol, URI_ID_0x0C_STRING, strlen(URI_ID_0x0C_STRING)); - Offset = strlen(URI_ID_0x0C_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0C_STRING, strlen(URI_ID_0x0C_STRING)); + Offset = strlen(URI_ID_0x0C_STRING); + break; case URI_ID_0x0D: - memcpy(pURI->protocol, URI_ID_0x0D_STRING, strlen(URI_ID_0x0D_STRING)); - Offset = strlen(URI_ID_0x0D_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0D_STRING, strlen(URI_ID_0x0D_STRING)); + Offset = strlen(URI_ID_0x0D_STRING); + break; case URI_ID_0x0E: - memcpy(pURI->protocol, URI_ID_0x0E_STRING, strlen(URI_ID_0x0E_STRING)); - Offset = strlen(URI_ID_0x0E_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0E_STRING, strlen(URI_ID_0x0E_STRING)); + Offset = strlen(URI_ID_0x0E_STRING); + break; case URI_ID_0x0F: - memcpy(pURI->protocol, URI_ID_0x0F_STRING, strlen(URI_ID_0x0F_STRING)); - Offset = strlen(URI_ID_0x0F_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0F_STRING, strlen(URI_ID_0x0F_STRING)); + Offset = strlen(URI_ID_0x0F_STRING); + break; case URI_ID_0x10: - memcpy(pURI->protocol, URI_ID_0x10_STRING, strlen(URI_ID_0x10_STRING)); - Offset = strlen(URI_ID_0x10_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x10_STRING, strlen(URI_ID_0x10_STRING)); + Offset = strlen(URI_ID_0x10_STRING); + break; case URI_ID_0x11: - memcpy(pURI->protocol, URI_ID_0x11_STRING, strlen(URI_ID_0x11_STRING)); - Offset = strlen(URI_ID_0x11_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x11_STRING, strlen(URI_ID_0x11_STRING)); + Offset = strlen(URI_ID_0x11_STRING); + break; case URI_ID_0x12: - memcpy(pURI->protocol, URI_ID_0x12_STRING, strlen(URI_ID_0x12_STRING)); - Offset = strlen(URI_ID_0x12_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x12_STRING, strlen(URI_ID_0x12_STRING)); + Offset = strlen(URI_ID_0x12_STRING); + break; case URI_ID_0x13: - memcpy(pURI->protocol, URI_ID_0x13_STRING, strlen(URI_ID_0x13_STRING)); - Offset = strlen(URI_ID_0x13_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x13_STRING, strlen(URI_ID_0x13_STRING)); + Offset = strlen(URI_ID_0x13_STRING); + break; case URI_ID_0x14: - memcpy(pURI->protocol, URI_ID_0x14_STRING, strlen(URI_ID_0x14_STRING)); - Offset = strlen(URI_ID_0x14_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x14_STRING, strlen(URI_ID_0x14_STRING)); + Offset = strlen(URI_ID_0x14_STRING); + break; case URI_ID_0x15: - memcpy(pURI->protocol, URI_ID_0x15_STRING, strlen(URI_ID_0x15_STRING)); - Offset = strlen(URI_ID_0x15_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x15_STRING, strlen(URI_ID_0x15_STRING)); + Offset = strlen(URI_ID_0x15_STRING); + break; case URI_ID_0x16: - memcpy(pURI->protocol, URI_ID_0x16_STRING, strlen(URI_ID_0x16_STRING)); - Offset = strlen(URI_ID_0x16_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x16_STRING, strlen(URI_ID_0x16_STRING)); + Offset = strlen(URI_ID_0x16_STRING); + break; case URI_ID_0x17: - memcpy(pURI->protocol, URI_ID_0x17_STRING, strlen(URI_ID_0x17_STRING)); - Offset = strlen(URI_ID_0x17_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x17_STRING, strlen(URI_ID_0x17_STRING)); + Offset = strlen(URI_ID_0x17_STRING); + break; case URI_ID_0x18: - memcpy(pURI->protocol, URI_ID_0x18_STRING, strlen(URI_ID_0x18_STRING)); - Offset = strlen(URI_ID_0x18_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x18_STRING, strlen(URI_ID_0x18_STRING)); + Offset = strlen(URI_ID_0x18_STRING); + break; case URI_ID_0x19: - memcpy(pURI->protocol, URI_ID_0x19_STRING, strlen(URI_ID_0x19_STRING)); - Offset = strlen(URI_ID_0x19_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x19_STRING, strlen(URI_ID_0x19_STRING)); + Offset = strlen(URI_ID_0x19_STRING); + break; case URI_ID_0x1A: - memcpy(pURI->protocol, URI_ID_0x1A_STRING, strlen(URI_ID_0x1A_STRING)); - Offset = strlen(URI_ID_0x1A_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1A_STRING, strlen(URI_ID_0x1A_STRING)); + Offset = strlen(URI_ID_0x1A_STRING); + break; case URI_ID_0x1B: - memcpy(pURI->protocol, URI_ID_0x1B_STRING, strlen(URI_ID_0x1B_STRING)); - Offset = strlen(URI_ID_0x1B_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1B_STRING, strlen(URI_ID_0x1B_STRING)); + Offset = strlen(URI_ID_0x1B_STRING); + break; case URI_ID_0x1C: - memcpy(pURI->protocol, URI_ID_0x1C_STRING, strlen(URI_ID_0x1C_STRING)); - Offset = strlen(URI_ID_0x1C_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1C_STRING, strlen(URI_ID_0x1C_STRING)); + Offset = strlen(URI_ID_0x1C_STRING); + break; case URI_ID_0x1D: - memcpy(pURI->protocol, URI_ID_0x1D_STRING, strlen(URI_ID_0x1D_STRING)); - Offset = strlen(URI_ID_0x1D_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1D_STRING, strlen(URI_ID_0x1D_STRING)); + Offset = strlen(URI_ID_0x1D_STRING); + break; case URI_ID_0x1E: - memcpy(pURI->protocol, URI_ID_0x1E_STRING, strlen(URI_ID_0x1E_STRING)); - Offset = strlen(URI_ID_0x1E_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1E_STRING, strlen(URI_ID_0x1E_STRING)); + Offset = strlen(URI_ID_0x1E_STRING); + break; case URI_ID_0x1F: - memcpy(pURI->protocol, URI_ID_0x1F_STRING, strlen(URI_ID_0x1F_STRING)); - Offset = strlen(URI_ID_0x1F_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1F_STRING, strlen(URI_ID_0x1F_STRING)); + Offset = strlen(URI_ID_0x1F_STRING); + break; case URI_ID_0x20: - memcpy(pURI->protocol, URI_ID_0x20_STRING, strlen(URI_ID_0x20_STRING)); - Offset = strlen(URI_ID_0x20_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x20_STRING, strlen(URI_ID_0x20_STRING)); + Offset = strlen(URI_ID_0x20_STRING); + break; case URI_ID_0x21: - memcpy(pURI->protocol, URI_ID_0x21_STRING, strlen(URI_ID_0x21_STRING)); - Offset = strlen(URI_ID_0x21_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x21_STRING, strlen(URI_ID_0x21_STRING)); + Offset = strlen(URI_ID_0x21_STRING); + break; case URI_ID_0x22: - memcpy(pURI->protocol, URI_ID_0x22_STRING, strlen(URI_ID_0x22_STRING)); - Offset = strlen(URI_ID_0x22_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x22_STRING, strlen(URI_ID_0x22_STRING)); + Offset = strlen(URI_ID_0x22_STRING); + break; case URI_ID_0x23: - memcpy(pURI->protocol, URI_ID_0x23_STRING, strlen(URI_ID_0x23_STRING)); - Offset = strlen(URI_ID_0x23_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x23_STRING, strlen(URI_ID_0x23_STRING)); + Offset = strlen(URI_ID_0x23_STRING); + break; default: - Offset = 0; - /* Should not happened */ - break; - } - /* add end of string character */ - pURI->protocol[Offset] = '\0'; + Offset = 0; + /* Should not happened */ + break; + } + /* add end of string character */ + pURI->protocol[Offset] = '\0'; - pPayload++; /* go after well know byte */ + pPayload++; /* go after well know byte */ - PayloadSize = pRecordStruct->PayloadLength; + PayloadSize = pRecordStruct->PayloadLength; - PayloadSize = PayloadSize - 1; /* remove well know byte */ + PayloadSize = PayloadSize - 1; /* remove well know byte */ - memcpy(pURI->URI_Message, pPayload, PayloadSize); - /* add end of string character */ - pURI->URI_Message[PayloadSize] = '\0'; + memcpy(pURI->URI_Message, pPayload, PayloadSize); + /* add end of string character */ + pURI->URI_Message[PayloadSize] = '\0'; } @@ -278,40 +278,40 @@ void NDEF::NDEF_Parse_WellKnowType(sRecordInfo_t *pRecordStruct, sURI_Info *pURI */ uint16_t NDEF::NDEF_ReadURI(sRecordInfo_t *pRecordStruct, sURI_Info *pURI) { - uint16_t status = NDEF_ERROR; - sRecordInfo_t *pSPRecordStruct; - uint32_t PayloadSize, RecordPosition; - uint8_t *pData; - - if (pRecordStruct->NDEF_Type == UNABRIDGED_URI_TYPE) { - NDEF_Parse_WellKnowType(pRecordStruct, pURI); + uint16_t status = NDEF_ERROR; + sRecordInfo_t *pSPRecordStruct; + uint32_t PayloadSize, RecordPosition; + uint8_t *pData; + + if (pRecordStruct->NDEF_Type == UNABRIDGED_URI_TYPE) { + NDEF_Parse_WellKnowType(pRecordStruct, pURI); + status = NDEF_OK; + } else if (pRecordStruct->NDEF_Type == WELL_KNOWN_ABRIDGED_URI_TYPE) { + NDEF_Parse_WellKnowType(pRecordStruct, pURI); + status = NDEF_OK; + } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { + for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { + pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; + if (pSPRecordStruct->NDEF_Type == WELL_KNOWN_ABRIDGED_URI_TYPE) { + NDEF_Parse_WellKnowType(pSPRecordStruct, pURI); status = NDEF_OK; - } else if (pRecordStruct->NDEF_Type == WELL_KNOWN_ABRIDGED_URI_TYPE) { - NDEF_Parse_WellKnowType(pRecordStruct, pURI); - status = NDEF_OK; - } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { - for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { - pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; - if (pSPRecordStruct->NDEF_Type == WELL_KNOWN_ABRIDGED_URI_TYPE) { - NDEF_Parse_WellKnowType(pSPRecordStruct, pURI); - status = NDEF_OK; - } - if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { - PayloadSize = pSPRecordStruct->PayloadLength; - - /* The instruction content the UTF-8 language code that is not used here */ - pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; - PayloadSize -= *pData + 1; /* remove not useful data */ - pData += *pData + 1; - - memcpy(pURI->Information, pData, PayloadSize); - } - } - } else { - status = NDEF_ERROR; + } + if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { + PayloadSize = pSPRecordStruct->PayloadLength; + + /* The instruction content the UTF-8 language code that is not used here */ + pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; + PayloadSize -= *pData + 1; /* remove not useful data */ + pData += *pData + 1; + + memcpy(pURI->Information, pData, PayloadSize); + } } + } else { + status = NDEF_ERROR; + } - return status; + return status; } /** @@ -322,133 +322,133 @@ uint16_t NDEF::NDEF_ReadURI(sRecordInfo_t *pRecordStruct, sURI_Info *pURI) */ void NDEF::NDEF_PrepareURIMessage(sURI_Info *pURI, uint8_t *pNDEFMessage, uint16_t *size) { - uint32_t uriSize, totalSize, Offset = 0; - uint32_t infoSize = 0; - char type; - - /* An URI can be included in a smart poster to add text to give instruction to user for instance */ - - /* URI (smart poster) Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* We need to know the URI type in order to define if an abbreviation is available */ - type = getUriType(pURI->protocol); - - /* URI : 1+URI for abbreviate protocol*/ - if (type != URI_ID_0x00) { - uriSize = 1 + strlen(pURI->URI_Message); - } else { /*: 1+protocol+URI else*/ - uriSize = 1 + strlen(pURI->protocol) + strlen(pURI->URI_Message); + uint32_t uriSize, totalSize, Offset = 0; + uint32_t infoSize = 0; + char type; + + /* An URI can be included in a smart poster to add text to give instruction to user for instance */ + + /* URI (smart poster) Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* We need to know the URI type in order to define if an abbreviation is available */ + type = getUriType(pURI->protocol); + + /* URI : 1+URI for abbreviate protocol*/ + if (type != URI_ID_0x00) { + uriSize = 1 + strlen(pURI->URI_Message); + } else { /*: 1+protocol+URI else*/ + uriSize = 1 + strlen(pURI->protocol) + strlen(pURI->URI_Message); + } + + /* Check if a Smart poster is needed */ + if (pURI->Information[0] != '\0') { + /* Info : 1+2+info */ + infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pURI->Information); + /* Total */ + totalSize = 4 + uriSize + 4 + infoSize; + if (uriSize > 255) { + totalSize += 3; /* Normal URI size */ } - - /* Check if a Smart poster is needed */ - if (pURI->Information[0] != '\0') { - /* Info : 1+2+info */ - infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pURI->Information); - /* Total */ - totalSize = 4 + uriSize + 4 + infoSize; - if (uriSize > 255) { - totalSize += 3; /* Normal URI size */ - } - if (infoSize > 255) { - totalSize += 3; /* Normal Info size */ - } - - /* SmartPoster header */ - if (totalSize > 255) { - pNDEFMessage[Offset++] = 0xC1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = totalSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0xD1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)totalSize; - } - memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); - Offset += SMART_POSTER_TYPE_STRING_LENGTH; + if (infoSize > 255) { + totalSize += 3; /* Normal Info size */ } - /* URI header */ - pNDEFMessage[Offset] = 0x81; - if (uriSize < 256) { - pNDEFMessage[Offset] |= 0x10; // Set the SR bit - } - if (pURI->Information[0] == '\0') { - pNDEFMessage[Offset] |= 0x40; // Set the ME bit + /* SmartPoster header */ + if (totalSize > 255) { + pNDEFMessage[Offset++] = 0xC1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = totalSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = 0xD1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)totalSize; } - Offset++; - - pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; - if (uriSize > 255) { - pNDEFMessage[Offset++] = (uriSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (uriSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (uriSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = uriSize & 0x000000FF; + memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); + Offset += SMART_POSTER_TYPE_STRING_LENGTH; + } + + /* URI header */ + pNDEFMessage[Offset] = 0x81; + if (uriSize < 256) { + pNDEFMessage[Offset] |= 0x10; // Set the SR bit + } + if (pURI->Information[0] == '\0') { + pNDEFMessage[Offset] |= 0x40; // Set the ME bit + } + Offset++; + + pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; + if (uriSize > 255) { + pNDEFMessage[Offset++] = (uriSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (uriSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (uriSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = uriSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = (uint8_t)uriSize; + } + memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); + Offset += URI_TYPE_STRING_LENGTH; + + pNDEFMessage[Offset++] = type; + if (type == URI_ID_0x00) { // No abbreviation + memcpy(&pNDEFMessage[Offset], pURI->protocol, strlen(pURI->protocol)); + Offset += strlen(pURI->protocol); + } + + memcpy(&pNDEFMessage[Offset], pURI->URI_Message, strlen(pURI->URI_Message)); + Offset += strlen(pURI->URI_Message); + + /* Information header */ + if (pURI->Information[0] != '\0') { + if (infoSize > 255) { + pNDEFMessage[Offset++] = 0x41; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = infoSize & 0x000000FF; } else { - pNDEFMessage[Offset++] = (uint8_t)uriSize; + pNDEFMessage[Offset++] = 0x51; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)infoSize; } - memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); - Offset += URI_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = type; - if (type == URI_ID_0x00) { // No abbreviation - memcpy(&pNDEFMessage[Offset], pURI->protocol, strlen(pURI->protocol)); - Offset += strlen(pURI->protocol); - } + memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); + Offset += TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ + memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); + Offset += ISO_ENGLISH_CODE_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], pURI->URI_Message, strlen(pURI->URI_Message)); - Offset += strlen(pURI->URI_Message); - - /* Information header */ - if (pURI->Information[0] != '\0') { - if (infoSize > 255) { - pNDEFMessage[Offset++] = 0x41; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = infoSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0x51; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)infoSize; - } - - memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); - Offset += TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ - memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); - Offset += ISO_ENGLISH_CODE_STRING_LENGTH; - - /* Information payload */ - memcpy(&pNDEFMessage[Offset], pURI->Information, strlen(pURI->Information)); - Offset += strlen(pURI->Information); - } + /* Information payload */ + memcpy(&pNDEFMessage[Offset], pURI->Information, strlen(pURI->Information)); + Offset += strlen(pURI->Information); + } - *size = Offset; + *size = Offset; } /** @@ -463,90 +463,90 @@ void NDEF::NDEF_PrepareURIMessage(sURI_Info *pURI, uint8_t *pNDEFMessage, uint16 */ uint16_t NDEF::NDEF_WriteURI(sURI_Info *pURI) { - uint16_t status = NDEF_ERROR, Offset = 0; + uint16_t status = NDEF_ERROR, Offset = 0; - NDEF_PrepareURIMessage(pURI, NDEF_Buffer, &Offset); + NDEF_PrepareURIMessage(pURI, NDEF_Buffer, &Offset); - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); - return status; + return status; } char NDEF::getUriType(char *protocol) { - if (!memcmp(protocol, URI_ID_0x01_STRING, strlen(URI_ID_0x01_STRING))) { - return URI_ID_0x01; - } else if (!memcmp(protocol, URI_ID_0x02_STRING, strlen(URI_ID_0x02_STRING))) { - return URI_ID_0x02; - } else if (!memcmp(protocol, URI_ID_0x03_STRING, strlen(URI_ID_0x03_STRING))) { - return URI_ID_0x03; - } else if (!memcmp(protocol, URI_ID_0x04_STRING, strlen(URI_ID_0x04_STRING))) { - return URI_ID_0x04; - } else if (!memcmp(protocol, URI_ID_0x05_STRING, strlen(URI_ID_0x05_STRING))) { - return URI_ID_0x05; - } else if (!memcmp(protocol, URI_ID_0x06_STRING, strlen(URI_ID_0x06_STRING))) { - return URI_ID_0x06; - } else if (!memcmp(protocol, URI_ID_0x07_STRING, strlen(URI_ID_0x07_STRING))) { - return URI_ID_0x07; - } else if (!memcmp(protocol, URI_ID_0x08_STRING, strlen(URI_ID_0x08_STRING))) { - return URI_ID_0x08; - } else if (!memcmp(protocol, URI_ID_0x09_STRING, strlen(URI_ID_0x09_STRING))) { - return URI_ID_0x09; - } else if (!memcmp(protocol, URI_ID_0x0A_STRING, strlen(URI_ID_0x0A_STRING))) { - return URI_ID_0x0A; - } else if (!memcmp(protocol, URI_ID_0x0B_STRING, strlen(URI_ID_0x0B_STRING))) { - return URI_ID_0x0B; - } else if (!memcmp(protocol, URI_ID_0x0C_STRING, strlen(URI_ID_0x0C_STRING))) { - return URI_ID_0x0C; - } else if (!memcmp(protocol, URI_ID_0x0D_STRING, strlen(URI_ID_0x0D_STRING))) { - return URI_ID_0x0D; - } else if (!memcmp(protocol, URI_ID_0x0E_STRING, strlen(URI_ID_0x0E_STRING))) { - return URI_ID_0x0E; - } else if (!memcmp(protocol, URI_ID_0x0F_STRING, strlen(URI_ID_0x0F_STRING))) { - return URI_ID_0x0F; - } else if (!memcmp(protocol, URI_ID_0x10_STRING, strlen(URI_ID_0x10_STRING))) { - return URI_ID_0x10; - } else if (!memcmp(protocol, URI_ID_0x11_STRING, strlen(URI_ID_0x11_STRING))) { - return URI_ID_0x11; - } else if (!memcmp(protocol, URI_ID_0x12_STRING, strlen(URI_ID_0x12_STRING))) { - return URI_ID_0x12; - } else if (!memcmp(protocol, URI_ID_0x13_STRING, strlen(URI_ID_0x13_STRING))) { - return URI_ID_0x13; - } else if (!memcmp(protocol, URI_ID_0x14_STRING, strlen(URI_ID_0x14_STRING))) { - return URI_ID_0x14; - } else if (!memcmp(protocol, URI_ID_0x15_STRING, strlen(URI_ID_0x15_STRING))) { - return URI_ID_0x15; - } else if (!memcmp(protocol, URI_ID_0x16_STRING, strlen(URI_ID_0x16_STRING))) { - return URI_ID_0x16; - } else if (!memcmp(protocol, URI_ID_0x17_STRING, strlen(URI_ID_0x17_STRING))) { - return URI_ID_0x17; - } else if (!memcmp(protocol, URI_ID_0x18_STRING, strlen(URI_ID_0x18_STRING))) { - return URI_ID_0x18; - } else if (!memcmp(protocol, URI_ID_0x19_STRING, strlen(URI_ID_0x19_STRING))) { - return URI_ID_0x19; - } else if (!memcmp(protocol, URI_ID_0x1A_STRING, strlen(URI_ID_0x1A_STRING))) { - return URI_ID_0x1A; - } else if (!memcmp(protocol, URI_ID_0x1B_STRING, strlen(URI_ID_0x1B_STRING))) { - return URI_ID_0x1B; - } else if (!memcmp(protocol, URI_ID_0x1C_STRING, strlen(URI_ID_0x1C_STRING))) { - return URI_ID_0x1C; - } else if (!memcmp(protocol, URI_ID_0x1D_STRING, strlen(URI_ID_0x1D_STRING))) { - return URI_ID_0x1D; - } else if (!memcmp(protocol, URI_ID_0x1E_STRING, strlen(URI_ID_0x1E_STRING))) { - return URI_ID_0x1E; - } else if (!memcmp(protocol, URI_ID_0x1F_STRING, strlen(URI_ID_0x1F_STRING))) { - return URI_ID_0x1F; - } else if (!memcmp(protocol, URI_ID_0x20_STRING, strlen(URI_ID_0x20_STRING))) { - return URI_ID_0x20; - } else if (!memcmp(protocol, URI_ID_0x21_STRING, strlen(URI_ID_0x21_STRING))) { - return URI_ID_0x21; - } else if (!memcmp(protocol, URI_ID_0x22_STRING, strlen(URI_ID_0x22_STRING))) { - return URI_ID_0x22; - } else if (!memcmp(protocol, URI_ID_0x23_STRING, strlen(URI_ID_0x23_STRING))) { - return URI_ID_0x23; - } else { - return URI_ID_0x00; // No abbreviation for this protocol - } + if (!memcmp(protocol, URI_ID_0x01_STRING, strlen(URI_ID_0x01_STRING))) { + return URI_ID_0x01; + } else if (!memcmp(protocol, URI_ID_0x02_STRING, strlen(URI_ID_0x02_STRING))) { + return URI_ID_0x02; + } else if (!memcmp(protocol, URI_ID_0x03_STRING, strlen(URI_ID_0x03_STRING))) { + return URI_ID_0x03; + } else if (!memcmp(protocol, URI_ID_0x04_STRING, strlen(URI_ID_0x04_STRING))) { + return URI_ID_0x04; + } else if (!memcmp(protocol, URI_ID_0x05_STRING, strlen(URI_ID_0x05_STRING))) { + return URI_ID_0x05; + } else if (!memcmp(protocol, URI_ID_0x06_STRING, strlen(URI_ID_0x06_STRING))) { + return URI_ID_0x06; + } else if (!memcmp(protocol, URI_ID_0x07_STRING, strlen(URI_ID_0x07_STRING))) { + return URI_ID_0x07; + } else if (!memcmp(protocol, URI_ID_0x08_STRING, strlen(URI_ID_0x08_STRING))) { + return URI_ID_0x08; + } else if (!memcmp(protocol, URI_ID_0x09_STRING, strlen(URI_ID_0x09_STRING))) { + return URI_ID_0x09; + } else if (!memcmp(protocol, URI_ID_0x0A_STRING, strlen(URI_ID_0x0A_STRING))) { + return URI_ID_0x0A; + } else if (!memcmp(protocol, URI_ID_0x0B_STRING, strlen(URI_ID_0x0B_STRING))) { + return URI_ID_0x0B; + } else if (!memcmp(protocol, URI_ID_0x0C_STRING, strlen(URI_ID_0x0C_STRING))) { + return URI_ID_0x0C; + } else if (!memcmp(protocol, URI_ID_0x0D_STRING, strlen(URI_ID_0x0D_STRING))) { + return URI_ID_0x0D; + } else if (!memcmp(protocol, URI_ID_0x0E_STRING, strlen(URI_ID_0x0E_STRING))) { + return URI_ID_0x0E; + } else if (!memcmp(protocol, URI_ID_0x0F_STRING, strlen(URI_ID_0x0F_STRING))) { + return URI_ID_0x0F; + } else if (!memcmp(protocol, URI_ID_0x10_STRING, strlen(URI_ID_0x10_STRING))) { + return URI_ID_0x10; + } else if (!memcmp(protocol, URI_ID_0x11_STRING, strlen(URI_ID_0x11_STRING))) { + return URI_ID_0x11; + } else if (!memcmp(protocol, URI_ID_0x12_STRING, strlen(URI_ID_0x12_STRING))) { + return URI_ID_0x12; + } else if (!memcmp(protocol, URI_ID_0x13_STRING, strlen(URI_ID_0x13_STRING))) { + return URI_ID_0x13; + } else if (!memcmp(protocol, URI_ID_0x14_STRING, strlen(URI_ID_0x14_STRING))) { + return URI_ID_0x14; + } else if (!memcmp(protocol, URI_ID_0x15_STRING, strlen(URI_ID_0x15_STRING))) { + return URI_ID_0x15; + } else if (!memcmp(protocol, URI_ID_0x16_STRING, strlen(URI_ID_0x16_STRING))) { + return URI_ID_0x16; + } else if (!memcmp(protocol, URI_ID_0x17_STRING, strlen(URI_ID_0x17_STRING))) { + return URI_ID_0x17; + } else if (!memcmp(protocol, URI_ID_0x18_STRING, strlen(URI_ID_0x18_STRING))) { + return URI_ID_0x18; + } else if (!memcmp(protocol, URI_ID_0x19_STRING, strlen(URI_ID_0x19_STRING))) { + return URI_ID_0x19; + } else if (!memcmp(protocol, URI_ID_0x1A_STRING, strlen(URI_ID_0x1A_STRING))) { + return URI_ID_0x1A; + } else if (!memcmp(protocol, URI_ID_0x1B_STRING, strlen(URI_ID_0x1B_STRING))) { + return URI_ID_0x1B; + } else if (!memcmp(protocol, URI_ID_0x1C_STRING, strlen(URI_ID_0x1C_STRING))) { + return URI_ID_0x1C; + } else if (!memcmp(protocol, URI_ID_0x1D_STRING, strlen(URI_ID_0x1D_STRING))) { + return URI_ID_0x1D; + } else if (!memcmp(protocol, URI_ID_0x1E_STRING, strlen(URI_ID_0x1E_STRING))) { + return URI_ID_0x1E; + } else if (!memcmp(protocol, URI_ID_0x1F_STRING, strlen(URI_ID_0x1F_STRING))) { + return URI_ID_0x1F; + } else if (!memcmp(protocol, URI_ID_0x20_STRING, strlen(URI_ID_0x20_STRING))) { + return URI_ID_0x20; + } else if (!memcmp(protocol, URI_ID_0x21_STRING, strlen(URI_ID_0x21_STRING))) { + return URI_ID_0x21; + } else if (!memcmp(protocol, URI_ID_0x22_STRING, strlen(URI_ID_0x22_STRING))) { + return URI_ID_0x22; + } else if (!memcmp(protocol, URI_ID_0x23_STRING, strlen(URI_ID_0x23_STRING))) { + return URI_ID_0x23; + } else { + return URI_ID_0x00; // No abbreviation for this protocol + } } diff --git a/src/libNDEF/lib_NDEF_URI.h b/src/libNDEF/lib_NDEF_URI.h index a96d32a..245eae0 100755 --- a/src/libNDEF/lib_NDEF_URI.h +++ b/src/libNDEF/lib_NDEF_URI.h @@ -35,12 +35,12 @@ #include "lib_NDEF.h" typedef struct { - // char protocol[80]; - // char URI_Message[400]; - // char Information[400]; - char protocol[URI_PROTOCOL_MAX_SIZE]; - char URI_Message[URI_MESSAGE_MAX_SIZE]; - char Information[URI_INFO_MAX_SIZE]; + // char protocol[80]; + // char URI_Message[400]; + // char Information[400]; + char protocol[URI_PROTOCOL_MAX_SIZE]; + char URI_Message[URI_MESSAGE_MAX_SIZE]; + char Information[URI_INFO_MAX_SIZE]; } sURI_Info; #endif /* __LIB_NDEF_URI_H */ diff --git a/src/libNDEF/lib_NDEF_Vcard.cpp b/src/libNDEF/lib_NDEF_Vcard.cpp index 997e121..756c559 100755 --- a/src/libNDEF/lib_NDEF_Vcard.cpp +++ b/src/libNDEF/lib_NDEF_Vcard.cpp @@ -52,37 +52,37 @@ */ void NDEF::NDEF_FillVcardStruct(uint8_t *pPayload, uint32_t PayloadSize, const char *pKeyWord, uint32_t SizeOfKeyWord, uint8_t *pString) { - uint8_t *pLastByteAdd, *pLook4Word, *pEndString; - - /* First character force to NULL in case not matching found */ - *pString = 0; - - /* Interesting information are stored before picture if any */ - /* Moreover picture is not used in this demonstration SW */ - pLastByteAdd = pPayload; - while (memcmp(pLastByteAdd, JPEG, JPEG_STRING_SIZE) && (pLastByteAdd < (pPayload + PayloadSize))) { - pLastByteAdd++; - } - - pLook4Word = pPayload; - while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { - pLook4Word++; - } - - /* Word found */ - if (pLook4Word != pLastByteAdd) { - pLook4Word += SizeOfKeyWord; - pEndString = pLook4Word; - while (memcmp(pEndString, LIMIT, LIMIT_STRING_SIZE) && (pEndString < pLastByteAdd)) { - pEndString++; - } - if (pEndString != pLastByteAdd) { - memcpy(pString, pLook4Word, pEndString - pLook4Word); - /* add end of string character */ - pString += pEndString - pLook4Word; - *pString = '\0'; - } - } + uint8_t *pLastByteAdd, *pLook4Word, *pEndString; + + /* First character force to NULL in case not matching found */ + *pString = 0; + + /* Interesting information are stored before picture if any */ + /* Moreover picture is not used in this demonstration SW */ + pLastByteAdd = pPayload; + while (memcmp(pLastByteAdd, JPEG, JPEG_STRING_SIZE) && (pLastByteAdd < (pPayload + PayloadSize))) { + pLastByteAdd++; + } + + pLook4Word = pPayload; + while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { + pLook4Word++; + } + + /* Word found */ + if (pLook4Word != pLastByteAdd) { + pLook4Word += SizeOfKeyWord; + pEndString = pLook4Word; + while (memcmp(pEndString, LIMIT, LIMIT_STRING_SIZE) && (pEndString < pLastByteAdd)) { + pEndString++; + } + if (pEndString != pLastByteAdd) { + memcpy(pString, pLook4Word, pEndString - pLook4Word); + /* add end of string character */ + pString += pEndString - pLook4Word; + *pString = '\0'; + } + } } /** @@ -92,34 +92,34 @@ void NDEF::NDEF_FillVcardStruct(uint8_t *pPayload, uint32_t PayloadSize, const c */ void NDEF::NDEF_ExtractVcard(sRecordInfo_t *pRecordStruct, sVcardInfo *pVcardStruct) { - uint32_t PayloadSize; - uint8_t *pPayload; - - - PayloadSize = pRecordStruct->PayloadLength; - - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - - NDEF_FillVcardStruct(pPayload, PayloadSize, VERSION, VERSION_STRING_SIZE, (uint8_t *)(pVcardStruct->Version)); - if (!memcmp(pVcardStruct->Version, VCARD_VERSION_2_1, VCARD_VERSION_2_1_SIZE)) { - NDEF_FillVcardStruct(pPayload, PayloadSize, FIRSTNAME, FIRSTNAME_STRING_SIZE, (uint8_t *)(pVcardStruct->FirstName)); - NDEF_FillVcardStruct(pPayload, PayloadSize, TITLE, TITLE_STRING_SIZE, (uint8_t *)(pVcardStruct->Title)); - NDEF_FillVcardStruct(pPayload, PayloadSize, ORG, ORG_STRING_SIZE, (uint8_t *)(pVcardStruct->Org)); - NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_ADDRESS, HOME_ADDRESS_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeAddress)); - NDEF_FillVcardStruct(pPayload, PayloadSize, GEN_ADDRESS, strlen(GEN_ADDRESS), (uint8_t *)(pVcardStruct->Address)); - NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_ADDRESS, WORK_ADDRESS_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkAddress)); - NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_TEL, HOME_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeTel)); - NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_TEL, WORK_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkTel)); - NDEF_FillVcardStruct(pPayload, PayloadSize, CELL_TEL, CELL_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->CellTel)); - NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_EMAIL, HOME_EMAIL_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeEmail)); - NDEF_FillVcardStruct(pPayload, PayloadSize, GEN_EMAIL, strlen(GEN_EMAIL), (uint8_t *)(pVcardStruct->Email)); - NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_EMAIL, WORK_EMAIL_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkEmail)); - } else if (!memcmp(pVcardStruct->Version, VCARD_VERSION_3_0, VCARD_VERSION_3_0_SIZE)) { - /* need to be implemented */ - } else { - /* maybe new version but not supported in this sw */ - } + uint32_t PayloadSize; + uint8_t *pPayload; + + + PayloadSize = pRecordStruct->PayloadLength; + + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + + NDEF_FillVcardStruct(pPayload, PayloadSize, VERSION, VERSION_STRING_SIZE, (uint8_t *)(pVcardStruct->Version)); + if (!memcmp(pVcardStruct->Version, VCARD_VERSION_2_1, VCARD_VERSION_2_1_SIZE)) { + NDEF_FillVcardStruct(pPayload, PayloadSize, FIRSTNAME, FIRSTNAME_STRING_SIZE, (uint8_t *)(pVcardStruct->FirstName)); + NDEF_FillVcardStruct(pPayload, PayloadSize, TITLE, TITLE_STRING_SIZE, (uint8_t *)(pVcardStruct->Title)); + NDEF_FillVcardStruct(pPayload, PayloadSize, ORG, ORG_STRING_SIZE, (uint8_t *)(pVcardStruct->Org)); + NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_ADDRESS, HOME_ADDRESS_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeAddress)); + NDEF_FillVcardStruct(pPayload, PayloadSize, GEN_ADDRESS, strlen(GEN_ADDRESS), (uint8_t *)(pVcardStruct->Address)); + NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_ADDRESS, WORK_ADDRESS_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkAddress)); + NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_TEL, HOME_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeTel)); + NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_TEL, WORK_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkTel)); + NDEF_FillVcardStruct(pPayload, PayloadSize, CELL_TEL, CELL_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->CellTel)); + NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_EMAIL, HOME_EMAIL_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeEmail)); + NDEF_FillVcardStruct(pPayload, PayloadSize, GEN_EMAIL, strlen(GEN_EMAIL), (uint8_t *)(pVcardStruct->Email)); + NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_EMAIL, WORK_EMAIL_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkEmail)); + } else if (!memcmp(pVcardStruct->Version, VCARD_VERSION_3_0, VCARD_VERSION_3_0_SIZE)) { + /* need to be implemented */ + } else { + /* maybe new version but not supported in this sw */ + } } @@ -132,14 +132,14 @@ void NDEF::NDEF_ExtractVcard(sRecordInfo_t *pRecordStruct, sVcardInfo *pVcardStr */ uint16_t NDEF::NDEF_ReadVcard(sRecordInfo_t *pRecordStruct, sVcardInfo *pVcardStruct) { - uint16_t status = NDEF_ERROR; + uint16_t status = NDEF_ERROR; - if (pRecordStruct->NDEF_Type == VCARD_TYPE) { - NDEF_ExtractVcard(pRecordStruct, pVcardStruct); - status = NDEF_OK; - } + if (pRecordStruct->NDEF_Type == VCARD_TYPE) { + NDEF_ExtractVcard(pRecordStruct, pVcardStruct); + status = NDEF_OK; + } - return status; + return status; } /** @@ -154,13 +154,13 @@ uint16_t NDEF::NDEF_ReadVcard(sRecordInfo_t *pRecordStruct, sVcardInfo *pVcardSt */ uint16_t NDEF::NDEF_WriteVcard(sVcardInfo *pVcardStruct) { - uint16_t status = NDEF_ERROR, Offset = 0; + uint16_t status = NDEF_ERROR, Offset = 0; - NDEF_PrepareVcardMessage(pVcardStruct, NDEF_Buffer, &Offset); + NDEF_PrepareVcardMessage(pVcardStruct, NDEF_Buffer, &Offset); - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); - return status; + return status; } /** @@ -171,96 +171,96 @@ uint16_t NDEF::NDEF_WriteVcard(sVcardInfo *pVcardStruct) uint32_t NDEF_GetVcardLength(sVcardInfo *pVcardStruct) { - uint32_t PayloadSize = 0; + uint32_t PayloadSize = 0; - /* "BEGIN:VCARD\r\n" */ - PayloadSize += VCARD_BEGIN_STRING_SIZE; - PayloadSize += VCARD_STRING_SIZE; - PayloadSize += LIMIT_STRING_SIZE; + /* "BEGIN:VCARD\r\n" */ + PayloadSize += VCARD_BEGIN_STRING_SIZE; + PayloadSize += VCARD_STRING_SIZE; + PayloadSize += LIMIT_STRING_SIZE; - /* "VERSION:2.1\r\n" */ - PayloadSize += VERSION_STRING_SIZE; - PayloadSize += VCARD_VERSION_2_1_SIZE; - PayloadSize += LIMIT_STRING_SIZE; + /* "VERSION:2.1\r\n" */ + PayloadSize += VERSION_STRING_SIZE; + PayloadSize += VCARD_VERSION_2_1_SIZE; + PayloadSize += LIMIT_STRING_SIZE; - /* "N:\r\n" */ - if (*pVcardStruct->Name != '\0') { - PayloadSize += VCARD_NAME_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->Name); - PayloadSize += LIMIT_STRING_SIZE; - } - /* "FN:\r\n" */ - if (*pVcardStruct->FirstName != '\0') { - PayloadSize += FIRSTNAME_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->FirstName); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Title != '\0') { - /* "TITLE:\r\n" */ - PayloadSize += TITLE_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->Title); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Org != '\0') { - /* "ORG:\r\n" */ - PayloadSize += ORG_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->Org); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Url != '\0') { - /* "URL:\r\n" */ - PayloadSize += URL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->Url); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeAddress != '\0') { - /* "ADR;HOME:\r\n" */ - PayloadSize += HOME_ADDRESS_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->HomeAddress); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkAddress != '\0') { - /* "ADR;WORK:\r\n" */ - PayloadSize += WORK_ADDRESS_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->WorkAddress); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeTel != '\0') { - /* "TEL;HOME:\r\n" */ - PayloadSize += HOME_TEL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->HomeTel); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkTel != '\0') { - /* "TEL;WORK:\r\n" */ - PayloadSize += WORK_TEL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->WorkTel); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->CellTel != '\0') { - /* "TEL;CELL:\r\n" */ - PayloadSize += CELL_TEL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->CellTel); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeEmail != '\0') { - /* "EMAIL;HOME:\r\n" */ - PayloadSize += HOME_EMAIL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->HomeEmail); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkEmail != '\0') { - /* "EMAIL;WORK:\r\n" */ - PayloadSize += WORK_EMAIL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->WorkEmail); - PayloadSize += LIMIT_STRING_SIZE; - } - /* "END:VCARD\r\n" */ - PayloadSize += VCARD_END_STRING_SIZE; - PayloadSize += VCARD_STRING_SIZE; - /* PayloadSize += LIMIT_STRING_SIZE;*/ + /* "N:\r\n" */ + if (*pVcardStruct->Name != '\0') { + PayloadSize += VCARD_NAME_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->Name); + PayloadSize += LIMIT_STRING_SIZE; + } + /* "FN:\r\n" */ + if (*pVcardStruct->FirstName != '\0') { + PayloadSize += FIRSTNAME_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->FirstName); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Title != '\0') { + /* "TITLE:\r\n" */ + PayloadSize += TITLE_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->Title); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Org != '\0') { + /* "ORG:\r\n" */ + PayloadSize += ORG_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->Org); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Url != '\0') { + /* "URL:\r\n" */ + PayloadSize += URL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->Url); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->HomeAddress != '\0') { + /* "ADR;HOME:\r\n" */ + PayloadSize += HOME_ADDRESS_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->HomeAddress); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkAddress != '\0') { + /* "ADR;WORK:\r\n" */ + PayloadSize += WORK_ADDRESS_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->WorkAddress); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->HomeTel != '\0') { + /* "TEL;HOME:\r\n" */ + PayloadSize += HOME_TEL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->HomeTel); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkTel != '\0') { + /* "TEL;WORK:\r\n" */ + PayloadSize += WORK_TEL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->WorkTel); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->CellTel != '\0') { + /* "TEL;CELL:\r\n" */ + PayloadSize += CELL_TEL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->CellTel); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->HomeEmail != '\0') { + /* "EMAIL;HOME:\r\n" */ + PayloadSize += HOME_EMAIL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->HomeEmail); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkEmail != '\0') { + /* "EMAIL;WORK:\r\n" */ + PayloadSize += WORK_EMAIL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->WorkEmail); + PayloadSize += LIMIT_STRING_SIZE; + } + /* "END:VCARD\r\n" */ + PayloadSize += VCARD_END_STRING_SIZE; + PayloadSize += VCARD_STRING_SIZE; + /* PayloadSize += LIMIT_STRING_SIZE;*/ - return PayloadSize; + return PayloadSize; } @@ -273,209 +273,209 @@ uint32_t NDEF_GetVcardLength(sVcardInfo *pVcardStruct) void NDEF::NDEF_PrepareVcardMessage(sVcardInfo *pVcardStruct, uint8_t *pNDEFMessage, uint16_t *size) { - uint32_t PayloadSize = 0; - - /* Vcard Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=0 TNF=2 NFC Forum Media type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* As we don't have embedded a jpeg encoder/decoder in this firmware */ - /* We have made the choice to manage only string content of the vCard */ - /* For demonstration purpose in order to fill the 8kB of the M24SR */ - /* We have embedded a NDEF vCard in the STM32 to be able to fill M24SR */ - - /* fill record header */ - uint32_t length = NDEF_GetVcardLength(pVcardStruct); - if (length >= 0xFF) { - pNDEFMessage[0] = 0xC2; /* Record Flag */ - pNDEFMessage[1] = XVCARD_TYPE_STRING_LENGTH; - pNDEFMessage[5] = length & 0xff; - pNDEFMessage[4] = (length >> 8) & 0xff; - pNDEFMessage[3] = (length >> 16) & 0xff; - pNDEFMessage[2] = length >> 24; - memcpy(&pNDEFMessage[6], XVCARD_TYPE_STRING, XVCARD_TYPE_STRING_LENGTH); - - /* Payload is positioned in the NDEF after record header */ - PayloadSize = 6 + XVCARD_TYPE_STRING_LENGTH; - } else { - pNDEFMessage[0] = 0xD2; /* Record Flag */ - pNDEFMessage[1] = XVCARD_TYPE_STRING_LENGTH; - pNDEFMessage[2] = length; - memcpy(&pNDEFMessage[3], XVCARD_TYPE_STRING, XVCARD_TYPE_STRING_LENGTH); - - /* Payload is positioned in the NDEF after record header */ - PayloadSize = 3 + XVCARD_TYPE_STRING_LENGTH; - } - - /* "BEGIN:VCARD\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], VCARD_BEGIN, VCARD_BEGIN_STRING_SIZE); - PayloadSize += VCARD_BEGIN_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], VCARD, VCARD_STRING_SIZE); - PayloadSize += VCARD_STRING_SIZE; + uint32_t PayloadSize = 0; + + /* Vcard Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=0 TNF=2 NFC Forum Media type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* As we don't have embedded a jpeg encoder/decoder in this firmware */ + /* We have made the choice to manage only string content of the vCard */ + /* For demonstration purpose in order to fill the 8kB of the M24SR */ + /* We have embedded a NDEF vCard in the STM32 to be able to fill M24SR */ + + /* fill record header */ + uint32_t length = NDEF_GetVcardLength(pVcardStruct); + if (length >= 0xFF) { + pNDEFMessage[0] = 0xC2; /* Record Flag */ + pNDEFMessage[1] = XVCARD_TYPE_STRING_LENGTH; + pNDEFMessage[5] = length & 0xff; + pNDEFMessage[4] = (length >> 8) & 0xff; + pNDEFMessage[3] = (length >> 16) & 0xff; + pNDEFMessage[2] = length >> 24; + memcpy(&pNDEFMessage[6], XVCARD_TYPE_STRING, XVCARD_TYPE_STRING_LENGTH); + + /* Payload is positioned in the NDEF after record header */ + PayloadSize = 6 + XVCARD_TYPE_STRING_LENGTH; + } else { + pNDEFMessage[0] = 0xD2; /* Record Flag */ + pNDEFMessage[1] = XVCARD_TYPE_STRING_LENGTH; + pNDEFMessage[2] = length; + memcpy(&pNDEFMessage[3], XVCARD_TYPE_STRING, XVCARD_TYPE_STRING_LENGTH); + + /* Payload is positioned in the NDEF after record header */ + PayloadSize = 3 + XVCARD_TYPE_STRING_LENGTH; + } + + /* "BEGIN:VCARD\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], VCARD_BEGIN, VCARD_BEGIN_STRING_SIZE); + PayloadSize += VCARD_BEGIN_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], VCARD, VCARD_STRING_SIZE); + PayloadSize += VCARD_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + + /* "VERSION:2.1\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], VERSION, VERSION_STRING_SIZE); + PayloadSize += VERSION_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], VCARD_VERSION_2_1, VCARD_VERSION_2_1_SIZE); + PayloadSize += VCARD_VERSION_2_1_SIZE; + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + + /* "N:\r\n" */ + if (*pVcardStruct->Name != '\0') { + memcpy(&pNDEFMessage[PayloadSize], VCARD_NAME, VCARD_NAME_STRING_SIZE); + PayloadSize += VCARD_NAME_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Name, strlen(pVcardStruct->Name)); + PayloadSize += strlen(pVcardStruct->Name); memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); PayloadSize += LIMIT_STRING_SIZE; - - /* "VERSION:2.1\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], VERSION, VERSION_STRING_SIZE); - PayloadSize += VERSION_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], VCARD_VERSION_2_1, VCARD_VERSION_2_1_SIZE); - PayloadSize += VCARD_VERSION_2_1_SIZE; + } + /* "FN:\r\n" */ + if (*pVcardStruct->FirstName != '\0') { + memcpy(&pNDEFMessage[PayloadSize], FIRSTNAME, FIRSTNAME_STRING_SIZE); + PayloadSize += FIRSTNAME_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->FirstName, strlen(pVcardStruct->FirstName)); + PayloadSize += strlen(pVcardStruct->FirstName); memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); PayloadSize += LIMIT_STRING_SIZE; - - /* "N:\r\n" */ - if (*pVcardStruct->Name != '\0') { - memcpy(&pNDEFMessage[PayloadSize], VCARD_NAME, VCARD_NAME_STRING_SIZE); - PayloadSize += VCARD_NAME_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Name, strlen(pVcardStruct->Name)); - PayloadSize += strlen(pVcardStruct->Name); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - /* "FN:\r\n" */ - if (*pVcardStruct->FirstName != '\0') { - memcpy(&pNDEFMessage[PayloadSize], FIRSTNAME, FIRSTNAME_STRING_SIZE); - PayloadSize += FIRSTNAME_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->FirstName, strlen(pVcardStruct->FirstName)); - PayloadSize += strlen(pVcardStruct->FirstName); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeTel != '\0') { - - /* "TEL;HOME:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], HOME_TEL, HOME_TEL_STRING_SIZE); - PayloadSize += HOME_TEL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeTel, strlen(pVcardStruct->HomeTel)); - PayloadSize += strlen(pVcardStruct->HomeTel); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkTel != '\0') { - - /* "TEL;WORK:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], WORK_TEL, WORK_TEL_STRING_SIZE); - PayloadSize += WORK_TEL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkTel, strlen(pVcardStruct->WorkTel)); - PayloadSize += strlen(pVcardStruct->WorkTel); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->CellTel != '\0') { - - /* "TEL;CELL:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], CELL_TEL, CELL_TEL_STRING_SIZE); - PayloadSize += CELL_TEL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->CellTel, strlen(pVcardStruct->CellTel)); - PayloadSize += strlen(pVcardStruct->CellTel); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeEmail != '\0') { - - /* "EMAIL;HOME:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], HOME_EMAIL, HOME_EMAIL_STRING_SIZE); - PayloadSize += HOME_EMAIL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeEmail, strlen(pVcardStruct->HomeEmail)); - PayloadSize += strlen(pVcardStruct->HomeEmail); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkEmail != '\0') { - - /* "EMAIL;WORK:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], WORK_EMAIL, WORK_EMAIL_STRING_SIZE); - PayloadSize += WORK_EMAIL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkEmail, strlen(pVcardStruct->WorkEmail)); - PayloadSize += strlen(pVcardStruct->WorkEmail); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeAddress != '\0') { - - /* "ADR;HOME:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], HOME_ADDRESS, HOME_ADDRESS_STRING_SIZE); - PayloadSize += HOME_ADDRESS_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeAddress, strlen(pVcardStruct->HomeAddress)); - PayloadSize += strlen(pVcardStruct->HomeAddress); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkAddress != '\0') { - - /* "ADR;WORK:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], WORK_ADDRESS, WORK_ADDRESS_STRING_SIZE); - PayloadSize += WORK_ADDRESS_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkAddress, strlen(pVcardStruct->WorkAddress)); - PayloadSize += strlen(pVcardStruct->WorkAddress); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Org != '\0') { - - /* "ORG:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], ORG, ORG_STRING_SIZE); - PayloadSize += ORG_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Org, strlen(pVcardStruct->Org)); - PayloadSize += strlen(pVcardStruct->Org); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Title != '\0') { - /* "TITLE:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], TITLE, TITLE_STRING_SIZE); - PayloadSize += TITLE_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Title, strlen(pVcardStruct->Title)); - PayloadSize += strlen(pVcardStruct->Title); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Url != '\0') { - /* "URL:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], URL, URL_STRING_SIZE); - PayloadSize += URL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Url, strlen(pVcardStruct->Url)); - PayloadSize += strlen(pVcardStruct->Url); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - - /* "END:VCARD\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], VCARD_END, VCARD_END_STRING_SIZE); - PayloadSize += VCARD_END_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], VCARD, VCARD_STRING_SIZE); - PayloadSize += VCARD_STRING_SIZE; - // memcpy( &pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE ); - // PayloadSize += LIMIT_STRING_SIZE; - - *size = (uint16_t)(PayloadSize); /* Must not count the 2 byte that represent the NDEF size */ - /* - PayloadSize -= 6 + VCARD_TYPE_STRING_LENGTH; - - pNDEFMessage[2] = (PayloadSize & 0xFF000000) >> 24; - pNDEFMessage[3] = (PayloadSize & 0x00FF0000) >> 16; - pNDEFMessage[4] = (PayloadSize & 0x0000FF00) >> 8; - pNDEFMessage[5] = PayloadSize & 0x000000FF; - */ + } + if (*pVcardStruct->HomeTel != '\0') { + + /* "TEL;HOME:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], HOME_TEL, HOME_TEL_STRING_SIZE); + PayloadSize += HOME_TEL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeTel, strlen(pVcardStruct->HomeTel)); + PayloadSize += strlen(pVcardStruct->HomeTel); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkTel != '\0') { + + /* "TEL;WORK:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], WORK_TEL, WORK_TEL_STRING_SIZE); + PayloadSize += WORK_TEL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkTel, strlen(pVcardStruct->WorkTel)); + PayloadSize += strlen(pVcardStruct->WorkTel); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->CellTel != '\0') { + + /* "TEL;CELL:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], CELL_TEL, CELL_TEL_STRING_SIZE); + PayloadSize += CELL_TEL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->CellTel, strlen(pVcardStruct->CellTel)); + PayloadSize += strlen(pVcardStruct->CellTel); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->HomeEmail != '\0') { + + /* "EMAIL;HOME:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], HOME_EMAIL, HOME_EMAIL_STRING_SIZE); + PayloadSize += HOME_EMAIL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeEmail, strlen(pVcardStruct->HomeEmail)); + PayloadSize += strlen(pVcardStruct->HomeEmail); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkEmail != '\0') { + + /* "EMAIL;WORK:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], WORK_EMAIL, WORK_EMAIL_STRING_SIZE); + PayloadSize += WORK_EMAIL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkEmail, strlen(pVcardStruct->WorkEmail)); + PayloadSize += strlen(pVcardStruct->WorkEmail); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->HomeAddress != '\0') { + + /* "ADR;HOME:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], HOME_ADDRESS, HOME_ADDRESS_STRING_SIZE); + PayloadSize += HOME_ADDRESS_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeAddress, strlen(pVcardStruct->HomeAddress)); + PayloadSize += strlen(pVcardStruct->HomeAddress); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkAddress != '\0') { + + /* "ADR;WORK:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], WORK_ADDRESS, WORK_ADDRESS_STRING_SIZE); + PayloadSize += WORK_ADDRESS_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkAddress, strlen(pVcardStruct->WorkAddress)); + PayloadSize += strlen(pVcardStruct->WorkAddress); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Org != '\0') { + + /* "ORG:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], ORG, ORG_STRING_SIZE); + PayloadSize += ORG_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Org, strlen(pVcardStruct->Org)); + PayloadSize += strlen(pVcardStruct->Org); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Title != '\0') { + /* "TITLE:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], TITLE, TITLE_STRING_SIZE); + PayloadSize += TITLE_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Title, strlen(pVcardStruct->Title)); + PayloadSize += strlen(pVcardStruct->Title); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Url != '\0') { + /* "URL:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], URL, URL_STRING_SIZE); + PayloadSize += URL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Url, strlen(pVcardStruct->Url)); + PayloadSize += strlen(pVcardStruct->Url); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + + /* "END:VCARD\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], VCARD_END, VCARD_END_STRING_SIZE); + PayloadSize += VCARD_END_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], VCARD, VCARD_STRING_SIZE); + PayloadSize += VCARD_STRING_SIZE; + // memcpy( &pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE ); + // PayloadSize += LIMIT_STRING_SIZE; + + *size = (uint16_t)(PayloadSize); /* Must not count the 2 byte that represent the NDEF size */ + /* + PayloadSize -= 6 + VCARD_TYPE_STRING_LENGTH; + + pNDEFMessage[2] = (PayloadSize & 0xFF000000) >> 24; + pNDEFMessage[3] = (PayloadSize & 0x00FF0000) >> 16; + pNDEFMessage[4] = (PayloadSize & 0x0000FF00) >> 8; + pNDEFMessage[5] = PayloadSize & 0x000000FF; + */ } @@ -487,37 +487,37 @@ void NDEF::NDEF_PrepareVcardMessage(sVcardInfo *pVcardStruct, uint8_t *pNDEFMess */ static uint8_t *from_base64(uint8_t *input64, uint32_t *binary) { - /* Read 4 base64 character & translate them into 3 bytes binary */ - *binary = 0; - uint8_t base64_6bits; - int i = 0; - while (i < 4) { - - if ((*input64 >= 'A') && (*input64 <= 'Z')) { - base64_6bits = *(input64++) - 'A'; - } else if ((*input64 >= 'a') && (*input64 <= 'z')) { - base64_6bits = *(input64++) - 'a' + 26; - } else if ((*input64 >= '0') && (*input64 <= '9')) { - base64_6bits = *(input64++) - '0' + 52; - } else if (*input64 == '+') { - base64_6bits = 62; - input64++; - } else if (*input64 == '/') { - base64_6bits = 63; - input64++; - } else if (*input64 == '=') { - base64_6bits = 0; - input64++; - } else { - input64++; - continue; - } - - *binary |= base64_6bits << (6 * (3 - i)); - i++; + /* Read 4 base64 character & translate them into 3 bytes binary */ + *binary = 0; + uint8_t base64_6bits; + int i = 0; + while (i < 4) { + + if ((*input64 >= 'A') && (*input64 <= 'Z')) { + base64_6bits = *(input64++) - 'A'; + } else if ((*input64 >= 'a') && (*input64 <= 'z')) { + base64_6bits = *(input64++) - 'a' + 26; + } else if ((*input64 >= '0') && (*input64 <= '9')) { + base64_6bits = *(input64++) - '0' + 52; + } else if (*input64 == '+') { + base64_6bits = 62; + input64++; + } else if (*input64 == '/') { + base64_6bits = 63; + input64++; + } else if (*input64 == '=') { + base64_6bits = 0; + input64++; + } else { + input64++; + continue; } - *binary = ((*binary & 0xFF0000) >> 16) | ((*binary & 0xFF) << 16) | (*binary & 0xFF00); - return input64; + + *binary |= base64_6bits << (6 * (3 - i)); + i++; + } + *binary = ((*binary & 0xFF0000) >> 16) | ((*binary & 0xFF) << 16) | (*binary & 0xFF00); + return input64; } @@ -529,41 +529,41 @@ static uint8_t *from_base64(uint8_t *input64, uint32_t *binary) */ int NDEF::NDEF_getVcardPicture(uint8_t *pPayload, uint32_t PayloadSize, uint8_t *pPict) { - uint8_t *pSrcPict; + uint8_t *pSrcPict; - /* Let's find the picture */ - pSrcPict = pPayload; - while (memcmp(pSrcPict, JPEG, JPEG_STRING_SIZE) && (pSrcPict < (pPayload + PayloadSize))) { - pSrcPict++; - } - while ((*pSrcPict != ':') && (pSrcPict < (pPayload + PayloadSize))) { - pSrcPict++; - } - /* Picture start at next char */ + /* Let's find the picture */ + pSrcPict = pPayload; + while (memcmp(pSrcPict, JPEG, JPEG_STRING_SIZE) && (pSrcPict < (pPayload + PayloadSize))) { pSrcPict++; - - - /* Word found */ - while (memcmp(pSrcPict, LIMIT, LIMIT_STRING_SIZE) && (pSrcPict < (pPayload + PayloadSize))) { - uint32_t binary24; - pSrcPict = from_base64(pSrcPict, &binary24); - /* copy the 3 bytes read from the base64 data */ - memcpy(pPict, &binary24, 3); - pPict += 3; - /* Ignore any line breaks */ - while (*pSrcPict == 0x0A) { - pSrcPict++; - } - } - - if (pSrcPict >= (pPayload + PayloadSize)) { - /* problem when parsing the picture */ - return 1; - } else { - /* picture found */ - return 0; - } + } + while ((*pSrcPict != ':') && (pSrcPict < (pPayload + PayloadSize))) { + pSrcPict++; + } + /* Picture start at next char */ + pSrcPict++; + + + /* Word found */ + while (memcmp(pSrcPict, LIMIT, LIMIT_STRING_SIZE) && (pSrcPict < (pPayload + PayloadSize))) { + uint32_t binary24; + pSrcPict = from_base64(pSrcPict, &binary24); + /* copy the 3 bytes read from the base64 data */ + memcpy(pPict, &binary24, 3); + pPict += 3; + /* Ignore any line breaks */ + while (*pSrcPict == 0x0A) { + pSrcPict++; + } + } + + if (pSrcPict >= (pPayload + PayloadSize)) { + /* problem when parsing the picture */ + return 1; + } else { + /* picture found */ + return 0; + } } /** diff --git a/src/libNDEF/lib_NDEF_Vcard.h b/src/libNDEF/lib_NDEF_Vcard.h index 7ee9b03..be8a40d 100755 --- a/src/libNDEF/lib_NDEF_Vcard.h +++ b/src/libNDEF/lib_NDEF_Vcard.h @@ -87,22 +87,22 @@ #define LIMIT_STRING_SIZE 2 typedef struct { - char Version [10]; - char Name[80]; - // TODO: rename FirstName into FormattedName - char FirstName[80]; - char Title[80]; - char Org[80]; - char HomeAddress[80]; - char WorkAddress[80]; - char Address[80]; - char HomeTel[40]; - char WorkTel[40]; - char CellTel[40]; - char HomeEmail[80]; - char WorkEmail[80]; - char Email[80]; - char Url[80]; + char Version [10]; + char Name[80]; + // TODO: rename FirstName into FormattedName + char FirstName[80]; + char Title[80]; + char Org[80]; + char HomeAddress[80]; + char WorkAddress[80]; + char Address[80]; + char HomeTel[40]; + char WorkTel[40]; + char CellTel[40]; + char HomeEmail[80]; + char WorkEmail[80]; + char Email[80]; + char Url[80]; } sVcardInfo; #endif /* __LIB_NDEF_VCARD_H */ diff --git a/src/libNDEF/lib_NDEF_Wifi.cpp b/src/libNDEF/lib_NDEF_Wifi.cpp index 143a6e1..c1a0ed6 100755 --- a/src/libNDEF/lib_NDEF_Wifi.cpp +++ b/src/libNDEF/lib_NDEF_Wifi.cpp @@ -105,55 +105,55 @@ */ void NDEF::NDEF_FillWifiTokenStruct(uint8_t *pPayload, uint32_t PayloadSize, sWifiTokenInfo *pWifiTokenStruct) { - uint8_t *pLastByteAdd, data1, data2, *temp, *temp_br ; - uint16_t SSIDLen, NetWorkKeyLen; - uint8_t *dbg, dbg1; - - - pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); - pPayload--; - - while (pPayload++ != pLastByteAdd) { - uint8_t attribute = *pPayload; - temp_br = pPayload; - switch (attribute) { - - case ATTRIBUTE_ID_SSID_LSB: - temp = pPayload; - dbg = temp; - dbg1 = *++dbg; - if (dbg1 == ATTRIBUTE_ID_SSID_MSB) { - data1 = *++dbg; - data2 = *++dbg; - SSIDLen = data1; - SSIDLen = SSIDLen << 8; - SSIDLen |= data2; - pPayload += 4; - memcpy(pWifiTokenStruct->NetworkSSID, pPayload, SSIDLen); - /* add end of string character */ - pWifiTokenStruct->NetworkSSID[SSIDLen] = '\0'; - pPayload += SSIDLen - 1; - } else if (dbg1 == ATTRIBUTE_ID_NETWORK_MSB) { - data1 = *++dbg; - data2 = *++dbg; - NetWorkKeyLen = data1; - NetWorkKeyLen = NetWorkKeyLen << 8; - NetWorkKeyLen |= data2; - pPayload += 4; - memcpy(pWifiTokenStruct->NetworkKey, pPayload, NetWorkKeyLen); - /* add end of string character */ - pWifiTokenStruct->NetworkKey[NetWorkKeyLen] = '\0'; - pPayload += NetWorkKeyLen - 1; - } else { - pPayload = temp_br; - } - - break; - - default : - ; + uint8_t *pLastByteAdd, data1, data2, *temp, *temp_br ; + uint16_t SSIDLen, NetWorkKeyLen; + uint8_t *dbg, dbg1; + + + pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); + pPayload--; + + while (pPayload++ != pLastByteAdd) { + uint8_t attribute = *pPayload; + temp_br = pPayload; + switch (attribute) { + + case ATTRIBUTE_ID_SSID_LSB: + temp = pPayload; + dbg = temp; + dbg1 = *++dbg; + if (dbg1 == ATTRIBUTE_ID_SSID_MSB) { + data1 = *++dbg; + data2 = *++dbg; + SSIDLen = data1; + SSIDLen = SSIDLen << 8; + SSIDLen |= data2; + pPayload += 4; + memcpy(pWifiTokenStruct->NetworkSSID, pPayload, SSIDLen); + /* add end of string character */ + pWifiTokenStruct->NetworkSSID[SSIDLen] = '\0'; + pPayload += SSIDLen - 1; + } else if (dbg1 == ATTRIBUTE_ID_NETWORK_MSB) { + data1 = *++dbg; + data2 = *++dbg; + NetWorkKeyLen = data1; + NetWorkKeyLen = NetWorkKeyLen << 8; + NetWorkKeyLen |= data2; + pPayload += 4; + memcpy(pWifiTokenStruct->NetworkKey, pPayload, NetWorkKeyLen); + /* add end of string character */ + pWifiTokenStruct->NetworkKey[NetWorkKeyLen] = '\0'; + pPayload += NetWorkKeyLen - 1; + } else { + pPayload = temp_br; } + + break; + + default : + ; } + } } @@ -165,17 +165,17 @@ void NDEF::NDEF_FillWifiTokenStruct(uint8_t *pPayload, uint32_t PayloadSize, sWi */ void NDEF::NDEF_Read_WifiToken(struct sRecordInfo *pRecordStruct, sWifiTokenInfo *pWifiTokenStruct) { - uint8_t *pPayload; - uint32_t PayloadSize; + uint8_t *pPayload; + uint32_t PayloadSize; - PayloadSize = pRecordStruct->PayloadLength; + PayloadSize = pRecordStruct->PayloadLength; - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - if (pRecordStruct->NDEF_Type == URI_WIFITOKEN_TYPE) { - NDEF_FillWifiTokenStruct(pPayload, PayloadSize, pWifiTokenStruct); - } + if (pRecordStruct->NDEF_Type == URI_WIFITOKEN_TYPE) { + NDEF_FillWifiTokenStruct(pPayload, PayloadSize, pWifiTokenStruct); + } } @@ -189,14 +189,14 @@ void NDEF::NDEF_Read_WifiToken(struct sRecordInfo *pRecordStruct, sWifiTokenInfo */ uint16_t NDEF::NDEF_ReadWifiToken(struct sRecordInfo *pRecordStruct, sWifiTokenInfo *pWifiTokenStruct) { - uint16_t status = NDEF_ERROR; + uint16_t status = NDEF_ERROR; - if (pRecordStruct->NDEF_Type == URI_WIFITOKEN_TYPE) { - NDEF_Read_WifiToken(pRecordStruct, pWifiTokenStruct); - status = NDEF_OK; - } + if (pRecordStruct->NDEF_Type == URI_WIFITOKEN_TYPE) { + NDEF_Read_WifiToken(pRecordStruct, pWifiTokenStruct); + status = NDEF_OK; + } - return status; + return status; } @@ -208,144 +208,144 @@ uint16_t NDEF::NDEF_ReadWifiToken(struct sRecordInfo *pRecordStruct, sWifiTokenI */ uint16_t NDEF::NDEF_WriteWifiToken(sWifiTokenInfo *pWifiTokenStruct) { - uint16_t status = NDEF_ERROR; - uint8_t *pPayload, initStage = 0; - uint16_t DataSize; - uint32_t PayloadSize, SSIDSize, SSIDKeySize; - - if (pWifiTokenStruct->NetworkKey[0] == '\0') { - /* Empty network key is not supported by Phones */ - strcpy(pWifiTokenStruct->NetworkKey, NDEF_WIFI_DEFAULT_NETWORK_KEY); - } - - uint8_t configToken1[] = {0x10, 0x4A, /* Attribute ID : Version*/ - 0x00, 0x01, /* Attribute ID Length*/ - 0x10, /* Version 1.0*/ - 0x10, 0x0E, /* Attribute ID Credential*/ - 0x00, 0x48, /* Attribute ID Length*/ - 0x10, 0x26, /* Attribute ID : Network Index*/ - 0x00, 0x01, /* Attribute Length*/ - 0x01, /* Index */ - 0x10, 0x45, /* Attribute ID :SSID*/ - - }; - - /* Fill SSID length + SSID between configToken1 and configToken3*/ - - uint8_t configToken3[] = {0x10, 0x03, /* Attribute ID :Authentication Type*/ - 0x00, 0x02, /* Attribute Length*/ - 0x00, 0x01, /* Attribute Type : Open*/ - 0x10, 0x0F, /* Attribute ID : Encryption Type*/ - 0x00, 0x02, /* Attribute Length*/ - 0x00, 0x01, /* Encryption Type : None*/ - 0x10, 0x27 - }; /* Attribute ID : Network Key */ - - - /*Fill SSID KEY Length and SSID Key between configToken3 and configToken5*/ - - uint8_t configToken5[] = {0x10, 0x20, /* Attribute ID : MAC Address */ - 0x00, 0x06, /* Attribute Length*/ - 0, /*MAC-ADDRESS*/ - 0, /*MAC-ADDRESS*/ - 0, /*MAC-ADDRESS*/ - 0, /*MAC-ADDRESS*/ - 0, /*MAC-ADDRESS*/ - 0, /*MAC-ADDRESS*/ - 0x10, 0x49, /* Attribute ID : Vendor Extension */ - 0x00, 0x06, /* Attribute Length*/ - 0x00, 0x37, 0x2A, /* Vendor ID:WFA*/ - 0x02, /* Subelement ID:Network Key Shareable*/ - 0x01, /* Subelement Length*/ - 0x01, /*Network Key Shareable : TRUE*/ - 0x10, 0x49, /* Attribute ID : Vendor Extension */ - 0x00, 0x06, /* Attribute Length*/ - 0x00, 0x37, 0x2A, /* Vendor ID:WFA*/ - 0x00, /* Subelement ID:Version2*/ - 0x01, /* Subelement Length:1*/ - 0x20 /* Version2*/ - }; - - - /* Set size of the tokens */ - const uint32_t CONFIG_TOKEN_1 = sizeof(configToken1); - const uint32_t CONFIG_TOKEN_3 = sizeof(configToken3); - const uint32_t CONFIG_TOKEN_5 = sizeof(configToken5); - - /* Update Token3 for Authentication & Encryption Types, their default value is coded in token3 */ - configToken3[CONFIG_TOKEN_3_AUTHENTICATION_TYPE_INDEX] = pWifiTokenStruct->AuthenticationType & 0xFF; - configToken3[CONFIG_TOKEN_3_ENCRYPTION_TYPE_INDEX] = pWifiTokenStruct->EncryptionType & 0xFF; - - /* fill Wifi record header */ - NDEF_Buffer[FIRST_RECORD_OFFSET] = 0xD2; /* Record Flag */ - NDEF_Buffer[FIRST_RECORD_OFFSET + 1] = WIFITOKEN_TYPE_STRING_LENGTH; - NDEF_Buffer[FIRST_RECORD_OFFSET + 2] = 76; /* needs to be autocalculated - done at the end */ - - memcpy(&NDEF_Buffer[FIRST_RECORD_OFFSET + 3], WIFITOKEN_TYPE_STRING, WIFITOKEN_TYPE_STRING_LENGTH); - - pPayload = &NDEF_Buffer[FIRST_RECORD_OFFSET + 3 + WIFITOKEN_TYPE_STRING_LENGTH]; - PayloadSize = 0; - - /* Compute credential length */ - - uint16_t credential_length = 5 + // Network index - 4 + // SSID type + length - strlen(pWifiTokenStruct->NetworkSSID) + // SSID - CONFIG_TOKEN_3 + - 2 + // Network key length - strlen(pWifiTokenStruct->NetworkKey) + // Network KEY - CONFIG_TOKEN_5; - - /* update credential length */ - configToken1[CONFIG_TOKEN_1_CREDENTIAL_LENGTH_INDEX + 1] = credential_length & 0xff; - configToken1[CONFIG_TOKEN_1_CREDENTIAL_LENGTH_INDEX] = credential_length >> 8; - - - for (initStage = 0; initStage < CONFIG_TOKEN_1; initStage++) { - *pPayload = configToken1[initStage]; - pPayload++; - } - - /*Fill SSID length and SSID value*/ - SSIDSize = strlen(pWifiTokenStruct->NetworkSSID); - *pPayload = 0x00; - pPayload++; - *pPayload = SSIDSize & 0x000000FF; + uint16_t status = NDEF_ERROR; + uint8_t *pPayload, initStage = 0; + uint16_t DataSize; + uint32_t PayloadSize, SSIDSize, SSIDKeySize; + + if (pWifiTokenStruct->NetworkKey[0] == '\0') { + /* Empty network key is not supported by Phones */ + strcpy(pWifiTokenStruct->NetworkKey, NDEF_WIFI_DEFAULT_NETWORK_KEY); + } + + uint8_t configToken1[] = {0x10, 0x4A, /* Attribute ID : Version*/ + 0x00, 0x01, /* Attribute ID Length*/ + 0x10, /* Version 1.0*/ + 0x10, 0x0E, /* Attribute ID Credential*/ + 0x00, 0x48, /* Attribute ID Length*/ + 0x10, 0x26, /* Attribute ID : Network Index*/ + 0x00, 0x01, /* Attribute Length*/ + 0x01, /* Index */ + 0x10, 0x45, /* Attribute ID :SSID*/ + + }; + + /* Fill SSID length + SSID between configToken1 and configToken3*/ + + uint8_t configToken3[] = {0x10, 0x03, /* Attribute ID :Authentication Type*/ + 0x00, 0x02, /* Attribute Length*/ + 0x00, 0x01, /* Attribute Type : Open*/ + 0x10, 0x0F, /* Attribute ID : Encryption Type*/ + 0x00, 0x02, /* Attribute Length*/ + 0x00, 0x01, /* Encryption Type : None*/ + 0x10, 0x27 + }; /* Attribute ID : Network Key */ + + + /*Fill SSID KEY Length and SSID Key between configToken3 and configToken5*/ + + uint8_t configToken5[] = {0x10, 0x20, /* Attribute ID : MAC Address */ + 0x00, 0x06, /* Attribute Length*/ + 0, /*MAC-ADDRESS*/ + 0, /*MAC-ADDRESS*/ + 0, /*MAC-ADDRESS*/ + 0, /*MAC-ADDRESS*/ + 0, /*MAC-ADDRESS*/ + 0, /*MAC-ADDRESS*/ + 0x10, 0x49, /* Attribute ID : Vendor Extension */ + 0x00, 0x06, /* Attribute Length*/ + 0x00, 0x37, 0x2A, /* Vendor ID:WFA*/ + 0x02, /* Subelement ID:Network Key Shareable*/ + 0x01, /* Subelement Length*/ + 0x01, /*Network Key Shareable : TRUE*/ + 0x10, 0x49, /* Attribute ID : Vendor Extension */ + 0x00, 0x06, /* Attribute Length*/ + 0x00, 0x37, 0x2A, /* Vendor ID:WFA*/ + 0x00, /* Subelement ID:Version2*/ + 0x01, /* Subelement Length:1*/ + 0x20 /* Version2*/ + }; + + + /* Set size of the tokens */ + const uint32_t CONFIG_TOKEN_1 = sizeof(configToken1); + const uint32_t CONFIG_TOKEN_3 = sizeof(configToken3); + const uint32_t CONFIG_TOKEN_5 = sizeof(configToken5); + + /* Update Token3 for Authentication & Encryption Types, their default value is coded in token3 */ + configToken3[CONFIG_TOKEN_3_AUTHENTICATION_TYPE_INDEX] = pWifiTokenStruct->AuthenticationType & 0xFF; + configToken3[CONFIG_TOKEN_3_ENCRYPTION_TYPE_INDEX] = pWifiTokenStruct->EncryptionType & 0xFF; + + /* fill Wifi record header */ + NDEF_Buffer[FIRST_RECORD_OFFSET] = 0xD2; /* Record Flag */ + NDEF_Buffer[FIRST_RECORD_OFFSET + 1] = WIFITOKEN_TYPE_STRING_LENGTH; + NDEF_Buffer[FIRST_RECORD_OFFSET + 2] = 76; /* needs to be autocalculated - done at the end */ + + memcpy(&NDEF_Buffer[FIRST_RECORD_OFFSET + 3], WIFITOKEN_TYPE_STRING, WIFITOKEN_TYPE_STRING_LENGTH); + + pPayload = &NDEF_Buffer[FIRST_RECORD_OFFSET + 3 + WIFITOKEN_TYPE_STRING_LENGTH]; + PayloadSize = 0; + + /* Compute credential length */ + + uint16_t credential_length = 5 + // Network index + 4 + // SSID type + length + strlen(pWifiTokenStruct->NetworkSSID) + // SSID + CONFIG_TOKEN_3 + + 2 + // Network key length + strlen(pWifiTokenStruct->NetworkKey) + // Network KEY + CONFIG_TOKEN_5; + + /* update credential length */ + configToken1[CONFIG_TOKEN_1_CREDENTIAL_LENGTH_INDEX + 1] = credential_length & 0xff; + configToken1[CONFIG_TOKEN_1_CREDENTIAL_LENGTH_INDEX] = credential_length >> 8; + + + for (initStage = 0; initStage < CONFIG_TOKEN_1; initStage++) { + *pPayload = configToken1[initStage]; pPayload++; + } - strcpy((char *)pPayload, pWifiTokenStruct->NetworkSSID); - pPayload = pPayload + strlen(pWifiTokenStruct->NetworkSSID); + /*Fill SSID length and SSID value*/ + SSIDSize = strlen(pWifiTokenStruct->NetworkSSID); + *pPayload = 0x00; + pPayload++; + *pPayload = SSIDSize & 0x000000FF; + pPayload++; - for (initStage = 0; initStage < CONFIG_TOKEN_3; initStage++) { - *pPayload = configToken3[initStage]; - pPayload++; - } + strcpy((char *)pPayload, pWifiTokenStruct->NetworkSSID); + pPayload = pPayload + strlen(pWifiTokenStruct->NetworkSSID); - /* Fill the SSIDKey length and SSIDKey value */ - SSIDKeySize = strlen(pWifiTokenStruct->NetworkKey); - *pPayload = 0x00; - pPayload++; - *pPayload = SSIDKeySize & 0x000000FF; + for (initStage = 0; initStage < CONFIG_TOKEN_3; initStage++) { + *pPayload = configToken3[initStage]; pPayload++; + } - memcpy((char *)pPayload, pWifiTokenStruct->NetworkKey, SSIDKeySize); - pPayload = pPayload + SSIDKeySize; + /* Fill the SSIDKey length and SSIDKey value */ + SSIDKeySize = strlen(pWifiTokenStruct->NetworkKey); + *pPayload = 0x00; + pPayload++; + *pPayload = SSIDKeySize & 0x000000FF; + pPayload++; - for (initStage = 0; initStage < CONFIG_TOKEN_5; initStage++) { - *pPayload = configToken5[initStage]; - pPayload++; - } + memcpy((char *)pPayload, pWifiTokenStruct->NetworkKey, SSIDKeySize); + pPayload = pPayload + SSIDKeySize; + + for (initStage = 0; initStage < CONFIG_TOKEN_5; initStage++) { + *pPayload = configToken5[initStage]; + pPayload++; + } - PayloadSize += CONFIG_TOKEN_1 + CONFIG_TOKEN_3 + CONFIG_TOKEN_5 + SSIDSize + SSIDKeySize + 4 ; // +4 is for SSID & Key length fields + PayloadSize += CONFIG_TOKEN_1 + CONFIG_TOKEN_3 + CONFIG_TOKEN_5 + SSIDSize + SSIDKeySize + 4 ; // +4 is for SSID & Key length fields - NDEF_Buffer[FIRST_RECORD_OFFSET + 2] = (PayloadSize & 0x000000FF); + NDEF_Buffer[FIRST_RECORD_OFFSET + 2] = (PayloadSize & 0x000000FF); - DataSize = PayloadSize + 3 + WIFITOKEN_TYPE_STRING_LENGTH; + DataSize = PayloadSize + 3 + WIFITOKEN_TYPE_STRING_LENGTH; - /* Write NDEF */ - status = NDEF_WriteNDEF(DataSize, NDEF_Buffer); + /* Write NDEF */ + status = NDEF_WriteNDEF(DataSize, NDEF_Buffer); - return status; + return status; } diff --git a/src/libNDEF/lib_NDEF_Wifi.h b/src/libNDEF/lib_NDEF_Wifi.h index 683f99f..71f2dd6 100755 --- a/src/libNDEF/lib_NDEF_Wifi.h +++ b/src/libNDEF/lib_NDEF_Wifi.h @@ -70,29 +70,29 @@ #define NDEF_WIFI_DEFAULT_NETWORK_KEY "00000000" typedef enum { - NDEF_WIFI_ENCRYPTION_NONE = 0x0001, /**< WPS No Encryption */ - NDEF_WIFI_ENCRYPTION_WEP = 0x0002, /**< WPS Encryption based on WEP */ - NDEF_WIFI_ENCRYPTION_TKIP = 0x0004, /**< WPS Encryption based on TKIP */ - NDEF_WIFI_ENCRYPTION_AES = 0x0008 /**< WPS Encryption based on AES */ + NDEF_WIFI_ENCRYPTION_NONE = 0x0001, /**< WPS No Encryption */ + NDEF_WIFI_ENCRYPTION_WEP = 0x0002, /**< WPS Encryption based on WEP */ + NDEF_WIFI_ENCRYPTION_TKIP = 0x0004, /**< WPS Encryption based on TKIP */ + NDEF_WIFI_ENCRYPTION_AES = 0x0008 /**< WPS Encryption based on AES */ } Ndef_Wifi_Encryption_t; typedef enum { - NDEF_WIFI_AUTHENTICATION_NONE = 0x0001, /**< WPS No Authentication */ - NDEF_WIFI_AUTHENTICATION_WPAPSK = 0x0002, /**< WPS Authentication based on WPAPSK */ - NDEF_WIFI_AUTHENTICATION_SHARED = 0x0004, /**< WPS Authentication based on WEP Shared Key */ - NDEF_WIFI_AUTHENTICATION_WPA = 0x0008, /**< WPS Authentication based on WPA */ - NDEF_WIFI_AUTHENTICATION_WPA2 = 0x0010, /**< WPS Authentication based on WPA2 */ - NDEF_WIFI_AUTHENTICATION_WPA2PSK = 0x0020 /**< WPS Authentication based on WPA2PSK */ + NDEF_WIFI_AUTHENTICATION_NONE = 0x0001, /**< WPS No Authentication */ + NDEF_WIFI_AUTHENTICATION_WPAPSK = 0x0002, /**< WPS Authentication based on WPAPSK */ + NDEF_WIFI_AUTHENTICATION_SHARED = 0x0004, /**< WPS Authentication based on WEP Shared Key */ + NDEF_WIFI_AUTHENTICATION_WPA = 0x0008, /**< WPS Authentication based on WPA */ + NDEF_WIFI_AUTHENTICATION_WPA2 = 0x0010, /**< WPS Authentication based on WPA2 */ + NDEF_WIFI_AUTHENTICATION_WPA2PSK = 0x0020 /**< WPS Authentication based on WPA2PSK */ } Ndef_Wifi_Authentication_t; /** * @brief WifiToken structure, to store Network SSID, Authentication Type, Encryption Type and Network Key. */ typedef struct { - char NetworkSSID[32]; /**< Store the Network SSID. */ - Ndef_Wifi_Authentication_t AuthenticationType; /**< Store the Authentication type to be used. */ - Ndef_Wifi_Encryption_t EncryptionType; /**< Store the Encryption to be used. */ - char NetworkKey[32]; /**< Store the Network Key. */ + char NetworkSSID[32]; /**< Store the Network SSID. */ + Ndef_Wifi_Authentication_t AuthenticationType; /**< Store the Authentication type to be used. */ + Ndef_Wifi_Encryption_t EncryptionType; /**< Store the Encryption to be used. */ + char NetworkKey[32]; /**< Store the Network Key. */ } sWifiTokenInfo; diff --git a/src/libNDEF/tagtype5_wrapper.cpp b/src/libNDEF/tagtype5_wrapper.cpp index b725f06..c366ccb 100755 --- a/src/libNDEF/tagtype5_wrapper.cpp +++ b/src/libNDEF/tagtype5_wrapper.cpp @@ -80,7 +80,7 @@ */ uint16_t NDEF::NfcTag_ReadNDEF(uint8_t *pData) { - return NfcTag_ReadNDEF(pData, NDEF_MAX_SIZE); + return NfcTag_ReadNDEF(pData, NDEF_MAX_SIZE); } /** @@ -93,50 +93,50 @@ uint16_t NDEF::NfcTag_ReadNDEF(uint8_t *pData) */ uint16_t NDEF::NfcTag_ReadNDEF(uint8_t *pData, uint16_t bufferLength) { - uint16_t status = NDEF_ERROR; - TT5_TLV_t tlv; - uint8_t tlv_size = 0; - uint16_t DataLength; - - /* Detect NDEF message in memory */ - status = NfcType5_NDEFDetection(); - if (status != NDEF_OK) { - return status; + uint16_t status = NDEF_ERROR; + TT5_TLV_t tlv; + uint8_t tlv_size = 0; + uint16_t DataLength; + + /* Detect NDEF message in memory */ + status = NfcType5_NDEFDetection(); + if (status != NDEF_OK) { + return status; + } + + /* Read TL of Type 5 */ + status = mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)); + if (status != NDEF_OK) { + return status; + } + + /* Check if L is on 3 or 1 byte and update length in buffer */ + if (tlv.Length == NFCT5_3_BYTES_L_TLV) { + tlv_size = 4; + DataLength = ((tlv.Length16 >> 8) & 0xff) | ((tlv.Length16 & 0xff) << 8); + } else { + tlv_size = 2; + DataLength = tlv.Length; + } + + /* If too many data to write return error */ + if (DataLength > bufferLength) { + return NDEF_ERROR_MEMORY_INTERNAL; + } + + /* Check CC file is in the correct mode to proceed */ + if (CCFileStruct.State == TT5_INITIALIZED) { + return NDEF_ERROR; + } + + if (DataLength > 0) { + /* Read NDEF */ + if (mydev->ST25DV_i2c_ReadData((pData), CCFileStruct.NDEF_offset + tlv_size, DataLength) != NFCTAG_OK) { + return NDEF_ERROR; } + } - /* Read TL of Type 5 */ - status = mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)); - if (status != NDEF_OK) { - return status; - } - - /* Check if L is on 3 or 1 byte and update length in buffer */ - if (tlv.Length == NFCT5_3_BYTES_L_TLV) { - tlv_size = 4; - DataLength = ((tlv.Length16 >> 8) & 0xff) | ((tlv.Length16 & 0xff) << 8); - } else { - tlv_size = 2; - DataLength = tlv.Length; - } - - /* If too many data to write return error */ - if (DataLength > bufferLength) { - return NDEF_ERROR_MEMORY_INTERNAL; - } - - /* Check CC file is in the correct mode to proceed */ - if (CCFileStruct.State == TT5_INITIALIZED) { - return NDEF_ERROR; - } - - if (DataLength > 0) { - /* Read NDEF */ - if (mydev->ST25DV_i2c_ReadData((pData), CCFileStruct.NDEF_offset + tlv_size, DataLength) != NFCTAG_OK) { - return NDEF_ERROR; - } - } - - return NDEF_OK; + return NDEF_OK; } /** @@ -151,63 +151,63 @@ uint16_t NDEF::NfcTag_ReadNDEF(uint8_t *pData, uint16_t bufferLength) */ uint16_t NDEF::NfcTag_WriteData(uint8_t Type, uint16_t Length, uint8_t *pData) { - TT5_TLV_t tlv; - uint8_t tlv_size; - uint32_t offset; - uint8_t NfcT5_Terminator = NFCT5_TERMINATOR_TLV; - ST25DV_MEM_SIZE mem_size_reg; - - if (mydev->ST25DV_i2c_ReadMemSize(&mem_size_reg) != NDEF_OK) { - return NDEF_ERROR; - } - uint32_t mem_size = (mem_size_reg.BlockSize + 1) * (mem_size_reg.Mem_Size + 1); - - uint32_t max_length = mem_size /* Memory size */ - - ((Length >= 0xFF) ? 4 : 2) /* - TLV length */ - - sizeof(NfcT5_Terminator) /* - Terminator TLV */ - - CCFileStruct.NDEF_offset; /* - CCfile length */ - - /* If too many data to write return error */ - if (Length > max_length) { - return NDEF_ERROR_MEMORY_TAG; - } - - /* Detect NDEF message in memory */ - if (NfcType5_NDEFDetection() != NDEF_OK) { - return NDEF_ERROR; - } - - /* Prepare TLV */ - tlv.Type = Type; - if (Length >= 0xFF) { - tlv.Length = NFCT5_3_BYTES_L_TLV; - tlv.Length16 = ((Length & 0xff) << 8) | ((Length >> 8) & 0xff) ; - tlv_size = 4; - - } else { - tlv.Length = Length; - tlv_size = 2; - } - - offset = CCFileStruct.NDEF_offset; - /* Start write TLV to EEPROM */ - if (mydev->ST25DV_i2c_WriteData((uint8_t *)&tlv, offset, tlv_size) != NFCTAG_OK) { - return NDEF_ERROR; - } - offset += tlv_size; - - /* Continue write TLV data to EEPROM */ - if (mydev->ST25DV_i2c_WriteData(pData, offset, Length) != NFCTAG_OK) { - return NDEF_ERROR; - } - offset += Length; - - /* Write Terminator TLV */ - if (mydev->ST25DV_i2c_WriteData(&NfcT5_Terminator, offset, sizeof(NfcT5_Terminator)) != NFCTAG_OK) { - return NDEF_ERROR; - } - - return NDEF_OK; + TT5_TLV_t tlv; + uint8_t tlv_size; + uint32_t offset; + uint8_t NfcT5_Terminator = NFCT5_TERMINATOR_TLV; + ST25DV_MEM_SIZE mem_size_reg; + + if (mydev->ST25DV_i2c_ReadMemSize(&mem_size_reg) != NDEF_OK) { + return NDEF_ERROR; + } + uint32_t mem_size = (mem_size_reg.BlockSize + 1) * (mem_size_reg.Mem_Size + 1); + + uint32_t max_length = mem_size /* Memory size */ + - ((Length >= 0xFF) ? 4 : 2) /* - TLV length */ + - sizeof(NfcT5_Terminator) /* - Terminator TLV */ + - CCFileStruct.NDEF_offset; /* - CCfile length */ + + /* If too many data to write return error */ + if (Length > max_length) { + return NDEF_ERROR_MEMORY_TAG; + } + + /* Detect NDEF message in memory */ + if (NfcType5_NDEFDetection() != NDEF_OK) { + return NDEF_ERROR; + } + + /* Prepare TLV */ + tlv.Type = Type; + if (Length >= 0xFF) { + tlv.Length = NFCT5_3_BYTES_L_TLV; + tlv.Length16 = ((Length & 0xff) << 8) | ((Length >> 8) & 0xff) ; + tlv_size = 4; + + } else { + tlv.Length = Length; + tlv_size = 2; + } + + offset = CCFileStruct.NDEF_offset; + /* Start write TLV to EEPROM */ + if (mydev->ST25DV_i2c_WriteData((uint8_t *)&tlv, offset, tlv_size) != NFCTAG_OK) { + return NDEF_ERROR; + } + offset += tlv_size; + + /* Continue write TLV data to EEPROM */ + if (mydev->ST25DV_i2c_WriteData(pData, offset, Length) != NFCTAG_OK) { + return NDEF_ERROR; + } + offset += Length; + + /* Write Terminator TLV */ + if (mydev->ST25DV_i2c_WriteData(&NfcT5_Terminator, offset, sizeof(NfcT5_Terminator)) != NFCTAG_OK) { + return NDEF_ERROR; + } + + return NDEF_OK; } @@ -222,7 +222,7 @@ uint16_t NDEF::NfcTag_WriteData(uint8_t Type, uint16_t Length, uint8_t *pData) */ uint16_t NDEF::NfcTag_WriteNDEF(uint16_t Length, uint8_t *pData) { - return NfcTag_WriteData(NFCT5_NDEF_MSG_TLV, Length, pData); + return NfcTag_WriteData(NFCT5_NDEF_MSG_TLV, Length, pData); } /** @@ -236,7 +236,7 @@ uint16_t NDEF::NfcTag_WriteNDEF(uint16_t Length, uint8_t *pData) */ uint16_t NDEF::NfcTag_WriteProprietary(uint16_t Length, uint8_t *pData) { - return NfcTag_WriteData(NFCT5_PROPRIETARY_TLV, Length, pData); + return NfcTag_WriteData(NFCT5_PROPRIETARY_TLV, Length, pData); } @@ -248,21 +248,21 @@ uint16_t NDEF::NfcTag_WriteProprietary(uint16_t Length, uint8_t *pData) */ uint16_t NDEF::NfcType5_WriteCCFile(const uint8_t *const pCCBuffer) { - NFCTAG_StatusTypeDef ret_value; + NFCTAG_StatusTypeDef ret_value; - /* Write first block of CCFile */ - ret_value = mydev->ST25DV_i2c_WriteData(pCCBuffer, 0x00, 0x4); + /* Write first block of CCFile */ + ret_value = mydev->ST25DV_i2c_WriteData(pCCBuffer, 0x00, 0x4); - /* If extended memory writes the next 4 bytes */ - if ((pCCBuffer[2] == 0x00) && (ret_value == NFCTAG_OK)) { - ret_value = mydev->ST25DV_i2c_WriteData(pCCBuffer + 4, 0x04, 4); - } + /* If extended memory writes the next 4 bytes */ + if ((pCCBuffer[2] == 0x00) && (ret_value == NFCTAG_OK)) { + ret_value = mydev->ST25DV_i2c_WriteData(pCCBuffer + 4, 0x04, 4); + } - if (ret_value != NFCTAG_OK) { - return NDEF_ERROR; - } + if (ret_value != NFCTAG_OK) { + return NDEF_ERROR; + } - return NDEF_OK; + return NDEF_OK; } /** @@ -273,21 +273,21 @@ uint16_t NDEF::NfcType5_WriteCCFile(const uint8_t *const pCCBuffer) */ uint16_t NDEF::NfcType5_ReadCCFile(uint8_t *const pCCBuffer) { - NFCTAG_StatusTypeDef ret_value; + NFCTAG_StatusTypeDef ret_value; - /* Read 4 bytes of CC File */ - ret_value = mydev->ST25DV_i2c_ReadData(pCCBuffer, 0x00, 4); + /* Read 4 bytes of CC File */ + ret_value = mydev->ST25DV_i2c_ReadData(pCCBuffer, 0x00, 4); - /* If extended memory reads the next 4 bytes */ - if ((pCCBuffer[2] == 0x00) && (ret_value == NFCTAG_OK)) { - ret_value = mydev->ST25DV_i2c_ReadData(pCCBuffer + 4, 0x04, 4); - } + /* If extended memory reads the next 4 bytes */ + if ((pCCBuffer[2] == 0x00) && (ret_value == NFCTAG_OK)) { + ret_value = mydev->ST25DV_i2c_ReadData(pCCBuffer + 4, 0x04, 4); + } - if (ret_value != NFCTAG_OK) { - return NDEF_ERROR; - } + if (ret_value != NFCTAG_OK) { + return NDEF_ERROR; + } - return NDEF_OK; + return NDEF_OK; } /** @@ -298,47 +298,47 @@ uint16_t NDEF::NfcType5_ReadCCFile(uint8_t *const pCCBuffer) */ uint16_t NDEF::NfcType5_TT5Init(void) { - NFCTAG_StatusTypeDef ret_value = NFCTAG_OK; - uint16_t status; - uint8_t accbuffer[8]; - uint8_t cdata; - - /* Prepare buffer to update CCFile */ - accbuffer[0] = CCFileStruct.MagicNumber; - accbuffer[1] = CCFileStruct.Version; - accbuffer[2] = CCFileStruct.MemorySize; - accbuffer[3] = CCFileStruct.TT5Tag; - CCFileStruct.NDEF_offset = 0x04; - - /* If extended memory prepare the length bytes */ - if (CCFileStruct.MemorySize == NFCT5_EXTENDED_CCFILE) { - accbuffer[6] = (uint8_t)(CCFileStruct.ExtMemorySize >> 8); - accbuffer[7] = (uint8_t)(CCFileStruct.ExtMemorySize & 0xFF); - CCFileStruct.NDEF_offset = 0x08; - } - - /* Update CCFile */ - status = NfcType5_WriteCCFile(accbuffer); - if (status != NDEF_OK) { - return status; - } - - /* Update NDEF TLV for INITIALIZED state */ - /* Update T */ - cdata = NFCT5_NDEF_MSG_TLV; - ret_value = mydev->ST25DV_i2c_WriteData(&cdata, CCFileStruct.NDEF_offset, 1); - if (ret_value != NFCTAG_OK) { - return NDEF_ERROR; - } - - /* Update L */ - cdata = 0x00; - ret_value = mydev->ST25DV_i2c_WriteData(&cdata, (CCFileStruct.NDEF_offset + 1), 1); - if (ret_value != NFCTAG_OK) { - return NDEF_ERROR; - } - - return NDEF_OK; + NFCTAG_StatusTypeDef ret_value = NFCTAG_OK; + uint16_t status; + uint8_t accbuffer[8]; + uint8_t cdata; + + /* Prepare buffer to update CCFile */ + accbuffer[0] = CCFileStruct.MagicNumber; + accbuffer[1] = CCFileStruct.Version; + accbuffer[2] = CCFileStruct.MemorySize; + accbuffer[3] = CCFileStruct.TT5Tag; + CCFileStruct.NDEF_offset = 0x04; + + /* If extended memory prepare the length bytes */ + if (CCFileStruct.MemorySize == NFCT5_EXTENDED_CCFILE) { + accbuffer[6] = (uint8_t)(CCFileStruct.ExtMemorySize >> 8); + accbuffer[7] = (uint8_t)(CCFileStruct.ExtMemorySize & 0xFF); + CCFileStruct.NDEF_offset = 0x08; + } + + /* Update CCFile */ + status = NfcType5_WriteCCFile(accbuffer); + if (status != NDEF_OK) { + return status; + } + + /* Update NDEF TLV for INITIALIZED state */ + /* Update T */ + cdata = NFCT5_NDEF_MSG_TLV; + ret_value = mydev->ST25DV_i2c_WriteData(&cdata, CCFileStruct.NDEF_offset, 1); + if (ret_value != NFCTAG_OK) { + return NDEF_ERROR; + } + + /* Update L */ + cdata = 0x00; + ret_value = mydev->ST25DV_i2c_WriteData(&cdata, (CCFileStruct.NDEF_offset + 1), 1); + if (ret_value != NFCTAG_OK) { + return NDEF_ERROR; + } + + return NDEF_OK; } /** @@ -350,84 +350,84 @@ uint16_t NDEF::NfcType5_TT5Init(void) */ uint16_t NDEF::NfcType5_NDEFDetection(void) { - uint8_t acc_buffer[8]; - TT5_TLV_t tlv_detect; - uint16_t status; - uint32_t memory_size; + uint8_t acc_buffer[8]; + TT5_TLV_t tlv_detect; + uint16_t status; + uint32_t memory_size; - CCFileStruct.State = TT5_NO_NDEF; + CCFileStruct.State = TT5_NO_NDEF; - /* Read CCFile */ - status = NfcType5_ReadCCFile(acc_buffer); + /* Read CCFile */ + status = NfcType5_ReadCCFile(acc_buffer); - if (status != NDEF_OK) { - return status; - } - - /* Check Byte 0 is equal to magic number */ - if ((acc_buffer[0] != NFCT5_MAGICNUMBER_E1_CCFILE) && (acc_buffer[0] != NFCT5_MAGICNUMBER_E2_CCFILE)) { - return NDEF_ERROR_NOT_FORMATED; - } - /* Check Version number */ - else if (((acc_buffer[1] & 0xFC) != 0x40)) { - return NDEF_ERROR_NOT_FORMATED; - } + if (status != NDEF_OK) { + return status; + } - /* Check if CCFile is on 4 Bytes or 8 Bytes */ - if (acc_buffer[2] == 0x00) { - /* Update CCFIle structure */ - CCFileStruct.MemorySize = 0x0; - CCFileStruct.ExtMemorySize = (uint16_t)acc_buffer[6]; - CCFileStruct.ExtMemorySize = (CCFileStruct.ExtMemorySize << 8) | acc_buffer[7]; - memory_size = CCFileStruct.ExtMemorySize; - CCFileStruct.NDEF_offset = 8; - } else { - /* Update CCFIle structure */ - CCFileStruct.MemorySize = acc_buffer[2]; - CCFileStruct.ExtMemorySize = 0x0; - memory_size = CCFileStruct.MemorySize; - CCFileStruct.NDEF_offset = 4; - } + /* Check Byte 0 is equal to magic number */ + if ((acc_buffer[0] != NFCT5_MAGICNUMBER_E1_CCFILE) && (acc_buffer[0] != NFCT5_MAGICNUMBER_E2_CCFILE)) { + return NDEF_ERROR_NOT_FORMATED; + } + /* Check Version number */ + else if (((acc_buffer[1] & 0xFC) != 0x40)) { + return NDEF_ERROR_NOT_FORMATED; + } + /* Check if CCFile is on 4 Bytes or 8 Bytes */ + if (acc_buffer[2] == 0x00) { /* Update CCFIle structure */ - CCFileStruct.MagicNumber = (TT5_MagicNumber_t)acc_buffer[0]; - CCFileStruct.Version = acc_buffer[1]; - CCFileStruct.TT5Tag = acc_buffer[3]; - - /* Search for position of NDEF TLV in memory and tag status */ - while ((mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv_detect, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)) == NFCTAG_OK) && (CCFileStruct.NDEF_offset < memory_size)) { - /* Detect first NDEF Message in memory */ - if (tlv_detect.Type == NFCT5_NDEF_MSG_TLV) { - if (tlv_detect.Length == 0x00) { - CCFileStruct.State = TT5_INITIALIZED; - } else { - if (CCFileStruct.Version & 0x3) { - CCFileStruct.State = TT5_READ; - } else { - CCFileStruct.State = TT5_READ_WRITE; - } - } - return NDEF_OK; - } - /* If Proprietary NDEF jump to end of proprietary message */ - else if (tlv_detect.Type == NFCT5_PROPRIETARY_TLV) { - if (tlv_detect.Length == NFCT5_3_BYTES_L_TLV) { - CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + tlv_detect.Length16; - continue; - } else { - CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + tlv_detect.Length; - continue; - } - } - /* if Terminator no NDEF detected */ - else if (tlv_detect.Type == NFCT5_TERMINATOR_TLV) { - return NDEF_ERROR_NOT_FORMATED; + CCFileStruct.MemorySize = 0x0; + CCFileStruct.ExtMemorySize = (uint16_t)acc_buffer[6]; + CCFileStruct.ExtMemorySize = (CCFileStruct.ExtMemorySize << 8) | acc_buffer[7]; + memory_size = CCFileStruct.ExtMemorySize; + CCFileStruct.NDEF_offset = 8; + } else { + /* Update CCFIle structure */ + CCFileStruct.MemorySize = acc_buffer[2]; + CCFileStruct.ExtMemorySize = 0x0; + memory_size = CCFileStruct.MemorySize; + CCFileStruct.NDEF_offset = 4; + } + + /* Update CCFIle structure */ + CCFileStruct.MagicNumber = (TT5_MagicNumber_t)acc_buffer[0]; + CCFileStruct.Version = acc_buffer[1]; + CCFileStruct.TT5Tag = acc_buffer[3]; + + /* Search for position of NDEF TLV in memory and tag status */ + while ((mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv_detect, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)) == NFCTAG_OK) && (CCFileStruct.NDEF_offset < memory_size)) { + /* Detect first NDEF Message in memory */ + if (tlv_detect.Type == NFCT5_NDEF_MSG_TLV) { + if (tlv_detect.Length == 0x00) { + CCFileStruct.State = TT5_INITIALIZED; + } else { + if (CCFileStruct.Version & 0x3) { + CCFileStruct.State = TT5_READ; + } else { + CCFileStruct.State = TT5_READ_WRITE; } - - CCFileStruct.NDEF_offset++; + } + return NDEF_OK; + } + /* If Proprietary NDEF jump to end of proprietary message */ + else if (tlv_detect.Type == NFCT5_PROPRIETARY_TLV) { + if (tlv_detect.Length == NFCT5_3_BYTES_L_TLV) { + CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + tlv_detect.Length16; + continue; + } else { + CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + tlv_detect.Length; + continue; + } + } + /* if Terminator no NDEF detected */ + else if (tlv_detect.Type == NFCT5_TERMINATOR_TLV) { + return NDEF_ERROR_NOT_FORMATED; } - return NDEF_ERROR_NOT_FORMATED; + CCFileStruct.NDEF_offset++; + } + + return NDEF_ERROR_NOT_FORMATED; } @@ -442,28 +442,28 @@ uint16_t NDEF::NfcType5_NDEFDetection(void) uint16_t NDEF::NfcTag_GetLength(uint16_t *Length) { - uint16_t status = NDEF_ERROR; - TT5_TLV_t tlv; + uint16_t status = NDEF_ERROR; + TT5_TLV_t tlv; - /* Detect NDEF message in memory */ - status = NfcType5_NDEFDetection(); - if (status != NDEF_OK) { - return status; - } + /* Detect NDEF message in memory */ + status = NfcType5_NDEFDetection(); + if (status != NDEF_OK) { + return status; + } - /* Read TL of Type 5 */ - status = mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)); - if (status != NFCTAG_OK) { - return NDEF_ERROR; - } + /* Read TL of Type 5 */ + status = mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)); + if (status != NFCTAG_OK) { + return NDEF_ERROR; + } - if (tlv.Length != NFCT5_3_BYTES_L_TLV) { - *Length = tlv.Length; - } else { - *Length = ((tlv.Length16 >> 8) & 0xff) | ((tlv.Length16 & 0xff) << 8); - } + if (tlv.Length != NFCT5_3_BYTES_L_TLV) { + *Length = tlv.Length; + } else { + *Length = ((tlv.Length16 >> 8) & 0xff) | ((tlv.Length16 & 0xff) << 8); + } - return NDEF_OK; + return NDEF_OK; } diff --git a/src/libNDEF/tagtype5_wrapper.h b/src/libNDEF/tagtype5_wrapper.h index 075cdd5..5cb86af 100755 --- a/src/libNDEF/tagtype5_wrapper.h +++ b/src/libNDEF/tagtype5_wrapper.h @@ -44,9 +44,9 @@ /** @brief Type5 Tag Type-Length-Value structure as defined by the NFC Forum */ typedef struct { - uint8_t Type; /**< NFC Forum message Type */ - uint8_t Length; /**< Message length if lesser than 255 bytes */ - uint16_t Length16; /**< Message length if greater than or equal to 255 bytes */ + uint8_t Type; /**< NFC Forum message Type */ + uint8_t Length; /**< Message length if lesser than 255 bytes */ + uint16_t Length16; /**< Message length if greater than or equal to 255 bytes */ } TT5_TLV_t; /* Exported types ------------------------------------------------------------*/ From 16bc22d0dad3297770aa8260c156190b656ff333 Mon Sep 17 00:00:00 2001 From: Gabriele Barola Date: Wed, 2 Apr 2025 16:05:01 +0200 Subject: [PATCH 8/8] fix astyle format --- .astyleignore | 4 + src/ST25DVSensor.cpp | 448 ++++--- src/ST25DVSensor.h | 8 +- src/ST25DV_IO/st25dv_io.cpp | 2000 ++++++++++++++-------------- src/ST25DV_IO/st25dv_io.h | 172 +-- src/libNDEF/NDEF_class.h | 36 +- src/libNDEF/NDEFcommon.h | 18 +- src/libNDEF/lib_NDEF.cpp | 764 +++++------ src/libNDEF/lib_NDEF.h | 58 +- src/libNDEF/lib_NDEF_AAR.cpp | 84 +- src/libNDEF/lib_NDEF_AAR.h | 2 +- src/libNDEF/lib_NDEF_Bluetooth.cpp | 750 +++++------ src/libNDEF/lib_NDEF_Bluetooth.h | 148 +- src/libNDEF/lib_NDEF_Email.cpp | 486 +++---- src/libNDEF/lib_NDEF_Email.h | 16 +- src/libNDEF/lib_NDEF_Geo.cpp | 380 +++--- src/libNDEF/lib_NDEF_Geo.h | 6 +- src/libNDEF/lib_NDEF_Handover.cpp | 508 +++---- src/libNDEF/lib_NDEF_Handover.h | 36 +- src/libNDEF/lib_NDEF_MyApp.cpp | 280 ++-- src/libNDEF/lib_NDEF_MyApp.h | 16 +- src/libNDEF/lib_NDEF_SMS.cpp | 400 +++--- src/libNDEF/lib_NDEF_SMS.h | 6 +- src/libNDEF/lib_NDEF_Text.cpp | 128 +- src/libNDEF/lib_NDEF_Text.h | 18 +- src/libNDEF/lib_NDEF_URI.cpp | 696 +++++----- src/libNDEF/lib_NDEF_URI.h | 12 +- src/libNDEF/lib_NDEF_Vcard.cpp | 832 ++++++------ src/libNDEF/lib_NDEF_Vcard.h | 32 +- src/libNDEF/lib_NDEF_Wifi.cpp | 374 +++--- src/libNDEF/lib_NDEF_Wifi.h | 28 +- src/libNDEF/tagtype5_wrapper.cpp | 504 +++---- src/libNDEF/tagtype5_wrapper.h | 6 +- 33 files changed, 4633 insertions(+), 4623 deletions(-) create mode 100644 .astyleignore diff --git a/.astyleignore b/.astyleignore new file mode 100644 index 0000000..ee36213 --- /dev/null +++ b/.astyleignore @@ -0,0 +1,4 @@ +.git +BUILD +CI +system \ No newline at end of file diff --git a/src/ST25DVSensor.cpp b/src/ST25DVSensor.cpp index 857318c..03bbffa 100755 --- a/src/ST25DVSensor.cpp +++ b/src/ST25DVSensor.cpp @@ -21,104 +21,104 @@ int ST25DV::begin() { - return begin(NULL, 0); + return begin(NULL, 0); } int ST25DV::begin(uint8_t *buffer, uint16_t bufferLength) { - uint8_t nfctag_id = 0; + uint8_t nfctag_id = 0; - if (!NfctagInitialized) { - /* ST25DV Init */ - if (ST25DV_Init() != NFCTAG_OK) { - return NFCTAG_ERROR; - } + if (!NfctagInitialized) { + /* ST25DV Init */ + if (ST25DV_Init() != NFCTAG_OK) { + return NFCTAG_ERROR; + } - /* Check ST25DV driver ID */ - st25dv_io.ST25DV_i2c_ReadID(&nfctag_id); + /* Check ST25DV driver ID */ + st25dv_io.ST25DV_i2c_ReadID(&nfctag_id); - if ((nfctag_id == I_AM_ST25DV04) || (nfctag_id == I_AM_ST25DV64) || - (nfctag_id == I_AM_ST25DV04KC) || (nfctag_id == I_AM_ST25DV64KC)) { - NfctagInitialized = 1; - } else { - return NFCTAG_ERROR; - } + if ((nfctag_id == I_AM_ST25DV04) || (nfctag_id == I_AM_ST25DV64) || + (nfctag_id == I_AM_ST25DV04KC) || (nfctag_id == I_AM_ST25DV64KC)) { + NfctagInitialized = 1; + } else { + return NFCTAG_ERROR; + } - int ret = ndef.begin(buffer, bufferLength); - if (ret != NDEF_OK) { - return ret; - } + int ret = ndef.begin(buffer, bufferLength); + if (ret != NDEF_OK) { + return ret; } - return NFCTAG_OK; + } + return NFCTAG_OK; }; int ST25DV::writeText(String text, String iso_lang, NDEF_Text_encoding_t encoding) { - NDEF_Text_info_t text_info; + NDEF_Text_info_t text_info; - strcpy(text_info.text, text.c_str()); - strcpy(text_info.language_code, iso_lang.c_str()); - text_info.encoding = encoding; + strcpy(text_info.text, text.c_str()); + strcpy(text_info.language_code, iso_lang.c_str()); + text_info.encoding = encoding; - return ndef.NDEF_WriteText(&text_info); + return ndef.NDEF_WriteText(&text_info); } int ST25DV::readText(String *text) { - uint16_t ret; - NDEF_Text_info_t info; - sRecordInfo_t recordInfo; - - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } - - ret = ndef.NDEF_ReadText(&recordInfo, &info); - if (ret) { - return ret; - } - *text = String(info.text); - - return 0; + uint16_t ret; + NDEF_Text_info_t info; + sRecordInfo_t recordInfo; + + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } + + ret = ndef.NDEF_ReadText(&recordInfo, &info); + if (ret) { + return ret; + } + *text = String(info.text); + + return 0; } int ST25DV::writeURI(String protocol, String uri, String info) { - sURI_Info _URI; + sURI_Info _URI; - // Unabridged protocols must be written using - // `writeUnabridgedURI()` - if (protocol.equals("")) { - return NDEF_ERROR; - } + // Unabridged protocols must be written using + // `writeUnabridgedURI()` + if (protocol.equals("")) { + return NDEF_ERROR; + } - strcpy(_URI.protocol, protocol.c_str()); - strcpy(_URI.URI_Message, uri.c_str()); - strcpy(_URI.Information, info.c_str()); + strcpy(_URI.protocol, protocol.c_str()); + strcpy(_URI.URI_Message, uri.c_str()); + strcpy(_URI.Information, info.c_str()); - return ndef.NDEF_WriteURI(&_URI); + return ndef.NDEF_WriteURI(&_URI); } int ST25DV::readURI(String *s) { - uint16_t ret; - sURI_Info uri = {"", "", ""}; - sRecordInfo_t recordInfo; - - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } - - ret = ndef.NDEF_ReadURI(&recordInfo, &uri); - if (ret) { - return ret; - } - *s = String(uri.protocol) + String(uri.URI_Message); - - return 0; + uint16_t ret; + sURI_Info uri = {"", "", ""}; + sRecordInfo_t recordInfo; + + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } + + ret = ndef.NDEF_ReadURI(&recordInfo, &uri); + if (ret) { + return ret; + } + *s = String(uri.protocol) + String(uri.URI_Message); + + return 0; } /* @@ -133,13 +133,13 @@ int ST25DV::readURI(String *s) */ int ST25DV::writeUnabridgedURI(String uri, String info) { - sURI_Info _URI; + sURI_Info _URI; - strcpy(_URI.protocol, ""); - strcpy(_URI.URI_Message, uri.c_str()); - strcpy(_URI.Information, info.c_str()); + strcpy(_URI.protocol, ""); + strcpy(_URI.URI_Message, uri.c_str()); + strcpy(_URI.Information, info.c_str()); - return ndef.NDEF_WriteURI(&_URI); + return ndef.NDEF_WriteURI(&_URI); } /* @@ -149,28 +149,28 @@ int ST25DV::writeUnabridgedURI(String uri, String info) */ int ST25DV::readUnabridgedURI(String *s) { - uint16_t ret; - sURI_Info uri = {"", "", ""}; - sRecordInfo_t recordInfo; + uint16_t ret; + sURI_Info uri = {"", "", ""}; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } - ret = ndef.NDEF_ReadURI(&recordInfo, &uri); - if (ret) { - return ret; - } + ret = ndef.NDEF_ReadURI(&recordInfo, &uri); + if (ret) { + return ret; + } - // If the URI is abbreviated return error - if (strncmp("", uri.protocol, 1) != 0) { - return ret; //NDEF_ERROR; - } + // If the URI is abbreviated return error + if (strncmp("", uri.protocol, 1) != 0) { + return ret; //NDEF_ERROR; + } - *s = String(uri.URI_Message); + *s = String(uri.URI_Message); - return 0; + return 0; } /* @@ -183,13 +183,13 @@ int ST25DV::readUnabridgedURI(String *s) */ int ST25DV::writeSMS(String phoneNumber, String message, String info) { - sSMSInfo _SMS; + sSMSInfo _SMS; - strncpy(_SMS.PhoneNumber, phoneNumber.c_str(), 16); - strncpy(_SMS.Message, message.c_str(), 400); - strncpy(_SMS.Information, info.c_str(), 400); + strncpy(_SMS.PhoneNumber, phoneNumber.c_str(), 16); + strncpy(_SMS.Message, message.c_str(), 400); + strncpy(_SMS.Information, info.c_str(), 400); - return ndef.NDEF_WriteSMS(&_SMS); + return ndef.NDEF_WriteSMS(&_SMS); } /* @@ -201,24 +201,24 @@ int ST25DV::writeSMS(String phoneNumber, String message, String info) */ int ST25DV::readSMS(String *phoneNumber, String *message) { - uint16_t ret; - sSMSInfo _SMS; - sRecordInfo_t recordInfo; + uint16_t ret; + sSMSInfo _SMS; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } - ret = ndef.NDEF_ReadSMS(&recordInfo, &_SMS); - if (ret) { - return ret; - } + ret = ndef.NDEF_ReadSMS(&recordInfo, &_SMS); + if (ret) { + return ret; + } - *phoneNumber = String(_SMS.PhoneNumber); - *message = String(_SMS.Message); + *phoneNumber = String(_SMS.PhoneNumber); + *message = String(_SMS.Message); - return NDEF_OK; + return NDEF_OK; } /* @@ -231,13 +231,13 @@ int ST25DV::readSMS(String *phoneNumber, String *message) */ int ST25DV::writeGEO(String latitude, String longitude, String info) { - sGeoInfo _GEO; + sGeoInfo _GEO; - strncpy(_GEO.Latitude, latitude.c_str(), 20); - strncpy(_GEO.Longitude, longitude.c_str(), 20); - strncpy(_GEO.Information, info.c_str(), 100); + strncpy(_GEO.Latitude, latitude.c_str(), 20); + strncpy(_GEO.Longitude, longitude.c_str(), 20); + strncpy(_GEO.Information, info.c_str(), 100); - return ndef.NDEF_WriteGeo(&_GEO); + return ndef.NDEF_WriteGeo(&_GEO); } /* @@ -249,60 +249,60 @@ int ST25DV::writeGEO(String latitude, String longitude, String info) */ int ST25DV::readGEO(String *latitude, String *longitude) { - uint16_t ret; - sGeoInfo _GEO; - sRecordInfo_t recordInfo; + uint16_t ret; + sGeoInfo _GEO; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } - ret = ndef.NDEF_ReadGeo(&recordInfo, &_GEO); - if (ret) { - return ret; - } + ret = ndef.NDEF_ReadGeo(&recordInfo, &_GEO); + if (ret) { + return ret; + } - *latitude = String(_GEO.Latitude); - *longitude = String(_GEO.Longitude); + *latitude = String(_GEO.Latitude); + *longitude = String(_GEO.Longitude); - return NDEF_OK; + return NDEF_OK; } int ST25DV::writeEMail(String emailAdd, String subject, String message, String info) { - sEmailInfo _EMAIL; + sEmailInfo _EMAIL; - strncpy(_EMAIL.EmailAdd, emailAdd.c_str(), 64); - strncpy(_EMAIL.Subject, subject.c_str(), 100); - strncpy(_EMAIL.Message, message.c_str(), 2000); - strncpy(_EMAIL.Information, info.c_str(), 400); + strncpy(_EMAIL.EmailAdd, emailAdd.c_str(), 64); + strncpy(_EMAIL.Subject, subject.c_str(), 100); + strncpy(_EMAIL.Message, message.c_str(), 2000); + strncpy(_EMAIL.Information, info.c_str(), 400); - return ndef.NDEF_WriteEmail(&_EMAIL); + return ndef.NDEF_WriteEmail(&_EMAIL); } int ST25DV::readEMail(String *emailAdd, String *subject, String *message) { - uint16_t ret; - sEmailInfo _EMAIL; - sRecordInfo_t recordInfo; + uint16_t ret; + sEmailInfo _EMAIL; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } - ret = ndef.NDEF_ReadEmail(&recordInfo, &_EMAIL); - if (ret) { - return ret; - } + ret = ndef.NDEF_ReadEmail(&recordInfo, &_EMAIL); + if (ret) { + return ret; + } - *emailAdd = String(_EMAIL.EmailAdd); - *subject = String(_EMAIL.Subject); - *message = String(_EMAIL.Message); + *emailAdd = String(_EMAIL.EmailAdd); + *subject = String(_EMAIL.Subject); + *message = String(_EMAIL.Message); - return NDEF_OK; + return NDEF_OK; } /** @@ -314,65 +314,69 @@ int ST25DV::readEMail(String *emailAdd, String *subject, String *message) * @param key * @retval success or failure */ -int ST25DV::writeWifi(String SSID, Ndef_Wifi_Authentication_t auth, Ndef_Wifi_Encryption_t enc, String key) { - sWifiTokenInfo _wifi; +int ST25DV::writeWifi(String SSID, Ndef_Wifi_Authentication_t auth, Ndef_Wifi_Encryption_t enc, String key) +{ + sWifiTokenInfo _wifi; - strncpy(_wifi.NetworkSSID, SSID.c_str(), 32); - strncpy(_wifi.NetworkKey, key.c_str(), 32); + strncpy(_wifi.NetworkSSID, SSID.c_str(), 32); + strncpy(_wifi.NetworkKey, key.c_str(), 32); - _wifi.AuthenticationType = auth; - _wifi.EncryptionType = enc; + _wifi.AuthenticationType = auth; + _wifi.EncryptionType = enc; - return ndef.NDEF_WriteWifiToken(&_wifi); + return ndef.NDEF_WriteWifiToken(&_wifi); } -int ST25DV::readWifi(sWifiTokenInfo *wifitoken) { - uint16_t ret; - sRecordInfo_t recordInfo; +int ST25DV::readWifi(sWifiTokenInfo *wifitoken) +{ + uint16_t ret; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } - return ndef.NDEF_ReadWifiToken(&recordInfo, wifitoken); + return ndef.NDEF_ReadWifiToken(&recordInfo, wifitoken); } -int ST25DV::writeVcard(sVcardInfo vcard) { +int ST25DV::writeVcard(sVcardInfo vcard) +{ - return ndef.NDEF_WriteVcard(&vcard); + return ndef.NDEF_WriteVcard(&vcard); } -int ST25DV::readVcard(sVcardInfo *vcard) { - uint16_t ret; - sRecordInfo_t recordInfo; +int ST25DV::readVcard(sVcardInfo *vcard) +{ + uint16_t ret; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return ret; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return ret; + } - return ndef.NDEF_ReadVcard(&recordInfo, vcard); + return ndef.NDEF_ReadVcard(&recordInfo, vcard); } int ST25DV::appendAAR(String pkgName) { - sAARInfo _info; - strncpy(_info.PackageName, pkgName.c_str(), 80); + sAARInfo _info; + strncpy(_info.PackageName, pkgName.c_str(), 80); - return ndef.NDEF_AddAAR(&_info); + return ndef.NDEF_AddAAR(&_info); } int ST25DV::appendBluetoothOOB(Ndef_Bluetooth_OOB_t bluetooth, char *recordId) { - return ndef.NDEF_AppendBluetoothOOB(&bluetooth, recordId); + return ndef.NDEF_AppendBluetoothOOB(&bluetooth, recordId); } int ST25DV::writeMyApp(sMyAppInfo *pMyAppStruct) { - return ndef.NDEF_WriteMyApp(pMyAppStruct); + return ndef.NDEF_WriteMyApp(pMyAppStruct); } /** @@ -382,15 +386,15 @@ int ST25DV::writeMyApp(sMyAppInfo *pMyAppStruct) */ NDEF_TypeDef ST25DV::readNDEFType(void) { - uint16_t ret; - sRecordInfo_t recordInfo; + uint16_t ret; + sRecordInfo_t recordInfo; - ret = ndef.NDEF_IdentifyNDEF(&recordInfo); - if (ret) { - return UNKNOWN_TYPE; - } + ret = ndef.NDEF_IdentifyNDEF(&recordInfo); + if (ret) { + return UNKNOWN_TYPE; + } - return recordInfo.NDEF_Type; + return recordInfo.NDEF_Type; } /** @@ -400,7 +404,7 @@ NDEF_TypeDef ST25DV::readNDEFType(void) */ NDEF *ST25DV::getNDEF(void) { - return &ndef; + return &ndef; } /** @@ -410,17 +414,17 @@ NDEF *ST25DV::getNDEF(void) */ NFCTAG_StatusTypeDef ST25DV::ST25DV_Init(void) { - if (st25dv_io.get_pwire() == NULL) { - return NFCTAG_ERROR; - } + if (st25dv_io.get_pwire() == NULL) { + return NFCTAG_ERROR; + } - ST25DV_GPO_Init(); - ST25DV_LPD_Init(); + ST25DV_GPO_Init(); + ST25DV_LPD_Init(); - ST25DV_I2C_Init(); - ST25DV_SelectI2cSpeed(3); + ST25DV_I2C_Init(); + ST25DV_SelectI2cSpeed(3); - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -430,7 +434,7 @@ NFCTAG_StatusTypeDef ST25DV::ST25DV_Init(void) */ void ST25DV::ST25DV_GPO_Init(void) { - pinMode(st25dv_io.get_gpo(), INPUT); + pinMode(st25dv_io.get_gpo(), INPUT); } /** @@ -440,7 +444,7 @@ void ST25DV::ST25DV_GPO_Init(void) */ uint8_t ST25DV::ST25DV_GPO_ReadPin(void) { - return digitalRead(st25dv_io.get_gpo()); + return digitalRead(st25dv_io.get_gpo()); } /** @@ -450,10 +454,10 @@ uint8_t ST25DV::ST25DV_GPO_ReadPin(void) */ void ST25DV::ST25DV_LPD_Init(void) { - if (st25dv_io.get_lpd() > 0) { - pinMode(st25dv_io.get_lpd(), OUTPUT); - digitalWrite(st25dv_io.get_lpd(), LOW); - } + if (st25dv_io.get_lpd() > 0) { + pinMode(st25dv_io.get_lpd(), OUTPUT); + digitalWrite(st25dv_io.get_lpd(), LOW); + } } /** @@ -472,7 +476,7 @@ void ST25DV::ST25DV_LPD_DeInit(void) */ uint8_t ST25DV::ST25DV_LPD_ReadPin(void) { - return digitalRead(st25dv_io.get_lpd()); + return digitalRead(st25dv_io.get_lpd()); } /** @@ -482,7 +486,7 @@ uint8_t ST25DV::ST25DV_LPD_ReadPin(void) */ void ST25DV::ST25DV_LPD_WritePin(uint8_t LpdPinState) { - digitalWrite(st25dv_io.get_lpd(), LpdPinState); + digitalWrite(st25dv_io.get_lpd(), LpdPinState); } /** @@ -492,47 +496,47 @@ void ST25DV::ST25DV_LPD_WritePin(uint8_t LpdPinState) */ void ST25DV::ST25DV_SelectI2cSpeed(uint8_t i2cspeedchoice) { - if (st25dv_io.get_pwire() == NULL) { - return; - } + if (st25dv_io.get_pwire() == NULL) { + return; + } #if !defined(ARDUINO_ARCH_ARC) && !defined(ARDUINO_ARCH_ARC32) - switch (i2cspeedchoice) { + switch (i2cspeedchoice) { case 0: - st25dv_io.get_pwire()->setClock(10000); - break; + st25dv_io.get_pwire()->setClock(10000); + break; case 1: - st25dv_io.get_pwire()->setClock(100000); - break; + st25dv_io.get_pwire()->setClock(100000); + break; case 2: - st25dv_io.get_pwire()->setClock(200000); - break; + st25dv_io.get_pwire()->setClock(200000); + break; case 3: - st25dv_io.get_pwire()->setClock(400000); - break; + st25dv_io.get_pwire()->setClock(400000); + break; case 4: - st25dv_io.get_pwire()->setClock(800000); - break; + st25dv_io.get_pwire()->setClock(800000); + break; case 5: - st25dv_io.get_pwire()->setClock(1000000); - break; + st25dv_io.get_pwire()->setClock(1000000); + break; default: - st25dv_io.get_pwire()->setClock(1000000); - break; - } + st25dv_io.get_pwire()->setClock(1000000); + break; + } } /** @@ -542,7 +546,7 @@ void ST25DV::ST25DV_SelectI2cSpeed(uint8_t i2cspeedchoice) */ void ST25DV::ST25DV_I2C_Init(void) { - st25dv_io.get_pwire()->begin(); + st25dv_io.get_pwire()->begin(); } #endif diff --git a/src/ST25DVSensor.h b/src/ST25DVSensor.h index e3496f1..de367d5 100755 --- a/src/ST25DVSensor.h +++ b/src/ST25DVSensor.h @@ -25,13 +25,13 @@ #include "libNDEF/NDEF_class.h" #if defined(ARDUINO_SAM_DUE) -#define WIRE Wire1 + #define WIRE Wire1 #else -#define WIRE Wire + #define WIRE Wire #endif class ST25DV { -public: + public: ST25DV(int32_t gpo, int32_t lpd, TwoWire *i2c, Stream *serial = NULL) : st25dv_io(gpo, lpd, i2c, serial), ndef(&st25dv_io) {} int begin(); @@ -58,7 +58,7 @@ class ST25DV { NDEF_TypeDef readNDEFType(); NDEF *getNDEF(); -protected: + protected: NFCTAG_StatusTypeDef ST25DV_Init(void); void ST25DV_GPO_Init(void); void ST25DV_GPO_DeInit(void); diff --git a/src/ST25DV_IO/st25dv_io.cpp b/src/ST25DV_IO/st25dv_io.cpp index 6941e82..cb7d6d7 100644 --- a/src/ST25DV_IO/st25dv_io.cpp +++ b/src/ST25DV_IO/st25dv_io.cpp @@ -23,10 +23,10 @@ ST25DV_IO::ST25DV_IO(int32_t gpo, int32_t lpd, TwoWire *i2c, Stream *serial) { - _gpo = gpo; - _lpd = lpd; - _pwire = i2c; - _serial = serial; + _gpo = gpo; + _lpd = lpd; + _pwire = i2c; + _serial = serial; } /******************************** LINK EEPROM COMPONENT *****************************/ @@ -42,68 +42,68 @@ ST25DV_IO::ST25DV_IO(int32_t gpo, int32_t lpd, TwoWire *i2c, Stream *serial) NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_MemWrite(const uint8_t *const pData, const uint8_t DevAddr, const uint16_t TarAddr, const uint16_t Size) { - NFCTAG_StatusTypeDef pollstatus; - byte ret; - uint32_t tickstart; - uint8_t Addr = DevAddr >> 1; - char tmp[4]; - - if (_pwire == NULL) { - return NFCTAG_ERROR; - } - - if (_serial != NULL) { - // _serial->println(SP); - _serial->print(" w "); - sprintf(tmp, "%02X", Addr); - _serial->print(tmp); - _serial->print("@"); - sprintf(tmp, "%02X", TarAddr >> 8); - _serial->print(tmp); - sprintf(tmp, "%02X", TarAddr & 0xFF); - _serial->print(tmp); - _serial->print(":"); - _serial->println(Size); - _serial->print(" "); - for (uint16_t d = 0; d < Size; d++) { - sprintf(tmp, "%02X", pData[d]); - _serial->print(tmp); - } - _serial->println(""); - } - - _pwire->beginTransmission(Addr); // transmit to device - _pwire->write(TarAddr >> 8); // send memory address MSB - _pwire->write(TarAddr & 0xFF); // send memory address LSB - _pwire->write(pData, Size); // sends bytes - ret = _pwire->endTransmission(true); // stop transmitting - if (_serial != NULL) { - _serial->print(" ="); - _serial->println(ret); - } + NFCTAG_StatusTypeDef pollstatus; + byte ret; + uint32_t tickstart; + uint8_t Addr = DevAddr >> 1; + char tmp[4]; + + if (_pwire == NULL) { + return NFCTAG_ERROR; + } + + if (_serial != NULL) { + // _serial->println(SP); + _serial->print(" w "); + sprintf(tmp, "%02X", Addr); + _serial->print(tmp); + _serial->print("@"); + sprintf(tmp, "%02X", TarAddr >> 8); + _serial->print(tmp); + sprintf(tmp, "%02X", TarAddr & 0xFF); + _serial->print(tmp); + _serial->print(":"); + _serial->println(Size); + _serial->print(" "); + for (uint16_t d = 0; d < Size; d++) { + sprintf(tmp, "%02X", pData[d]); + _serial->print(tmp); + } + _serial->println(""); + } + + _pwire->beginTransmission(Addr); // transmit to device + _pwire->write(TarAddr >> 8); // send memory address MSB + _pwire->write(TarAddr & 0xFF); // send memory address LSB + _pwire->write(pData, Size); // sends bytes + ret = _pwire->endTransmission(true); // stop transmitting + if (_serial != NULL) { + _serial->print(" ="); + _serial->println(ret); + } + + if (ret == 0) { + /* Poll until EEPROM is available */ + tickstart = millis(); + /* Wait until ST25DV is ready or timeout occurs */ + do { + pollstatus = ST25DV_IO_IsDeviceReady(DevAddr, 1); + } while (((millis() - tickstart) < ST25DV_I2C_TIMEOUT) && (pollstatus != NFCTAG_OK)); - if (ret == 0) { - /* Poll until EEPROM is available */ - tickstart = millis(); - /* Wait until ST25DV is ready or timeout occurs */ - do { - pollstatus = ST25DV_IO_IsDeviceReady(DevAddr, 1); - } while (((millis() - tickstart) < ST25DV_I2C_TIMEOUT) && (pollstatus != NFCTAG_OK)); - - if (pollstatus != NFCTAG_OK) { - return NFCTAG_TIMEOUT; - } + if (pollstatus != NFCTAG_OK) { + return NFCTAG_TIMEOUT; } + } #if defined(ARDUINO_ARCH_ARC) || defined(ARDUINO_ARCH_ARC32) - // Arduino 101 i2c seems buggy after an address NACK: restart the i2c - else if (ret == 2) { - if (_serial != NULL) { - _serial->print(" -\n"); - } - _pwire->begin(); + // Arduino 101 i2c seems buggy after an address NACK: restart the i2c + else if (ret == 2) { + if (_serial != NULL) { + _serial->print(" -\n"); } + _pwire->begin(); + } #endif - return NFCTAG_ConvertStatus(ret); + return NFCTAG_ConvertStatus(ret); } /** @@ -116,80 +116,80 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_MemWrite(const uint8_t *const pData, c */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_MemRead(uint8_t *const pData, const uint8_t DevAddr, const uint16_t TarAddr, const uint16_t Size) { - int i = 0; - uint8_t ret = 4; - uint8_t Addr = DevAddr >> 1; - char tmp[4]; - - if (_pwire == NULL) { - return NFCTAG_ERROR; - } - - if (_serial != NULL) { - // _serial->println(SP); - _serial->print(" r "); - sprintf(tmp, "%02X", Addr); - _serial->print(tmp); - _serial->print("@"); - sprintf(tmp, "%02X", TarAddr >> 8); - _serial->print(tmp); - sprintf(tmp, "%02X", TarAddr & 0xFF); - _serial->print(tmp); - _serial->print(":"); - _serial->println(Size); - } - _pwire->beginTransmission(Addr); // Get the slave's attention, tell it we're sending a command byte - _pwire->write(TarAddr >> 8); // The command byte, sets pointer to register with address of 0x32 - _pwire->write(TarAddr & 0xFF); // The command byte, sets pointer to register with address of 0x32 - ret = _pwire->endTransmission(true); - // Address is not OK - if (ret != 0) { - return NFCTAG_ConvertStatus(ret); - } - - // be carefully with the (int)Size, the size parameter us no more on 16 bits but only 15 bits (the cast is required for arduino UNO) - _pwire->requestFrom((int)Addr, (int)Size); // Tell slave we need to read 1byte from the current register - - - while (_pwire->available()) { - pData[i++] = _pwire->read(); // read that byte into 'slaveByte2' variable - } - if (_serial != NULL) { - _serial->print(" "); - for (int d = 0; d < i; d++) { - sprintf(tmp, "%02X", pData[d]); - _serial->print(tmp); - } - _serial->println(""); - } - - /* - It doesn't seem like Arduino wants you to call `endTransmission` - after `requestFrom`. On the ESP32 the ret value is 8 because it - is an `endTransmission` without a `startTransmission` which is - considered an error by the library. - */ - // ret = _pwire->endTransmission(); - // if (_serial != NULL) { - // // _serial->println(pData[0]); - // _serial->print(" ="); - // _serial->println(ret); - // // _serial->print(" "); - // // _serial->println(pData[0]); - // // _serial->println((uint32_t)pData); - // } + int i = 0; + uint8_t ret = 4; + uint8_t Addr = DevAddr >> 1; + char tmp[4]; + + if (_pwire == NULL) { + return NFCTAG_ERROR; + } + + if (_serial != NULL) { + // _serial->println(SP); + _serial->print(" r "); + sprintf(tmp, "%02X", Addr); + _serial->print(tmp); + _serial->print("@"); + sprintf(tmp, "%02X", TarAddr >> 8); + _serial->print(tmp); + sprintf(tmp, "%02X", TarAddr & 0xFF); + _serial->print(tmp); + _serial->print(":"); + _serial->println(Size); + } + _pwire->beginTransmission(Addr); // Get the slave's attention, tell it we're sending a command byte + _pwire->write(TarAddr >> 8); // The command byte, sets pointer to register with address of 0x32 + _pwire->write(TarAddr & 0xFF); // The command byte, sets pointer to register with address of 0x32 + ret = _pwire->endTransmission(true); + // Address is not OK + if (ret != 0) { return NFCTAG_ConvertStatus(ret); + } + + // be carefully with the (int)Size, the size parameter us no more on 16 bits but only 15 bits (the cast is required for arduino UNO) + _pwire->requestFrom((int)Addr, (int)Size); // Tell slave we need to read 1byte from the current register + + + while (_pwire->available()) { + pData[i++] = _pwire->read(); // read that byte into 'slaveByte2' variable + } + if (_serial != NULL) { + _serial->print(" "); + for (int d = 0; d < i; d++) { + sprintf(tmp, "%02X", pData[d]); + _serial->print(tmp); + } + _serial->println(""); + } + + /* + It doesn't seem like Arduino wants you to call `endTransmission` + after `requestFrom`. On the ESP32 the ret value is 8 because it + is an `endTransmission` without a `startTransmission` which is + considered an error by the library. + */ + // ret = _pwire->endTransmission(); + // if (_serial != NULL) { + // // _serial->println(pData[0]); + // _serial->print(" ="); + // _serial->println(ret); + // // _serial->print(" "); + // // _serial->println(pData[0]); + // // _serial->println((uint32_t)pData); + // } + return NFCTAG_ConvertStatus(ret); } NFCTAG_StatusTypeDef ST25DV_IO::NFCTAG_ConvertStatus(uint8_t ret) { - if (ret == 0) { - return NFCTAG_OK; - } else if ((ret == 2) || (ret == 3)) { - return NFCTAG_NACK; - } else { - return NFCTAG_ERROR; - } + if (ret == 0) { + return NFCTAG_OK; + } else if ((ret == 2) || (ret == 3)) { + return NFCTAG_NACK; + } else { + return NFCTAG_ERROR; + } } @@ -202,46 +202,46 @@ NFCTAG_StatusTypeDef ST25DV_IO::NFCTAG_ConvertStatus(uint8_t ret) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_Read(uint8_t *const pData, const uint8_t DevAddr, const uint16_t Size) { - int i = 0; - uint8_t Addr = DevAddr >> 1; - char tmp[4]; - - if (_pwire == NULL) { - return NFCTAG_ERROR; - } - if (_serial != NULL) { - _serial->print(" r"); - _serial->print(":"); - _serial->println(Size); - } - // be carefully with the (int)Size, the size parameter us no more on 16 bits but only 15 bits (the cast is required for arduino UNO) - byte ret = _pwire->requestFrom((int)Addr, (int)Size); // Tell slave we need to read 1byte from the current register - while (_pwire->available()) { - pData[i++] = _pwire->read(); // read that byte into 'slaveByte2' variable - } - - if (_serial != NULL) { - _serial->print(" "); - for (int d = 0; d < i; d++) { - sprintf(tmp, "%02X", pData[d]); - _serial->print(tmp); - } - _serial->println(""); - } - /* - It doesn't seem like Arduino wants you to call `endTransmission` - after `requestFrom`. On the ESP32 the ret value is 8 because it - is an `endTransmission` without a `startTransmission` which is - considered an error by the library. - */ - // ret = _pwire->endTransmission(); - - // if (_serial != NULL) { - // // _serial->println(pData[0]); - // _serial->print(" ="); - // _serial->println(ret); - // } - return NFCTAG_ConvertStatus(ret); + int i = 0; + uint8_t Addr = DevAddr >> 1; + char tmp[4]; + + if (_pwire == NULL) { + return NFCTAG_ERROR; + } + if (_serial != NULL) { + _serial->print(" r"); + _serial->print(":"); + _serial->println(Size); + } + // be carefully with the (int)Size, the size parameter us no more on 16 bits but only 15 bits (the cast is required for arduino UNO) + byte ret = _pwire->requestFrom((int)Addr, (int)Size); // Tell slave we need to read 1byte from the current register + while (_pwire->available()) { + pData[i++] = _pwire->read(); // read that byte into 'slaveByte2' variable + } + + if (_serial != NULL) { + _serial->print(" "); + for (int d = 0; d < i; d++) { + sprintf(tmp, "%02X", pData[d]); + _serial->print(tmp); + } + _serial->println(""); + } + /* + It doesn't seem like Arduino wants you to call `endTransmission` + after `requestFrom`. On the ESP32 the ret value is 8 because it + is an `endTransmission` without a `startTransmission` which is + considered an error by the library. + */ + // ret = _pwire->endTransmission(); + + // if (_serial != NULL) { + // // _serial->println(pData[0]); + // _serial->print(" ="); + // _serial->println(ret); + // } + return NFCTAG_ConvertStatus(ret); } @@ -253,24 +253,24 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_Read(uint8_t *const pData, const uint8 */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_IsDeviceReady(const uint8_t DevAddr, const uint32_t Trials) { - int ret = 4; - uint32_t count = 0; - if (_pwire == NULL) { - return NFCTAG_ERROR; - } + int ret = 4; + uint32_t count = 0; + if (_pwire == NULL) { + return NFCTAG_ERROR; + } + if (_serial != NULL) { + _serial->println(" ?"); + } + + while ((count++ < Trials) && ret) { + _pwire->beginTransmission(DevAddr >> 1); + ret = _pwire->endTransmission(); if (_serial != NULL) { - _serial->println(" ?"); + _serial->print(" ="); + _serial->println(ret); } - - while ((count++ < Trials) && ret) { - _pwire->beginTransmission(DevAddr >> 1); - ret = _pwire->endTransmission(); - if (_serial != NULL) { - _serial->print(" ="); - _serial->println(ret); - } - } - return NFCTAG_ConvertStatus(ret); + } + return NFCTAG_ConvertStatus(ret); } /** @@ -279,8 +279,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_IO_IsDeviceReady(const uint8_t DevAddr, c */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_Init(void) { - /* Configure the low level interface */ - return ST25DV_IO_Init(); + /* Configure the low level interface */ + return ST25DV_IO_Init(); } /** @@ -290,8 +290,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_Init(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadID(uint8_t *const pICRef) { - /* Read ICRef on device */ - return ST25DV_i2c_ReadRegister(pICRef, ST25DV_ICREF_REG, 1); + /* Read ICRef on device */ + return ST25DV_i2c_ReadRegister(pICRef, ST25DV_ICREF_REG, 1); } /** @@ -303,8 +303,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadID(uint8_t *const pICRef) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadData(uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - /* Read Data in user memory */ - return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); + /* Read Data in user memory */ + return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); } /** @@ -316,32 +316,32 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadData(uint8_t *const pData, const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteData(const uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - NFCTAG_StatusTypeDef ret; - uint16_t split_data_nb; - const uint8_t *pdata_index = (const uint8_t *)pData; - uint16_t bytes_to_write = NbByte; - uint16_t mem_addr = TarAddr; + NFCTAG_StatusTypeDef ret; + uint16_t split_data_nb; + const uint8_t *pdata_index = (const uint8_t *)pData; + uint16_t bytes_to_write = NbByte; + uint16_t mem_addr = TarAddr; + + /* ST25DV can write a maximum of 256 bytes in EEPROM per i2c communication */ + do { + /* Split write if data to write is superior of max write bytes for ST25DV */ + if (bytes_to_write > ST25DV_MAX_WRITE_BYTE) { + /* DataSize higher than max page write, copy data by page */ + split_data_nb = (uint16_t)ST25DV_MAX_WRITE_BYTE; + } else { + /* DataSize lower or equal to max page write, copy only last bytes */ + split_data_nb = bytes_to_write; + } + /* Write split_data_nb bytes in memory */ + ret = ST25DV_IO_MemWrite(pdata_index, ST25DV_ADDR_DATA_I2C, mem_addr, split_data_nb); - /* ST25DV can write a maximum of 256 bytes in EEPROM per i2c communication */ - do { - /* Split write if data to write is superior of max write bytes for ST25DV */ - if (bytes_to_write > ST25DV_MAX_WRITE_BYTE) { - /* DataSize higher than max page write, copy data by page */ - split_data_nb = (uint16_t)ST25DV_MAX_WRITE_BYTE; - } else { - /* DataSize lower or equal to max page write, copy only last bytes */ - split_data_nb = bytes_to_write; - } - /* Write split_data_nb bytes in memory */ - ret = ST25DV_IO_MemWrite(pdata_index, ST25DV_ADDR_DATA_I2C, mem_addr, split_data_nb); - - /* update index, dest address, size for next write */ - pdata_index += split_data_nb; - mem_addr += split_data_nb; - bytes_to_write -= split_data_nb; - } while ((bytes_to_write > 0) && (ret == NFCTAG_OK)); + /* update index, dest address, size for next write */ + pdata_index += split_data_nb; + mem_addr += split_data_nb; + bytes_to_write -= split_data_nb; + } while ((bytes_to_write > 0) && (ret == NFCTAG_OK)); - return ret; + return ret; } /** @@ -353,8 +353,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteData(const uint8_t *const pData, */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRegister(uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - /* Read Data in system memory */ - return ST25DV_IO_MemRead(pData, ST25DV_ADDR_SYST_I2C, TarAddr, NbByte); + /* Read Data in system memory */ + return ST25DV_IO_MemRead(pData, ST25DV_ADDR_SYST_I2C, TarAddr, NbByte); } /** @@ -367,32 +367,32 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRegister(uint8_t *const pData, co */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRegister(const uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - NFCTAG_StatusTypeDef ret; - uint8_t split_data_nb; - uint16_t bytes_to_write = NbByte; - uint16_t mem_addr = TarAddr; - const uint8_t *pdata_index = (const uint8_t *)pData; + NFCTAG_StatusTypeDef ret; + uint8_t split_data_nb; + uint16_t bytes_to_write = NbByte; + uint16_t mem_addr = TarAddr; + const uint8_t *pdata_index = (const uint8_t *)pData; + + /* ST25DV can write a maximum of 256 bytes in EEPROM per i2c communication */ + do { + /* Split write if data to write is superior of max write bytes for ST25DV */ + if (bytes_to_write > ST25DV_MAX_WRITE_BYTE) { + /* DataSize higher than max page write, copy data by page */ + split_data_nb = (uint8_t)ST25DV_MAX_WRITE_BYTE; + } else { + /* DataSize lower or equal to max page write, copy only last bytes */ + split_data_nb = bytes_to_write; + } + /* Write split_data_nb bytes in register */ + ret = ST25DV_IO_MemWrite(pdata_index, ST25DV_ADDR_SYST_I2C, mem_addr, split_data_nb); - /* ST25DV can write a maximum of 256 bytes in EEPROM per i2c communication */ - do { - /* Split write if data to write is superior of max write bytes for ST25DV */ - if (bytes_to_write > ST25DV_MAX_WRITE_BYTE) { - /* DataSize higher than max page write, copy data by page */ - split_data_nb = (uint8_t)ST25DV_MAX_WRITE_BYTE; - } else { - /* DataSize lower or equal to max page write, copy only last bytes */ - split_data_nb = bytes_to_write; - } - /* Write split_data_nb bytes in register */ - ret = ST25DV_IO_MemWrite(pdata_index, ST25DV_ADDR_SYST_I2C, mem_addr, split_data_nb); - - /* update index, dest address, size for next write */ - pdata_index += split_data_nb; - mem_addr += split_data_nb; - bytes_to_write -= split_data_nb; - } while ((bytes_to_write > 0) && (ret == NFCTAG_OK)); + /* update index, dest address, size for next write */ + pdata_index += split_data_nb; + mem_addr += split_data_nb; + bytes_to_write -= split_data_nb; + } while ((bytes_to_write > 0) && (ret == NFCTAG_OK)); - return ret; + return ret; } /** @@ -402,8 +402,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRegister(const uint8_t *const pD */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadICRev(uint8_t *const pICRev) { - /* Read ICRev on device */ - return ST25DV_i2c_ReadRegister(pICRev, ST25DV_ICREV_REG, 1); + /* Read ICRev on device */ + return ST25DV_i2c_ReadRegister(pICRev, ST25DV_ICREV_REG, 1); } /** TODO adjust comment @@ -422,21 +422,21 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadICRev(uint8_t *const pICRev) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetGPOStatus(uint16_t *const pGPOStatus) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; - /* Read value of GPO register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO2_REG, 1); + uint8_t reg_value; + NFCTAG_StatusTypeDef status; + /* Read value of GPO register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO2_REG, 1); + if (status == NFCTAG_OK) { + // Extract GPO configuration + *pGPOStatus = ((uint16_t)0x0003 & (uint16_t)reg_value) << 8; + // Read value of GPO register + status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO1_REG, 1); if (status == NFCTAG_OK) { - // Extract GPO configuration - *pGPOStatus = ((uint16_t)0x0003 & (uint16_t)reg_value) << 8; - // Read value of GPO register - status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO1_REG, 1); - if (status == NFCTAG_OK) { - // Extract GPO configuration - *pGPOStatus |= ((uint16_t)0x00FF & (uint16_t)reg_value); - } + // Extract GPO configuration + *pGPOStatus |= ((uint16_t)0x00FF & (uint16_t)reg_value); } - return status; + } + return status; } /** @@ -456,8 +456,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetGPOStatus(uint16_t *const pGPOStat */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ConfigureGPO(const uint16_t ITConf) { - /* Write GPO configuration to register */ - return ST25DV_i2c_WriteRegister((uint8_t *)&ITConf, ST25DVXXKC_GPO1_REG, 1); + /* Write GPO configuration to register */ + return ST25DV_i2c_WriteRegister((uint8_t *)&ITConf, ST25DVXXKC_GPO1_REG, 1); } @@ -468,19 +468,19 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ConfigureGPO(const uint16_t ITConf) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadITPulse(ST25DV_PULSE_DURATION *const pITtime) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read ITtime register value */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO2_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read ITtime register value */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DVXXKC_GPO2_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract delay coefficient value */ - *pITtime = (ST25DV_PULSE_DURATION)reg_value; + /* Extract delay coefficient value */ + *pITtime = (ST25DV_PULSE_DURATION)reg_value; - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -491,13 +491,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadITPulse(ST25DV_PULSE_DURATION *co */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteITPulse(const ST25DV_PULSE_DURATION ITtime) { - uint8_t reg_value; + uint8_t reg_value; - /* prepare data to write */ - reg_value = (uint8_t)ITtime; + /* prepare data to write */ + reg_value = (uint8_t)ITtime; - /* Write value for ITtime register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DVXXKC_GPO2_REG, 1); + /* Write value for ITtime register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DVXXKC_GPO2_REG, 1); } /** @@ -508,8 +508,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteITPulse(const ST25DV_PULSE_DURAT */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDataCurrentAddr(uint8_t *const pData, const uint16_t NbByte) { - /* Read Data in user memory */ - return ST25DV_IO_Read(pData, ST25DV_ADDR_DATA_I2C, NbByte); + /* Read Data in user memory */ + return ST25DV_IO_Read(pData, ST25DV_ADDR_DATA_I2C, NbByte); } /** @@ -519,30 +519,30 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDataCurrentAddr(uint8_t *const pD */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadUID(ST25DV_UID *const pUid) { - uint8_t reg_value[8]; - uint8_t i; - NFCTAG_StatusTypeDef status; + uint8_t reg_value[8]; + uint8_t i; + NFCTAG_StatusTypeDef status; - /* Read value of UID registers */ - status = ST25DV_i2c_ReadRegister(reg_value, ST25DV_UID_REG, 8); - if (status != NFCTAG_OK) { - return status; - } + /* Read value of UID registers */ + status = ST25DV_i2c_ReadRegister(reg_value, ST25DV_UID_REG, 8); + if (status != NFCTAG_OK) { + return status; + } - /* Store information in 2 WORD */ - pUid->MsbUid = 0; + /* Store information in 2 WORD */ + pUid->MsbUid = 0; - for (i = 0; i < 4; i++) { - pUid->MsbUid = (pUid->MsbUid << 8) | reg_value[7 - i]; - } + for (i = 0; i < 4; i++) { + pUid->MsbUid = (pUid->MsbUid << 8) | reg_value[7 - i]; + } - pUid->LsbUid = 0; + pUid->LsbUid = 0; - for (i = 0; i < 4; i++) { - pUid->LsbUid = (pUid->LsbUid << 8) | reg_value[3 - i]; - } + for (i = 0; i < 4; i++) { + pUid->LsbUid = (pUid->LsbUid << 8) | reg_value[3 - i]; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -552,8 +552,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadUID(ST25DV_UID *const pUid) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDSFID(uint8_t *const pDsfid) { - /* Read DSFID register */ - return ST25DV_i2c_ReadRegister(pDsfid, ST25DV_DSFID_REG, 1); + /* Read DSFID register */ + return ST25DV_i2c_ReadRegister(pDsfid, ST25DV_DSFID_REG, 1); } /** @@ -563,22 +563,22 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDSFID(uint8_t *const pDsfid) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDsfidRFProtection(ST25DV_LOCK_STATUS *const pLockDsfid) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_LOCKDSFID_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_LOCKDSFID_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Lock Status */ - if (reg_value == 0) { - *pLockDsfid = ST25DV_UNLOCKED; - } else { - *pLockDsfid = ST25DV_LOCKED; - } - return NFCTAG_OK; + /* Extract Lock Status */ + if (reg_value == 0) { + *pLockDsfid = ST25DV_UNLOCKED; + } else { + *pLockDsfid = ST25DV_LOCKED; + } + return NFCTAG_OK; } /** @@ -588,8 +588,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadDsfidRFProtection(ST25DV_LOCK_STA */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadAFI(uint8_t *const pAfi) { - /* Read AFI register */ - return ST25DV_i2c_ReadRegister(pAfi, ST25DV_AFI_REG, 1); + /* Read AFI register */ + return ST25DV_i2c_ReadRegister(pAfi, ST25DV_AFI_REG, 1); } /** @@ -599,22 +599,22 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadAFI(uint8_t *const pAfi) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadAfiRFProtection(ST25DV_LOCK_STATUS *const pLockAfi) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_LOCKAFI_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_LOCKAFI_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Lock Status */ - if (reg_value == 0) { - *pLockAfi = ST25DV_UNLOCKED; - } else { - *pLockAfi = ST25DV_LOCKED; - } - return NFCTAG_OK; + /* Extract Lock Status */ + if (reg_value == 0) { + *pLockAfi = ST25DV_UNLOCKED; + } else { + *pLockAfi = ST25DV_LOCKED; + } + return NFCTAG_OK; } /** @@ -624,22 +624,22 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadAfiRFProtection(ST25DV_LOCK_STATU */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadI2CProtectZone(ST25DV_I2C_PROT_ZONE *const pProtZone) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read value of I2c Protected Zone register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_I2CZSS_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read value of I2c Protected Zone register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_I2CZSS_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Dispatch information to corresponding struct member */ - pProtZone->ProtectZone1 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ1_MASK) >> ST25DV_I2CZSS_PZ1_SHIFT); - pProtZone->ProtectZone2 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ2_MASK) >> ST25DV_I2CZSS_PZ2_SHIFT); - pProtZone->ProtectZone3 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ3_MASK) >> ST25DV_I2CZSS_PZ3_SHIFT); - pProtZone->ProtectZone4 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ4_MASK) >> ST25DV_I2CZSS_PZ4_SHIFT); + /* Dispatch information to corresponding struct member */ + pProtZone->ProtectZone1 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ1_MASK) >> ST25DV_I2CZSS_PZ1_SHIFT); + pProtZone->ProtectZone2 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ2_MASK) >> ST25DV_I2CZSS_PZ2_SHIFT); + pProtZone->ProtectZone3 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ3_MASK) >> ST25DV_I2CZSS_PZ3_SHIFT); + pProtZone->ProtectZone4 = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_I2CZSS_PZ4_MASK) >> ST25DV_I2CZSS_PZ4_SHIFT); - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -650,13 +650,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadI2CProtectZone(ST25DV_I2C_PROT_ZO */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteLockCFG(const ST25DV_LOCK_STATUS LockCfg) { - uint8_t reg_value; + uint8_t reg_value; - /* Configure value to write on register */ - reg_value = (uint8_t)LockCfg; + /* Configure value to write on register */ + reg_value = (uint8_t)LockCfg; - /* Write LOCKCFG register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_LOCKCFG_REG, 1); + /* Write LOCKCFG register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_LOCKCFG_REG, 1); } /** @@ -666,20 +666,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteLockCFG(const ST25DV_LOCK_STATUS */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_PresentI2CPassword(const ST25DV_PASSWD PassWord) { - uint8_t ai2c_message[17] = {0}; - uint8_t i; + uint8_t ai2c_message[17] = {0}; + uint8_t i; - /* Build I2C Message with Password + Validation code 0x09 + Password */ - ai2c_message[8] = 0x09; - for (i = 0; i < 4; i++) { - ai2c_message[i] = (PassWord.MsbPasswd >> ((3 - i) * 8)) & 0xFF; - ai2c_message[i + 4] = (PassWord.LsbPasswd >> ((3 - i) * 8)) & 0xFF; - ai2c_message[i + 9] = ai2c_message[i]; - ai2c_message[i + 13] = ai2c_message[i + 4]; - }; + /* Build I2C Message with Password + Validation code 0x09 + Password */ + ai2c_message[8] = 0x09; + for (i = 0; i < 4; i++) { + ai2c_message[i] = (PassWord.MsbPasswd >> ((3 - i) * 8)) & 0xFF; + ai2c_message[i + 4] = (PassWord.LsbPasswd >> ((3 - i) * 8)) & 0xFF; + ai2c_message[i + 9] = ai2c_message[i]; + ai2c_message[i + 13] = ai2c_message[i + 4]; + }; - /* Present password to ST25DV */ - return ST25DV_i2c_WriteRegister(ai2c_message, ST25DV_I2CPASSWD_REG, 17); + /* Present password to ST25DV */ + return ST25DV_i2c_WriteRegister(ai2c_message, ST25DV_I2CPASSWD_REG, 17); } /** @@ -690,21 +690,21 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_PresentI2CPassword(const ST25DV_PASSW */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteI2CPassword(const ST25DV_PASSWD PassWord) { - uint8_t ai2c_message[17] = {0}; - uint8_t i; + uint8_t ai2c_message[17] = {0}; + uint8_t i; - /* Build I2C Message with Password + Validation code 0x07 + Password */ - ai2c_message[8] = 0x07; + /* Build I2C Message with Password + Validation code 0x07 + Password */ + ai2c_message[8] = 0x07; - for (i = 0; i < 4; i++) { - ai2c_message[i] = (PassWord.MsbPasswd >> ((3 - i) * 8)) & 0xFF; - ai2c_message[i + 4] = (PassWord.LsbPasswd >> ((3 - i) * 8)) & 0xFF; - ai2c_message[i + 9] = ai2c_message[i]; - ai2c_message[i + 13] = ai2c_message[i + 4]; - }; + for (i = 0; i < 4; i++) { + ai2c_message[i] = (PassWord.MsbPasswd >> ((3 - i) * 8)) & 0xFF; + ai2c_message[i + 4] = (PassWord.LsbPasswd >> ((3 - i) * 8)) & 0xFF; + ai2c_message[i + 9] = ai2c_message[i]; + ai2c_message[i + 13] = ai2c_message[i + 4]; + }; - /* Write new password in I2CPASSWD register */ - return ST25DV_i2c_WriteRegister(ai2c_message, ST25DV_I2CPASSWD_REG, 17); + /* Write new password in I2CPASSWD register */ + return ST25DV_i2c_WriteRegister(ai2c_message, ST25DV_I2CPASSWD_REG, 17); } /** @@ -715,40 +715,40 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteI2CPassword(const ST25DV_PASSWD */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFZxSS(const ST25DV_PROTECTION_ZONE Zone, ST25DV_RF_PROT_ZONE *const pRfprotZone) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; - uint16_t sector_security_addr; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; + uint16_t sector_security_addr; - /* Select Sector Security register address */ - switch (Zone) { + /* Select Sector Security register address */ + switch (Zone) { case ST25DV_PROT_ZONE1: - sector_security_addr = ST25DV_RFZ1SS_REG; - break; + sector_security_addr = ST25DV_RFZ1SS_REG; + break; case ST25DV_PROT_ZONE2: - sector_security_addr = ST25DV_RFZ2SS_REG; - break; + sector_security_addr = ST25DV_RFZ2SS_REG; + break; case ST25DV_PROT_ZONE3: - sector_security_addr = ST25DV_RFZ3SS_REG; - break; + sector_security_addr = ST25DV_RFZ3SS_REG; + break; case ST25DV_PROT_ZONE4: - sector_security_addr = ST25DV_RFZ4SS_REG; - break; + sector_security_addr = ST25DV_RFZ4SS_REG; + break; default: - return NFCTAG_ERROR; - } + return NFCTAG_ERROR; + } - /* Read actual value of Sector Security Status register */ - status = ST25DV_i2c_ReadRegister(®_value, sector_security_addr, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of Sector Security Status register */ + status = ST25DV_i2c_ReadRegister(®_value, sector_security_addr, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Sector Security Status configuration */ - pRfprotZone->PasswdCtrl = (ST25DV_PASSWD_PROT_STATUS)((reg_value & ST25DV_RFZSS_PWDCTRL_MASK) >> ST25DV_RFZSS_PWDCTRL_SHIFT); - pRfprotZone->RWprotection = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_RFZSS_RWPROT_MASK) >> ST25DV_RFZSS_RWPROT_SHIFT); + /* Extract Sector Security Status configuration */ + pRfprotZone->PasswdCtrl = (ST25DV_PASSWD_PROT_STATUS)((reg_value & ST25DV_RFZSS_PWDCTRL_MASK) >> ST25DV_RFZSS_PWDCTRL_SHIFT); + pRfprotZone->RWprotection = (ST25DV_PROTECTION_CONF)((reg_value & ST25DV_RFZSS_RWPROT_MASK) >> ST25DV_RFZSS_RWPROT_SHIFT); - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -760,34 +760,34 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFZxSS(const ST25DV_PROTECTION_ZO */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFZxSS(const ST25DV_PROTECTION_ZONE Zone, const ST25DV_RF_PROT_ZONE RfProtZone) { - uint8_t reg_value; - uint16_t sector_security_addr; + uint8_t reg_value; + uint16_t sector_security_addr; - /* Select Sector Security register address */ - switch (Zone) { + /* Select Sector Security register address */ + switch (Zone) { case ST25DV_PROT_ZONE1: - sector_security_addr = ST25DV_RFZ1SS_REG; - break; + sector_security_addr = ST25DV_RFZ1SS_REG; + break; case ST25DV_PROT_ZONE2: - sector_security_addr = ST25DV_RFZ2SS_REG; - break; + sector_security_addr = ST25DV_RFZ2SS_REG; + break; case ST25DV_PROT_ZONE3: - sector_security_addr = ST25DV_RFZ3SS_REG; - break; + sector_security_addr = ST25DV_RFZ3SS_REG; + break; case ST25DV_PROT_ZONE4: - sector_security_addr = ST25DV_RFZ4SS_REG; - break; + sector_security_addr = ST25DV_RFZ4SS_REG; + break; default: - return NFCTAG_ERROR; - } + return NFCTAG_ERROR; + } - /* Update Sector Security Status */ - reg_value = (RfProtZone.RWprotection << ST25DV_RFZSS_RWPROT_SHIFT) & ST25DV_RFZSS_RWPROT_MASK; - reg_value |= ((RfProtZone.PasswdCtrl << ST25DV_RFZSS_PWDCTRL_SHIFT) & ST25DV_RFZSS_PWDCTRL_MASK); + /* Update Sector Security Status */ + reg_value = (RfProtZone.RWprotection << ST25DV_RFZSS_RWPROT_SHIFT) & ST25DV_RFZSS_RWPROT_MASK; + reg_value |= ((RfProtZone.PasswdCtrl << ST25DV_RFZSS_PWDCTRL_SHIFT) & ST25DV_RFZSS_PWDCTRL_MASK); - /* Write Sector Security register */ - return ST25DV_i2c_WriteRegister(®_value, sector_security_addr, 1); + /* Write Sector Security register */ + return ST25DV_i2c_WriteRegister(®_value, sector_security_addr, 1); } /** @@ -798,26 +798,26 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFZxSS(const ST25DV_PROTECTION_Z */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEndZonex(const ST25DV_END_ZONE EndZone, uint8_t *const pEndZ) { - uint16_t mem_addr; + uint16_t mem_addr; - /* End zone register address to read */ - switch (EndZone) { + /* End zone register address to read */ + switch (EndZone) { case ST25DV_ZONE_END1: - mem_addr = ST25DV_END1_REG; - break; + mem_addr = ST25DV_END1_REG; + break; case ST25DV_ZONE_END2: - mem_addr = ST25DV_END2_REG; - break; + mem_addr = ST25DV_END2_REG; + break; case ST25DV_ZONE_END3: - mem_addr = ST25DV_END3_REG; - break; + mem_addr = ST25DV_END3_REG; + break; default: - return NFCTAG_ERROR; - } + return NFCTAG_ERROR; + } - /* Read the corresponding End zone */ - return ST25DV_i2c_ReadRegister(pEndZ, mem_addr, 1); + /* Read the corresponding End zone */ + return ST25DV_i2c_ReadRegister(pEndZ, mem_addr, 1); } /** @@ -831,29 +831,29 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEndZonex(const ST25DV_END_ZONE En */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteEndZonex(const ST25DV_END_ZONE EndZone, const uint8_t EndZ) { - uint16_t mem_addr; - NFCTAG_StatusTypeDef ret; + uint16_t mem_addr; + NFCTAG_StatusTypeDef ret; - /* End zone register address to write */ - switch (EndZone) { + /* End zone register address to write */ + switch (EndZone) { case ST25DV_ZONE_END1: - mem_addr = ST25DV_END1_REG; - break; + mem_addr = ST25DV_END1_REG; + break; case ST25DV_ZONE_END2: - mem_addr = ST25DV_END2_REG; - break; + mem_addr = ST25DV_END2_REG; + break; case ST25DV_ZONE_END3: - mem_addr = ST25DV_END3_REG; - break; + mem_addr = ST25DV_END3_REG; + break; default: - return NFCTAG_ERROR; - } + return NFCTAG_ERROR; + } - /* Write the corresponding End zone value in register */ - ret = ST25DV_i2c_WriteRegister(&EndZ, mem_addr, 1); + /* Write the corresponding End zone value in register */ + ret = ST25DV_i2c_WriteRegister(&EndZ, mem_addr, 1); - return ret; + return ret; } /** @@ -865,38 +865,38 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteEndZonex(const ST25DV_END_ZONE E */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_InitEndZone(void) { - uint8_t endval = 0xFF; - uint32_t maxmemlength; - ST25DV_MEM_SIZE memsize; - NFCTAG_StatusTypeDef ret; - - memsize.Mem_Size = 0; - memsize.BlockSize = 0; + uint8_t endval = 0xFF; + uint32_t maxmemlength; + ST25DV_MEM_SIZE memsize; + NFCTAG_StatusTypeDef ret; - /* Get EEPROM mem size */ - ST25DV_i2c_ReadMemSize(&memsize); - maxmemlength = (memsize.Mem_Size + 1) * (memsize.BlockSize + 1); + memsize.Mem_Size = 0; + memsize.BlockSize = 0; - /* Compute Max value for endzone register */ - endval = (maxmemlength / 32) - 1; + /* Get EEPROM mem size */ + ST25DV_i2c_ReadMemSize(&memsize); + maxmemlength = (memsize.Mem_Size + 1) * (memsize.BlockSize + 1); - /* Write EndZone value to ST25DV registers */ - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END3, endval); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + /* Compute Max value for endzone register */ + endval = (maxmemlength / 32) - 1; - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END2, endval); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + /* Write EndZone value to ST25DV registers */ + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END3, endval); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END1, endval); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END2, endval); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END1, endval); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { return ret; + } + + return ret; } /** @@ -910,68 +910,68 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_InitEndZone(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_CreateUserZone(uint16_t Zone1Length, uint16_t Zone2Length, uint16_t Zone3Length, uint16_t Zone4Length) { - uint8_t EndVal; - ST25DV_MEM_SIZE memsize; - uint16_t maxmemlength = 0; - NFCTAG_StatusTypeDef ret; + uint8_t EndVal; + ST25DV_MEM_SIZE memsize; + uint16_t maxmemlength = 0; + NFCTAG_StatusTypeDef ret; - memsize.Mem_Size = 0; - memsize.BlockSize = 0; + memsize.Mem_Size = 0; + memsize.BlockSize = 0; - ST25DV_i2c_ReadMemSize(&memsize); + ST25DV_i2c_ReadMemSize(&memsize); - maxmemlength = (memsize.Mem_Size + 1) * (memsize.BlockSize + 1); + maxmemlength = (memsize.Mem_Size + 1) * (memsize.BlockSize + 1); - /* Checks that values of different zones are in bounds */ - if ((Zone1Length < 32) || (Zone1Length > maxmemlength) || (Zone2Length > (maxmemlength - 32)) - || (Zone3Length > (maxmemlength - 64)) || (Zone4Length > (maxmemlength - 96))) { - return NFCTAG_ERROR; - } + /* Checks that values of different zones are in bounds */ + if ((Zone1Length < 32) || (Zone1Length > maxmemlength) || (Zone2Length > (maxmemlength - 32)) + || (Zone3Length > (maxmemlength - 64)) || (Zone4Length > (maxmemlength - 96))) { + return NFCTAG_ERROR; + } - /* Checks that the total is less than the authorised maximum */ - if ((Zone1Length + Zone2Length + Zone3Length + Zone4Length) > maxmemlength) { - return NFCTAG_ERROR; - } + /* Checks that the total is less than the authorised maximum */ + if ((Zone1Length + Zone2Length + Zone3Length + Zone4Length) > maxmemlength) { + return NFCTAG_ERROR; + } - /* if The value for each Length is not a multiple of 64 correct it. */ - if ((Zone1Length % 32) != 0) { - Zone1Length = Zone1Length - (Zone1Length % 32); - } + /* if The value for each Length is not a multiple of 64 correct it. */ + if ((Zone1Length % 32) != 0) { + Zone1Length = Zone1Length - (Zone1Length % 32); + } - if ((Zone2Length % 32) != 0) { - Zone2Length = Zone2Length - (Zone2Length % 32); - } + if ((Zone2Length % 32) != 0) { + Zone2Length = Zone2Length - (Zone2Length % 32); + } - if ((Zone3Length % 32) != 0) { - Zone3Length = Zone3Length - (Zone3Length % 32); - } + if ((Zone3Length % 32) != 0) { + Zone3Length = Zone3Length - (Zone3Length % 32); + } - /* First right 0xFF in each Endx value */ - ret = ST25DV_i2c_InitEndZone(); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + /* First right 0xFF in each Endx value */ + ret = ST25DV_i2c_InitEndZone(); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } - /* Then Write corresponding value for each zone */ - EndVal = (uint8_t)((Zone1Length / 32) - 1); - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END1, EndVal); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + /* Then Write corresponding value for each zone */ + EndVal = (uint8_t)((Zone1Length / 32) - 1); + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END1, EndVal); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } - EndVal = (uint8_t)(((Zone1Length + Zone2Length) / 32) - 1); - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END2, EndVal); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + EndVal = (uint8_t)(((Zone1Length + Zone2Length) / 32) - 1); + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END2, EndVal); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } - EndVal = (uint8_t)(((Zone1Length + Zone2Length + Zone3Length) / 32) - 1); - ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END3, EndVal); - if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { - return ret; - } + EndVal = (uint8_t)(((Zone1Length + Zone2Length + Zone3Length) / 32) - 1); + ret = ST25DV_i2c_WriteEndZonex(ST25DV_ZONE_END3, EndVal); + if ((ret != NFCTAG_OK) && (ret != NFCTAG_NACK)) { + return ret; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -981,20 +981,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_CreateUserZone(uint16_t Zone1Length, */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMemSize(ST25DV_MEM_SIZE *const pSizeInfo) { - uint8_t reg_value[3]; - NFCTAG_StatusTypeDef status; + uint8_t reg_value[3]; + NFCTAG_StatusTypeDef status; - /* Read actual value of MEM_SIZE register */ - status = ST25DV_i2c_ReadRegister(reg_value, ST25DV_MEM_SIZE_REG, 3); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of MEM_SIZE register */ + status = ST25DV_i2c_ReadRegister(reg_value, ST25DV_MEM_SIZE_REG, 3); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Memory information */ - pSizeInfo->BlockSize = reg_value[2]; - pSizeInfo->Mem_Size = reg_value[1]; - pSizeInfo->Mem_Size = (pSizeInfo->Mem_Size << 8) | reg_value[0]; - return NFCTAG_OK; + /* Extract Memory information */ + pSizeInfo->BlockSize = reg_value[2]; + pSizeInfo->Mem_Size = reg_value[1]; + pSizeInfo->Mem_Size = (pSizeInfo->Mem_Size << 8) | reg_value[0]; + return NFCTAG_OK; } /** @@ -1004,23 +1004,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMemSize(ST25DV_MEM_SIZE *const pS */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEHMode(ST25DV_EH_MODE_STATUS *const pEH_mode) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of EH_MODE register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_EH_MODE_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of EH_MODE register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_EH_MODE_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract EH_mode configuration */ - if ((reg_value & ST25DV_EH_MODE_MASK) == ST25DV_EH_MODE_MASK) { - *pEH_mode = ST25DV_EH_ON_DEMAND; - } else { - *pEH_mode = ST25DV_EH_ACTIVE_AFTER_BOOT; - } + /* Extract EH_mode configuration */ + if ((reg_value & ST25DV_EH_MODE_MASK) == ST25DV_EH_MODE_MASK) { + *pEH_mode = ST25DV_EH_ON_DEMAND; + } else { + *pEH_mode = ST25DV_EH_ACTIVE_AFTER_BOOT; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1031,13 +1031,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEHMode(ST25DV_EH_MODE_STATUS *con */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteEHMode(const ST25DV_EH_MODE_STATUS EH_mode) { - uint8_t reg_value; + uint8_t reg_value; - /* Update EH_mode */ - reg_value = (uint8_t)EH_mode; + /* Update EH_mode */ + reg_value = (uint8_t)EH_mode; - /* Write EH_MODE register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_EH_MODE_REG, 1); + /* Write EH_MODE register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_EH_MODE_REG, 1); } /** @@ -1047,29 +1047,29 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteEHMode(const ST25DV_EH_MODE_STAT */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFMngt(ST25DV_RF_MNGT *const pRF_Mngt) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Read actual value of RF_MNGT register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); - if (status == NFCTAG_OK) { - /* Extract RF Disable information */ - if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { - pRF_Mngt->RfDisable = ST25DV_ENABLE; - } else { - pRF_Mngt->RfDisable = ST25DV_DISABLE; - } - - /* Extract RF Sleep information */ - if ((reg_value & ST25DV_RF_MNGT_RFSLEEP_MASK) == ST25DV_RF_MNGT_RFSLEEP_MASK) { - pRF_Mngt->RfSleep = ST25DV_ENABLE; - } else { - pRF_Mngt->RfSleep = ST25DV_DISABLE; - } + if (status == NFCTAG_OK) { + /* Extract RF Disable information */ + if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { + pRF_Mngt->RfDisable = ST25DV_ENABLE; + } else { + pRF_Mngt->RfDisable = ST25DV_DISABLE; } - return status; + /* Extract RF Sleep information */ + if ((reg_value & ST25DV_RF_MNGT_RFSLEEP_MASK) == ST25DV_RF_MNGT_RFSLEEP_MASK) { + pRF_Mngt->RfSleep = ST25DV_ENABLE; + } else { + pRF_Mngt->RfSleep = ST25DV_DISABLE; + } + } + + return status; } /** @@ -1080,8 +1080,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFMngt(ST25DV_RF_MNGT *const pRF_ */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFMngt(const uint8_t Rfmngt) { - /* Write RF_MNGT register */ - return ST25DV_i2c_WriteRegister(&Rfmngt, ST25DV_RF_MNGT_REG, 1); + /* Write RF_MNGT register */ + return ST25DV_i2c_WriteRegister(&Rfmngt, ST25DV_RF_MNGT_REG, 1); } /** @@ -1091,23 +1091,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFMngt(const uint8_t Rfmngt) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFDisable(ST25DV_EN_STATUS *const pRFDisable) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Read actual value of RF_MNGT register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_REG, 1); - /* Extract RFDisable information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { - *pRFDisable = ST25DV_ENABLE; - } else { - *pRFDisable = ST25DV_DISABLE; - } - return NFCTAG_OK; + /* Extract RFDisable information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { + *pRFDisable = ST25DV_ENABLE; + } else { + *pRFDisable = ST25DV_DISABLE; } + return NFCTAG_OK; + } - return status; + return status; } /** @@ -1117,20 +1117,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFDisable(ST25DV_EN_STATUS *const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFDisable(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_RMNGT register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_RMNGT register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update RF Disable field configuration */ - reg_value |= ST25DV_RF_MNGT_RFDIS_MASK; + /* Update RF Disable field configuration */ + reg_value |= ST25DV_RF_MNGT_RFDIS_MASK; - /* Write RF_MNGT register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Write RF_MNGT register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); } /** @@ -1140,20 +1140,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFDisable(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFDisable(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_RMNGT register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_RMNGT register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update RF Disable field configuration */ - reg_value &= ST25DV_RF_MNGT_RFDIS_FIELD; + /* Update RF Disable field configuration */ + reg_value &= ST25DV_RF_MNGT_RFDIS_FIELD; - /* Write RF_MNGT register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Write RF_MNGT register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); } /** @@ -1163,23 +1163,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFDisable(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFSleep(ST25DV_EN_STATUS *const pRFSleep) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Read actual value of RF_MNGT register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_REG, 1); - /* Extract RFSleep information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { - *pRFSleep = ST25DV_ENABLE; - } else { - *pRFSleep = ST25DV_DISABLE; - } - return NFCTAG_OK; + /* Extract RFSleep information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_RF_MNGT_RFDIS_MASK) == ST25DV_RF_MNGT_RFDIS_MASK) { + *pRFSleep = ST25DV_ENABLE; + } else { + *pRFSleep = ST25DV_DISABLE; } + return NFCTAG_OK; + } - return status; + return status; } /** @@ -1189,20 +1189,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFSleep(ST25DV_EN_STATUS *const pR */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFSleep(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_RMNGT register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_RMNGT register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update RF Sleep field configuration */ - reg_value |= ST25DV_RF_MNGT_RFSLEEP_MASK; + /* Update RF Sleep field configuration */ + reg_value |= ST25DV_RF_MNGT_RFSLEEP_MASK; - /* Write RF_MNGT register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Write RF_MNGT register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); } /** @@ -1212,20 +1212,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFSleep(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFSleep(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_RMNGT register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_RMNGT register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_RF_MNGT_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update RF Sleep field configuration */ - reg_value &= ST25DV_RF_MNGT_RFSLEEP_FIELD; + /* Update RF Sleep field configuration */ + reg_value &= ST25DV_RF_MNGT_RFSLEEP_FIELD; - /* Write RF_MNGT register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); + /* Write RF_MNGT register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_RF_MNGT_REG, 1); } /** @@ -1235,23 +1235,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFSleep(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBMode(ST25DV_EN_STATUS *const pMB_mode) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of MB_MODE register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_MB_MODE_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of MB_MODE register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_MB_MODE_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Mailbox mode status */ - if ((reg_value & ST25DV_MB_MODE_RW_MASK) == ST25DV_MB_MODE_RW_MASK) { - *pMB_mode = ST25DV_ENABLE; - } else { - *pMB_mode = ST25DV_DISABLE; - } + /* Extract Mailbox mode status */ + if ((reg_value & ST25DV_MB_MODE_RW_MASK) == ST25DV_MB_MODE_RW_MASK) { + *pMB_mode = ST25DV_ENABLE; + } else { + *pMB_mode = ST25DV_DISABLE; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1262,13 +1262,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBMode(ST25DV_EN_STATUS *const pM */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMBMode(const ST25DV_EN_STATUS MB_mode) { - uint8_t reg_value; + uint8_t reg_value; - /* Update Mailbox mode status */ - reg_value = (uint8_t)MB_mode; + /* Update Mailbox mode status */ + reg_value = (uint8_t)MB_mode; - /* Write MB_MODE register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_MB_MODE_REG, 1); + /* Write MB_MODE register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_MB_MODE_REG, 1); } /** @@ -1278,19 +1278,19 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMBMode(const ST25DV_EN_STATUS MB */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBWDG(uint8_t *const pWdgDelay) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of MB_WDG register */ - status = ST25DV_i2c_ReadRegister(®_value, ST25DV_MB_WDG_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of MB_WDG register */ + status = ST25DV_i2c_ReadRegister(®_value, ST25DV_MB_WDG_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract watchdog coefficient delay configuration */ - *pWdgDelay = (reg_value & ST25DV_MB_WDG_DELAY_MASK) >> ST25DV_MB_WDG_DELAY_RW_SHIFT; + /* Extract watchdog coefficient delay configuration */ + *pWdgDelay = (reg_value & ST25DV_MB_WDG_DELAY_MASK) >> ST25DV_MB_WDG_DELAY_RW_SHIFT; - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1301,13 +1301,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBWDG(uint8_t *const pWdgDelay) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMBWDG(const uint8_t WdgDelay) { - uint8_t reg_value; + uint8_t reg_value; - /* Set Watchdog coefficient delay */ - reg_value = WdgDelay & ST25DV_MB_WDG_DELAY_MASK; + /* Set Watchdog coefficient delay */ + reg_value = WdgDelay & ST25DV_MB_WDG_DELAY_MASK; - /* Write MB_MODE register */ - return ST25DV_i2c_WriteRegister(®_value, ST25DV_MB_WDG_REG, 1); + /* Write MB_MODE register */ + return ST25DV_i2c_WriteRegister(®_value, ST25DV_MB_WDG_REG, 1); } /** @@ -1319,12 +1319,12 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMBWDG(const uint8_t WdgDelay) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMailboxData(uint8_t *const pData, const uint16_t Offset, const uint16_t NbByte) { - if (Offset > ST25DV_MAX_MAILBOX_LENGTH) { - return NFCTAG_ERROR; - } + if (Offset > ST25DV_MAX_MAILBOX_LENGTH) { + return NFCTAG_ERROR; + } - /* Read Data in user memory */ - return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, ST25DV_MAILBOX_RAM_REG + Offset, NbByte); + /* Read Data in user memory */ + return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, ST25DV_MAILBOX_RAM_REG + Offset, NbByte); } /** @@ -1335,17 +1335,17 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMailboxData(uint8_t *const pData, */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMailboxData(const uint8_t *const pData, const uint16_t NbByte) { - NFCTAG_StatusTypeDef status; + NFCTAG_StatusTypeDef status; - /* ST25DV can write a maximum of 256 bytes in Mailbox */ - if (NbByte < ST25DV_MAX_MAILBOX_LENGTH) { - /* Write NbByte data in memory */ - status = ST25DV_IO_MemWrite(pData, ST25DV_ADDR_DATA_I2C, ST25DV_MAILBOX_RAM_REG, NbByte); - } else { - status = NFCTAG_ERROR; - } + /* ST25DV can write a maximum of 256 bytes in Mailbox */ + if (NbByte < ST25DV_MAX_MAILBOX_LENGTH) { + /* Write NbByte data in memory */ + status = ST25DV_IO_MemWrite(pData, ST25DV_ADDR_DATA_I2C, ST25DV_MAILBOX_RAM_REG, NbByte); + } else { + status = NFCTAG_ERROR; + } - return status; + return status; } /** @@ -1357,11 +1357,11 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMailboxData(const uint8_t *const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMailboxRegister(uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - if ((TarAddr < ST25DV_GPO_DYN_REG) || (TarAddr > ST25DV_MB_LEN_DYN_REG)) { - return NFCTAG_ERROR; - } + if ((TarAddr < ST25DV_GPO_DYN_REG) || (TarAddr > ST25DV_MB_LEN_DYN_REG)) { + return NFCTAG_ERROR; + } - return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); + return ST25DV_IO_MemRead(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); } /** @@ -1373,21 +1373,21 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMailboxRegister(uint8_t *const pD */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMailboxRegister(const uint8_t *const pData, const uint16_t TarAddr, const uint16_t NbByte) { - NFCTAG_StatusTypeDef status; + NFCTAG_StatusTypeDef status; - if ((TarAddr < ST25DV_GPO_DYN_REG) || (TarAddr > ST25DV_MB_LEN_DYN_REG)) { - return NFCTAG_ERROR; - } + if ((TarAddr < ST25DV_GPO_DYN_REG) || (TarAddr > ST25DV_MB_LEN_DYN_REG)) { + return NFCTAG_ERROR; + } - /* ST25DV can write a maximum of 256 bytes in Mailbox */ - if (NbByte < ST25DV_MAX_MAILBOX_LENGTH) { - /* Write NbByte data in memory */ - status = ST25DV_IO_MemWrite(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); - } else { - status = NFCTAG_ERROR; - } + /* ST25DV can write a maximum of 256 bytes in Mailbox */ + if (NbByte < ST25DV_MAX_MAILBOX_LENGTH) { + /* Write NbByte data in memory */ + status = ST25DV_IO_MemWrite(pData, ST25DV_ADDR_DATA_I2C, TarAddr, NbByte); + } else { + status = NFCTAG_ERROR; + } - return status; + return status; } /** @@ -1397,23 +1397,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteMailboxRegister(const uint8_t *c */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadI2CSecuritySession_Dyn(ST25DV_I2CSSO_STATUS *const pSession) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of I2C_SSO_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_I2C_SSO_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of I2C_SSO_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_I2C_SSO_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Open session information */ - if ((reg_value & ST25DV_I2C_SSO_DYN_I2CSSO_MASK) == ST25DV_I2C_SSO_DYN_I2CSSO_MASK) { - *pSession = ST25DV_SESSION_OPEN; - } else { - *pSession = ST25DV_SESSION_CLOSED; - } + /* Extract Open session information */ + if ((reg_value & ST25DV_I2C_SSO_DYN_I2CSSO_MASK) == ST25DV_I2C_SSO_DYN_I2CSSO_MASK) { + *pSession = ST25DV_SESSION_OPEN; + } else { + *pSession = ST25DV_SESSION_CLOSED; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1432,8 +1432,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadI2CSecuritySession_Dyn(ST25DV_I2C */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadITSTStatus_Dyn(uint8_t *const pITStatus) { - /* Read value of ITStatus register */ - return ST25DV_i2c_ReadMailboxRegister(pITStatus, ST25DV_ITSTS_DYN_REG, 1); + /* Read value of ITStatus register */ + return ST25DV_i2c_ReadMailboxRegister(pITStatus, ST25DV_ITSTS_DYN_REG, 1); } /** @@ -1443,8 +1443,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadITSTStatus_Dyn(uint8_t *const pIT */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadGPO_Dyn(uint8_t *GPOConfig) { - /* Read actual value of ST25DV_GPO_DYN_REG register */ - return ST25DV_i2c_ReadMailboxRegister(GPOConfig, ST25DV_GPO_DYN_REG, 1); + /* Read actual value of ST25DV_GPO_DYN_REG register */ + return ST25DV_i2c_ReadMailboxRegister(GPOConfig, ST25DV_GPO_DYN_REG, 1); } @@ -1455,22 +1455,22 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadGPO_Dyn(uint8_t *GPOConfig) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetGPO_en_Dyn(ST25DV_EN_STATUS *const pGPO_en) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; - /* Read actual value of GPO_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + uint8_t reg_value; + NFCTAG_StatusTypeDef status; + /* Read actual value of GPO_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract GPO enable status information */ - if ((reg_value & ST25DV_GPO_DYN_ENABLE_MASK) == ST25DV_GPO_DYN_ENABLE_MASK) { - *pGPO_en = ST25DV_ENABLE; - } else { - *pGPO_en = ST25DV_DISABLE; - } + /* Extract GPO enable status information */ + if ((reg_value & ST25DV_GPO_DYN_ENABLE_MASK) == ST25DV_GPO_DYN_ENABLE_MASK) { + *pGPO_en = ST25DV_ENABLE; + } else { + *pGPO_en = ST25DV_DISABLE; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1480,20 +1480,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetGPO_en_Dyn(ST25DV_EN_STATUS *const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetGPO_en_Dyn(void) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of GPO_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of GPO_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update GPO enable configuration */ - reg_value |= ST25DV_GPO_DYN_ENABLE_MASK; + /* Update GPO enable configuration */ + reg_value |= ST25DV_GPO_DYN_ENABLE_MASK; - /* Write GPO_DYN Register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); + /* Write GPO_DYN Register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); } /** @@ -1503,20 +1503,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetGPO_en_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetGPO_en_Dyn(void) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of GPO_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of GPO_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update GPO enable configuration */ - reg_value &= ST25DV_GPO_DYN_ENABLE_FIELD; + /* Update GPO enable configuration */ + reg_value &= ST25DV_GPO_DYN_ENABLE_FIELD; - /* Write GPO_DYN Register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); + /* Write GPO_DYN Register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_GPO_DYN_REG, 1); } /** @@ -1526,45 +1526,45 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetGPO_en_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEHCtrl_Dyn(ST25DV_EH_CTRL *const pEH_CTRL) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of ST25DV_EH_CTRL_DYN_REG register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + /* Read actual value of ST25DV_EH_CTRL_DYN_REG register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - if (status == NFCTAG_OK) { - /* Extract EH EN Mode configuration */ - if ((reg_value & ST25DV_EH_CTRL_DYN_EH_EN_MASK) == ST25DV_EH_CTRL_DYN_EH_EN_MASK) { - pEH_CTRL->EH_EN_Mode = ST25DV_ENABLE; - } else { - pEH_CTRL->EH_EN_Mode = ST25DV_DISABLE; - } - - /* Extract EH_ON configuration */ - if ((reg_value & ST25DV_EH_CTRL_DYN_EH_ON_MASK) == ST25DV_EH_CTRL_DYN_EH_ON_MASK) { - pEH_CTRL->EH_on = ST25DV_ENABLE; - } else { - pEH_CTRL->EH_on = ST25DV_DISABLE; - } - - /* Extract FIELD_ON configuration */ - if ((reg_value & ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) == ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) { - pEH_CTRL->Field_on = ST25DV_ENABLE; - } else { - pEH_CTRL->Field_on = ST25DV_DISABLE; - } - - /* Extract VCC_ON configuration */ - if ((reg_value & ST25DV_EH_CTRL_DYN_VCC_ON_MASK) == ST25DV_EH_CTRL_DYN_VCC_ON_MASK) { - pEH_CTRL->VCC_on = ST25DV_ENABLE; - } else { - pEH_CTRL->VCC_on = ST25DV_DISABLE; - } - - return NFCTAG_OK; + if (status == NFCTAG_OK) { + /* Extract EH EN Mode configuration */ + if ((reg_value & ST25DV_EH_CTRL_DYN_EH_EN_MASK) == ST25DV_EH_CTRL_DYN_EH_EN_MASK) { + pEH_CTRL->EH_EN_Mode = ST25DV_ENABLE; + } else { + pEH_CTRL->EH_EN_Mode = ST25DV_DISABLE; } - return status; + /* Extract EH_ON configuration */ + if ((reg_value & ST25DV_EH_CTRL_DYN_EH_ON_MASK) == ST25DV_EH_CTRL_DYN_EH_ON_MASK) { + pEH_CTRL->EH_on = ST25DV_ENABLE; + } else { + pEH_CTRL->EH_on = ST25DV_DISABLE; + } + + /* Extract FIELD_ON configuration */ + if ((reg_value & ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) == ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) { + pEH_CTRL->Field_on = ST25DV_ENABLE; + } else { + pEH_CTRL->Field_on = ST25DV_DISABLE; + } + + /* Extract VCC_ON configuration */ + if ((reg_value & ST25DV_EH_CTRL_DYN_VCC_ON_MASK) == ST25DV_EH_CTRL_DYN_VCC_ON_MASK) { + pEH_CTRL->VCC_on = ST25DV_ENABLE; + } else { + pEH_CTRL->VCC_on = ST25DV_DISABLE; + } + + return NFCTAG_OK; + } + + return status; } /** @@ -1574,23 +1574,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadEHCtrl_Dyn(ST25DV_EH_CTRL *const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetEHENMode_Dyn(ST25DV_EN_STATUS *const pEH_Val) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Energy Harvesting status information */ - if ((reg_value & ST25DV_EH_CTRL_DYN_EH_EN_MASK) == ST25DV_EH_CTRL_DYN_EH_EN_MASK) { - *pEH_Val = ST25DV_ENABLE; - } else { - *pEH_Val = ST25DV_DISABLE; - } + /* Extract Energy Harvesting status information */ + if ((reg_value & ST25DV_EH_CTRL_DYN_EH_EN_MASK) == ST25DV_EH_CTRL_DYN_EH_EN_MASK) { + *pEH_Val = ST25DV_ENABLE; + } else { + *pEH_Val = ST25DV_DISABLE; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1599,20 +1599,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetEHENMode_Dyn(ST25DV_EN_STATUS *con */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetEHENMode_Dyn(void) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update Energy Harvesting configuration */ - reg_value |= ST25DV_EH_CTRL_DYN_EH_EN_MASK; + /* Update Energy Harvesting configuration */ + reg_value |= ST25DV_EH_CTRL_DYN_EH_EN_MASK; - /* Write EH_CTRL_DYN Register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + /* Write EH_CTRL_DYN Register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); } /** @@ -1621,20 +1621,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetEHENMode_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetEHENMode_Dyn(void) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update Energy Harvesting configuration */ - reg_value &= ST25DV_EH_CTRL_DYN_EH_EN_FIELD; + /* Update Energy Harvesting configuration */ + reg_value &= ST25DV_EH_CTRL_DYN_EH_EN_FIELD; - /* Write EH_CTRL_DYN Register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + /* Write EH_CTRL_DYN Register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); } /** @@ -1644,23 +1644,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetEHENMode_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetEHON_Dyn(ST25DV_EN_STATUS *const pEHON) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - /* Extract RF Field information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_EH_CTRL_DYN_EH_ON_MASK) == ST25DV_EH_CTRL_DYN_EH_ON_MASK) { - *pEHON = ST25DV_ENABLE; - } else { - *pEHON = ST25DV_DISABLE; - } - return NFCTAG_OK; + /* Extract RF Field information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_EH_CTRL_DYN_EH_ON_MASK) == ST25DV_EH_CTRL_DYN_EH_ON_MASK) { + *pEHON = ST25DV_ENABLE; + } else { + *pEHON = ST25DV_DISABLE; } + return NFCTAG_OK; + } - return status; + return status; } /** @@ -1670,23 +1670,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetEHON_Dyn(ST25DV_EN_STATUS *const p */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFField_Dyn(ST25DV_FIELD_STATUS *const pRF_Field) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - /* Extract RF Field information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) == ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) { - *pRF_Field = ST25DV_FIELD_ON; - } else { - *pRF_Field = ST25DV_FIELD_OFF; - } - return NFCTAG_OK; + /* Extract RF Field information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) == ST25DV_EH_CTRL_DYN_FIELD_ON_MASK) { + *pRF_Field = ST25DV_FIELD_ON; + } else { + *pRF_Field = ST25DV_FIELD_OFF; } + return NFCTAG_OK; + } - return status; + return status; } /** @@ -1696,23 +1696,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFField_Dyn(ST25DV_FIELD_STATUS *c */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetVCC_Dyn(ST25DV_VCC_STATUS *const pVCC) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of EH_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); + /* Read actual value of EH_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_EH_CTRL_DYN_REG, 1); - /* Extract VCC information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_EH_CTRL_DYN_VCC_ON_MASK) == ST25DV_EH_CTRL_DYN_VCC_ON_MASK) { - *pVCC = ST25DV_VCC_ON; - } else { - *pVCC = ST25DV_VCC_OFF; - } - return NFCTAG_OK; + /* Extract VCC information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_EH_CTRL_DYN_VCC_ON_MASK) == ST25DV_EH_CTRL_DYN_VCC_ON_MASK) { + *pVCC = ST25DV_VCC_ON; + } else { + *pVCC = ST25DV_VCC_OFF; } + return NFCTAG_OK; + } - return status; + return status; } /** @@ -1722,31 +1722,31 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetVCC_Dyn(ST25DV_VCC_STATUS *const p */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFMngt_Dyn(ST25DV_RF_MNGT *const pRF_Mngt) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - if (status == NFCTAG_OK) { - /* Extract RF Disable configuration */ - if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { - pRF_Mngt->RfDisable = ST25DV_ENABLE; - } else { - pRF_Mngt->RfDisable = ST25DV_DISABLE; - } - - /* Extract RF Sleep configuration */ - if ((reg_value & ST25DV_RF_MNGT_DYN_RFSLEEP_MASK) == ST25DV_RF_MNGT_DYN_RFSLEEP_MASK) { - pRF_Mngt->RfSleep = ST25DV_ENABLE; - } else { - pRF_Mngt->RfSleep = ST25DV_DISABLE; - } - - return NFCTAG_OK; + if (status == NFCTAG_OK) { + /* Extract RF Disable configuration */ + if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { + pRF_Mngt->RfDisable = ST25DV_ENABLE; + } else { + pRF_Mngt->RfDisable = ST25DV_DISABLE; } - return status; + /* Extract RF Sleep configuration */ + if ((reg_value & ST25DV_RF_MNGT_DYN_RFSLEEP_MASK) == ST25DV_RF_MNGT_DYN_RFSLEEP_MASK) { + pRF_Mngt->RfSleep = ST25DV_ENABLE; + } else { + pRF_Mngt->RfSleep = ST25DV_DISABLE; + } + + return NFCTAG_OK; + } + + return status; } /** @@ -1756,8 +1756,8 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadRFMngt_Dyn(ST25DV_RF_MNGT *const */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFMngt_Dyn(const uint8_t RF_Mngt) { - /* Write value to RF_MNGT_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(&RF_Mngt, ST25DV_RF_MNGT_DYN_REG, 1); + /* Write value to RF_MNGT_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(&RF_Mngt, ST25DV_RF_MNGT_DYN_REG, 1); } /** @@ -1767,23 +1767,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_WriteRFMngt_Dyn(const uint8_t RF_Mngt */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFDisable_Dyn(ST25DV_EN_STATUS *const pRFDisable) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - /* Extract RFDisable information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { - *pRFDisable = ST25DV_ENABLE; - } else { - *pRFDisable = ST25DV_DISABLE; - } - return NFCTAG_OK; + /* Extract RFDisable information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { + *pRFDisable = ST25DV_ENABLE; + } else { + *pRFDisable = ST25DV_DISABLE; } + return NFCTAG_OK; + } - return status; + return status; } /** @@ -1792,20 +1792,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFDisable_Dyn(ST25DV_EN_STATUS *co */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFDisable_Dyn(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update dynamic RF Disable field */ - reg_value |= ST25DV_RF_MNGT_DYN_RFDIS_MASK; + /* Update dynamic RF Disable field */ + reg_value |= ST25DV_RF_MNGT_DYN_RFDIS_MASK; - /* Write RF_MNGT_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Write RF_MNGT_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); } /** @@ -1814,20 +1814,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFDisable_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFDisable_Dyn(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update dynamic RF Disable field configuration */ - reg_value &= ST25DV_RF_MNGT_DYN_RFDIS_FIELD; + /* Update dynamic RF Disable field configuration */ + reg_value &= ST25DV_RF_MNGT_DYN_RFDIS_FIELD; - /* Write RF_MNGT_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Write RF_MNGT_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); } /** @@ -1837,23 +1837,23 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFDisable_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFSleep_Dyn(ST25DV_EN_STATUS *const pRFSleep) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - /* Extract RFSleep information */ - if (status == NFCTAG_OK) { - if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { - *pRFSleep = ST25DV_ENABLE; - } else { - *pRFSleep = ST25DV_DISABLE; - } - return NFCTAG_OK; + /* Extract RFSleep information */ + if (status == NFCTAG_OK) { + if ((reg_value & ST25DV_RF_MNGT_DYN_RFDIS_MASK) == ST25DV_RF_MNGT_DYN_RFDIS_MASK) { + *pRFSleep = ST25DV_ENABLE; + } else { + *pRFSleep = ST25DV_DISABLE; } + return NFCTAG_OK; + } - return status; + return status; } /** @@ -1862,20 +1862,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetRFSleep_Dyn(ST25DV_EN_STATUS *cons */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFSleep_Dyn(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update dynamic RF Disable field configuration */ - reg_value |= ST25DV_RF_MNGT_DYN_RFSLEEP_MASK; + /* Update dynamic RF Disable field configuration */ + reg_value |= ST25DV_RF_MNGT_DYN_RFSLEEP_MASK; - /* Write RF_MNGT_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Write RF_MNGT_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); } /** @@ -1884,20 +1884,20 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetRFSleep_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFSleep_Dyn(void) { - NFCTAG_StatusTypeDef status; - uint8_t reg_value = 0; + NFCTAG_StatusTypeDef status; + uint8_t reg_value = 0; - /* Read actual value of RF_MNGT_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read actual value of RF_MNGT_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Update dynamic RF Disable field configuration */ - reg_value &= ST25DV_RF_MNGT_DYN_RFSLEEP_FIELD; + /* Update dynamic RF Disable field configuration */ + reg_value &= ST25DV_RF_MNGT_DYN_RFSLEEP_FIELD; - /* Write RF_MNGT_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); + /* Write RF_MNGT_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_RF_MNGT_DYN_REG, 1); } /** @@ -1907,24 +1907,24 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetRFSleep_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBCtrl_Dyn(ST25DV_MB_CTRL_DYN_STATUS *const pCtrlStatus) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read MB_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read MB_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - /* Extract Mailbox ctrl information */ - pCtrlStatus->MbEnable = (reg_value & ST25DV_MB_CTRL_DYN_MBEN_MASK) >> ST25DV_MB_CTRL_DYN_MBEN_SHIFT; - pCtrlStatus->HostPutMsg = (reg_value & ST25DV_MB_CTRL_DYN_HOSTPUTMSG_MASK) >> ST25DV_MB_CTRL_DYN_HOSTPUTMSG_SHIFT; - pCtrlStatus->RfPutMsg = (reg_value & ST25DV_MB_CTRL_DYN_RFPUTMSG_MASK) >> ST25DV_MB_CTRL_DYN_RFPUTMSG_SHIFT; - pCtrlStatus->HostMissMsg = (reg_value & ST25DV_MB_CTRL_DYN_HOSTMISSMSG_MASK) >> ST25DV_MB_CTRL_DYN_HOSTMISSMSG_SHIFT; - pCtrlStatus->RFMissMsg = (reg_value & ST25DV_MB_CTRL_DYN_RFMISSMSG_MASK) >> ST25DV_MB_CTRL_DYN_RFMISSMSG_SHIFT; - pCtrlStatus->CurrentMsg = (ST25DV_CURRENT_MSG)((reg_value & ST25DV_MB_CTRL_DYN_CURRENTMSG_MASK) >> ST25DV_MB_CTRL_DYN_CURRENTMSG_SHIFT); + /* Extract Mailbox ctrl information */ + pCtrlStatus->MbEnable = (reg_value & ST25DV_MB_CTRL_DYN_MBEN_MASK) >> ST25DV_MB_CTRL_DYN_MBEN_SHIFT; + pCtrlStatus->HostPutMsg = (reg_value & ST25DV_MB_CTRL_DYN_HOSTPUTMSG_MASK) >> ST25DV_MB_CTRL_DYN_HOSTPUTMSG_SHIFT; + pCtrlStatus->RfPutMsg = (reg_value & ST25DV_MB_CTRL_DYN_RFPUTMSG_MASK) >> ST25DV_MB_CTRL_DYN_RFPUTMSG_SHIFT; + pCtrlStatus->HostMissMsg = (reg_value & ST25DV_MB_CTRL_DYN_HOSTMISSMSG_MASK) >> ST25DV_MB_CTRL_DYN_HOSTMISSMSG_SHIFT; + pCtrlStatus->RFMissMsg = (reg_value & ST25DV_MB_CTRL_DYN_RFMISSMSG_MASK) >> ST25DV_MB_CTRL_DYN_RFMISSMSG_SHIFT; + pCtrlStatus->CurrentMsg = (ST25DV_CURRENT_MSG)((reg_value & ST25DV_MB_CTRL_DYN_CURRENTMSG_MASK) >> ST25DV_MB_CTRL_DYN_CURRENTMSG_SHIFT); - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1933,22 +1933,22 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBCtrl_Dyn(ST25DV_MB_CTRL_DYN_STA */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetMBEN_Dyn(ST25DV_EN_STATUS *const pMBEN) { - uint8_t reg_value; - NFCTAG_StatusTypeDef status; + uint8_t reg_value; + NFCTAG_StatusTypeDef status; - /* Read MB_CTRL_DYN register */ - status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); - if (status != NFCTAG_OK) { - return status; - } + /* Read MB_CTRL_DYN register */ + status = ST25DV_i2c_ReadMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); + if (status != NFCTAG_OK) { + return status; + } - if ((reg_value & ST25DV_MB_MODE_RW_MASK) == ST25DV_MB_MODE_RW_MASK) { - *pMBEN = ST25DV_ENABLE; - } else { - *pMBEN = ST25DV_DISABLE; - } + if ((reg_value & ST25DV_MB_MODE_RW_MASK) == ST25DV_MB_MODE_RW_MASK) { + *pMBEN = ST25DV_ENABLE; + } else { + *pMBEN = ST25DV_DISABLE; + } - return NFCTAG_OK; + return NFCTAG_OK; } /** @@ -1957,13 +1957,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_GetMBEN_Dyn(ST25DV_EN_STATUS *const p */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetMBEN_Dyn(void) { - uint8_t reg_value; + uint8_t reg_value; - /* Set dynamic Mailbox enable */ - reg_value = ST25DV_MB_CTRL_DYN_MBEN_MASK; + /* Set dynamic Mailbox enable */ + reg_value = ST25DV_MB_CTRL_DYN_MBEN_MASK; - /* Write MB_CTRL_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); + /* Write MB_CTRL_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); } /** @@ -1972,13 +1972,13 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_SetMBEN_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetMBEN_Dyn(void) { - uint8_t reg_value; + uint8_t reg_value; - /* Set dynamic Mailbox disable */ - reg_value = 0; + /* Set dynamic Mailbox disable */ + reg_value = 0; - /* Write MB_CTRL_DYN register */ - return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); + /* Write MB_CTRL_DYN register */ + return ST25DV_i2c_WriteMailboxRegister(®_value, ST25DV_MB_CTRL_DYN_REG, 1); } /** @@ -1988,26 +1988,26 @@ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ResetMBEN_Dyn(void) */ NFCTAG_StatusTypeDef ST25DV_IO::ST25DV_i2c_ReadMBLength_Dyn(uint8_t *const pMBLength) { - /* Read actual value of MBLEN_DYN register */ - return ST25DV_i2c_ReadMailboxRegister(pMBLength, ST25DV_MB_LEN_DYN_REG, 1); + /* Read actual value of MBLEN_DYN register */ + return ST25DV_i2c_ReadMailboxRegister(pMBLength, ST25DV_MB_LEN_DYN_REG, 1); } int32_t ST25DV_IO::get_gpo() { - return _gpo; + return _gpo; } int32_t ST25DV_IO::get_lpd() { - return _lpd; + return _lpd; } TwoWire *ST25DV_IO::get_pwire() { - return _pwire; + return _pwire; } Stream *ST25DV_IO::get_pserial() { - return _serial; + return _serial; } diff --git a/src/ST25DV_IO/st25dv_io.h b/src/ST25DV_IO/st25dv_io.h index 1468103..b579ef6 100644 --- a/src/ST25DV_IO/st25dv_io.h +++ b/src/ST25DV_IO/st25dv_io.h @@ -36,7 +36,7 @@ #define I_AM_ST25DV64KC 0x51 #ifndef NULL -#define NULL (void *) 0 + #define NULL (void *) 0 #endif #define NFCTAG_4K_SIZE ((uint32_t) 0x200) @@ -336,242 +336,242 @@ * @brief ST25DV Ack Nack enumerator definition */ typedef enum { - I2CANSW_ACK = 0, - I2CANSW_NACK + I2CANSW_ACK = 0, + I2CANSW_NACK } ST25DV_I2CANSW_E; /** * @brief NFCTAG status enumerator definition. */ typedef enum { - NFCTAG_OK = 0, - NFCTAG_ERROR = 1, - NFCTAG_BUSY = 2, - NFCTAG_TIMEOUT = 3, - NFCTAG_NACK = 4 + NFCTAG_OK = 0, + NFCTAG_ERROR = 1, + NFCTAG_BUSY = 2, + NFCTAG_TIMEOUT = 3, + NFCTAG_NACK = 4 } NFCTAG_StatusTypeDef; /** * @brief ST25DV Enable Disable enumerator definition. */ typedef enum { - ST25DV_DISABLE = 0, - ST25DV_ENABLE + ST25DV_DISABLE = 0, + ST25DV_ENABLE } ST25DV_EN_STATUS; /** * @brief ST25DV Energy Harvesting mode enumerator definition. */ typedef enum { - ST25DV_EH_ACTIVE_AFTER_BOOT = 0, - ST25DV_EH_ON_DEMAND + ST25DV_EH_ACTIVE_AFTER_BOOT = 0, + ST25DV_EH_ON_DEMAND } ST25DV_EH_MODE_STATUS; /** * @brief ST25DV FIELD status enumerator definition. */ typedef enum { - ST25DV_FIELD_OFF = 0, - ST25DV_FIELD_ON + ST25DV_FIELD_OFF = 0, + ST25DV_FIELD_ON } ST25DV_FIELD_STATUS; /** * @brief ST25DV VCC status enumerator definition */ typedef enum { - ST25DV_VCC_OFF = 0, - ST25DV_VCC_ON + ST25DV_VCC_OFF = 0, + ST25DV_VCC_ON } ST25DV_VCC_STATUS; /** * @brief ST25DV protection status enumerator definition */ typedef enum { - ST25DV_NO_PROT = 0, - ST25DV_WRITE_PROT, - ST25DV_READ_PROT, - ST25DV_READWRITE_PROT + ST25DV_NO_PROT = 0, + ST25DV_WRITE_PROT, + ST25DV_READ_PROT, + ST25DV_READWRITE_PROT } ST25DV_PROTECTION_CONF; /** * @brief ST25DV area protection enumerator definition. */ typedef enum { - ST25DV_PROT_ZONE1 = 0, - ST25DV_PROT_ZONE2, - ST25DV_PROT_ZONE3, - ST25DV_PROT_ZONE4 + ST25DV_PROT_ZONE1 = 0, + ST25DV_PROT_ZONE2, + ST25DV_PROT_ZONE3, + ST25DV_PROT_ZONE4 } ST25DV_PROTECTION_ZONE; /** * @brief ST25DV password protection status enumerator definition. */ typedef enum { - ST25DV_NOT_PROTECTED = 0, - ST25DV_PROT_PASSWD1, - ST25DV_PROT_PASSWD2, - ST25DV_PROT_PASSWD3 + ST25DV_NOT_PROTECTED = 0, + ST25DV_PROT_PASSWD1, + ST25DV_PROT_PASSWD2, + ST25DV_PROT_PASSWD3 } ST25DV_PASSWD_PROT_STATUS; /** * @brief ST25DV lock status enumerator definition. */ typedef enum { - ST25DV_UNLOCKED = 0, - ST25DV_LOCKED + ST25DV_UNLOCKED = 0, + ST25DV_LOCKED } ST25DV_LOCK_STATUS; /** * @brief ST25DV Number of Blocks for the CCFile enumerator definition. */ typedef enum { - ST25DV_CCFILE_1BLCK = 0, - ST25DV_CCFILE_2BLCK + ST25DV_CCFILE_1BLCK = 0, + ST25DV_CCFILE_2BLCK } ST25DV_CCFILE_BLOCK; /** * @brief ST25DV session status enumerator definition. */ typedef enum { - ST25DV_SESSION_CLOSED = 0, - ST25DV_SESSION_OPEN + ST25DV_SESSION_CLOSED = 0, + ST25DV_SESSION_OPEN } ST25DV_I2CSSO_STATUS; /** * @brief ST25DV area end address enumerator definition. */ typedef enum { - ST25DV_ZONE_END1 = 0, - ST25DV_ZONE_END2, - ST25DV_ZONE_END3 + ST25DV_ZONE_END1 = 0, + ST25DV_ZONE_END2, + ST25DV_ZONE_END3 } ST25DV_END_ZONE; /** * @brief ST25DV IT pulse duration enumerator definition. */ typedef enum { - ST25DV_302_US = 0, - ST25DV_264_US, - ST25DV_226_US, - ST25DV_188_US, - ST25DV_151_US, - ST25DV_113_US, - ST25DV_75_US, - ST25DV_37_US + ST25DV_302_US = 0, + ST25DV_264_US, + ST25DV_226_US, + ST25DV_188_US, + ST25DV_151_US, + ST25DV_113_US, + ST25DV_75_US, + ST25DV_37_US } ST25DV_PULSE_DURATION; /** * @brief ST25DV Mailbox Current Message enumerator definition */ typedef enum { - ST25DV_NO_MSG = 0, - ST25DV_HOST_MSG, - ST25DV_RF_MSG + ST25DV_NO_MSG = 0, + ST25DV_HOST_MSG, + ST25DV_RF_MSG } ST25DV_CURRENT_MSG; /** * @brief ST25DV EH Ctrl structure definition */ typedef struct { - ST25DV_EN_STATUS EH_EN_Mode; - ST25DV_EN_STATUS EH_on; - ST25DV_EN_STATUS Field_on; - ST25DV_EN_STATUS VCC_on; + ST25DV_EN_STATUS EH_EN_Mode; + ST25DV_EN_STATUS EH_on; + ST25DV_EN_STATUS Field_on; + ST25DV_EN_STATUS VCC_on; } ST25DV_EH_CTRL; /** * @brief ST25DV GPO structure definition */ typedef struct { - ST25DV_EN_STATUS GPO_RFUser_en; - ST25DV_EN_STATUS GPO_RFActivity_en; - ST25DV_EN_STATUS GPO_RFInterrupt_en; - ST25DV_EN_STATUS GPO_FieldChange_en; - ST25DV_EN_STATUS GPO_RFPutMsg_en; - ST25DV_EN_STATUS GPO_RFGetMsg_en; - ST25DV_EN_STATUS GPO_RFWrite_en; - ST25DV_EN_STATUS GPO_Enable; + ST25DV_EN_STATUS GPO_RFUser_en; + ST25DV_EN_STATUS GPO_RFActivity_en; + ST25DV_EN_STATUS GPO_RFInterrupt_en; + ST25DV_EN_STATUS GPO_FieldChange_en; + ST25DV_EN_STATUS GPO_RFPutMsg_en; + ST25DV_EN_STATUS GPO_RFGetMsg_en; + ST25DV_EN_STATUS GPO_RFWrite_en; + ST25DV_EN_STATUS GPO_Enable; } ST25DV_GPO; /** * @brief ST25DV RF Management structure definition. */ typedef struct { - ST25DV_EN_STATUS RfDisable; - ST25DV_EN_STATUS RfSleep; + ST25DV_EN_STATUS RfDisable; + ST25DV_EN_STATUS RfSleep; } ST25DV_RF_MNGT; /** * @brief ST25DV RF Area protection structure definition. */ typedef struct { - ST25DV_PASSWD_PROT_STATUS PasswdCtrl; - ST25DV_PROTECTION_CONF RWprotection; + ST25DV_PASSWD_PROT_STATUS PasswdCtrl; + ST25DV_PROTECTION_CONF RWprotection; } ST25DV_RF_PROT_ZONE; /** * @brief ST25DV I2C Area protection structure definition. */ typedef struct { - ST25DV_PROTECTION_CONF ProtectZone1; - ST25DV_PROTECTION_CONF ProtectZone2; - ST25DV_PROTECTION_CONF ProtectZone3; - ST25DV_PROTECTION_CONF ProtectZone4; + ST25DV_PROTECTION_CONF ProtectZone1; + ST25DV_PROTECTION_CONF ProtectZone2; + ST25DV_PROTECTION_CONF ProtectZone3; + ST25DV_PROTECTION_CONF ProtectZone4; } ST25DV_I2C_PROT_ZONE; /** * @brief ST25DV MB_CTRL_DYN register structure definition. */ typedef struct { - uint8_t MbEnable; - uint8_t HostPutMsg; - uint8_t RfPutMsg; - uint8_t HostMissMsg; - uint8_t RFMissMsg; - ST25DV_CURRENT_MSG CurrentMsg; + uint8_t MbEnable; + uint8_t HostPutMsg; + uint8_t RfPutMsg; + uint8_t HostMissMsg; + uint8_t RFMissMsg; + ST25DV_CURRENT_MSG CurrentMsg; } ST25DV_MB_CTRL_DYN_STATUS; /** * @brief ST25DV Lock CCFile structure definition. */ typedef struct { - ST25DV_LOCK_STATUS LckBck0; - ST25DV_LOCK_STATUS LckBck1; + ST25DV_LOCK_STATUS LckBck0; + ST25DV_LOCK_STATUS LckBck1; } ST25DV_LOCK_CCFILE; /** * @brief ST25DV Memory size structure definition. */ typedef struct { - uint8_t BlockSize; - uint16_t Mem_Size; + uint8_t BlockSize; + uint16_t Mem_Size; } ST25DV_MEM_SIZE; /** * @brief ST25DV UID information structure definition. */ typedef struct { - uint32_t MsbUid; - uint32_t LsbUid; + uint32_t MsbUid; + uint32_t LsbUid; } ST25DV_UID; /** * @brief ST25DV Password structure definition. */ typedef struct { - uint32_t MsbPasswd; - uint32_t LsbPasswd; + uint32_t MsbPasswd; + uint32_t LsbPasswd; } ST25DV_PASSWD; #if defined(ARDUINO_SAM_DUE) -#define WIRE Wire1 + #define WIRE Wire1 #else -#define WIRE Wire + #define WIRE Wire #endif class ST25DV_IO { -public: + public: ST25DV_IO(int32_t gpo, int32_t ldp, TwoWire *i2c, Stream *serial = NULL); NFCTAG_StatusTypeDef ST25DV_i2c_Init(void); @@ -664,7 +664,7 @@ class ST25DV_IO { TwoWire *get_pwire(); Stream *get_pserial(); -protected: + protected: int32_t _gpo; int32_t _lpd; TwoWire *_pwire; diff --git a/src/libNDEF/NDEF_class.h b/src/libNDEF/NDEF_class.h index 51eb737..de4b0f4 100755 --- a/src/libNDEF/NDEF_class.h +++ b/src/libNDEF/NDEF_class.h @@ -19,16 +19,16 @@ * @brief Tag Type 5 State enumeration definition. */ typedef enum { - TT5_NO_NDEF = 0, /**< No data detected in the tag. */ - TT5_INITIALIZED, /**< Capability container detected. */ - TT5_READ_WRITE, /**< Read-Write data detected. */ - TT5_READ /**< Read-Only data message detected. */ + TT5_NO_NDEF = 0, /**< No data detected in the tag. */ + TT5_INITIALIZED, /**< Capability container detected. */ + TT5_READ_WRITE, /**< Read-Write data detected. */ + TT5_READ /**< Read-Only data message detected. */ } TT5_State; /** @brief Type5 Tag Capability Container Magic numbers as defined by the NFC Forum. */ typedef enum { - NFCT5_MAGICNUMBER_E1_CCFILE = 0xE1, /**< Complete data area can be read by 1-byte block adrdess commands. */ - NFCT5_MAGICNUMBER_E2_CCFILE = 0xE2 /**< Last part of the data area can be only read by 2-bytes block address commands.\n + NFCT5_MAGICNUMBER_E1_CCFILE = 0xE1, /**< Complete data area can be read by 1-byte block adrdess commands. */ + NFCT5_MAGICNUMBER_E2_CCFILE = 0xE2 /**< Last part of the data area can be only read by 2-bytes block address commands.\n The first 256 blocks can be read by 1-byte block address commands. */ } TT5_MagicNumber_t; @@ -36,25 +36,25 @@ typedef enum { * @brief Type5 Tag Capability Container structure. */ typedef struct { - TT5_MagicNumber_t MagicNumber; /**< CCfile[0]: Magic Number should be E1h or E2h (for extended API) */ - uint8_t Version; /**< CCfile[1]: Capability container version (b7-b4) and access conditions (b3-b0) */ - uint8_t MemorySize; /**< CCfile[2]: Memory size, expressed in 8 bytes blocks, set to 0 if tag size is greater than 16kbits. */ - uint8_t TT5Tag; /**< CCfile[3]: Additional information on the Type5 Tag:\n + TT5_MagicNumber_t MagicNumber; /**< CCfile[0]: Magic Number should be E1h or E2h (for extended API) */ + uint8_t Version; /**< CCfile[1]: Capability container version (b7-b4) and access conditions (b3-b0) */ + uint8_t MemorySize; /**< CCfile[2]: Memory size, expressed in 8 bytes blocks, set to 0 if tag size is greater than 16kbits. */ + uint8_t TT5Tag; /**< CCfile[3]: Additional information on the Type5 Tag:\n b0: supports `read multiple block` commands\n b1: RFU\n b2: RFU\n b3: supports `lock block` commands\n b4: requires the `special frame` format */ - uint8_t rsved1; /**< RFU */ - uint8_t rsved2; /**< RFU */ - uint16_t ExtMemorySize; /**< CCfile[6],CCfile[7]: Memory size, expressed in 8 bytes blocks, when tag size is greater than 16kbits. */ - TT5_State State; /**< Indicates if a NDEF message is present. */ - uint32_t NDEF_offset; /**< Indicates the address of a NDEF message in the tag. */ + uint8_t rsved1; /**< RFU */ + uint8_t rsved2; /**< RFU */ + uint16_t ExtMemorySize; /**< CCfile[6],CCfile[7]: Memory size, expressed in 8 bytes blocks, when tag size is greater than 16kbits. */ + TT5_State State; /**< Indicates if a NDEF message is present. */ + uint32_t NDEF_offset; /**< Indicates the address of a NDEF message in the tag. */ } sCCFileInfo; class NDEF { -public: + public: NDEF(ST25DV_IO *dev); uint16_t begin(); @@ -162,7 +162,7 @@ class NDEF { //Email static void NDEF_FillEmailStruct(uint8_t *pPayload, uint32_t PayloadSize, sEmailInfo *pEmailStruct); void NDEF_ReadURI_Email(sRecordInfo_t *pRecordStruct, sEmailInfo *pEmailStruct); -private: + private: //Geo static void NDEF_FillGeoStruct(uint8_t *pPayload, uint32_t PayloadSize, sGeoInfo *pGeoStruct); @@ -219,7 +219,7 @@ class NDEF { /** @brief Capability Container structure instance (global). */ sCCFileInfo CCFileStruct; -private: + private: ST25DV_IO *mydev; }; diff --git a/src/libNDEF/NDEFcommon.h b/src/libNDEF/NDEFcommon.h index 3eaa5fb..9f1610b 100755 --- a/src/libNDEF/NDEFcommon.h +++ b/src/libNDEF/NDEFcommon.h @@ -40,19 +40,19 @@ * @brief GPO status information structure definition */ typedef struct { - uint8_t WritenEEPROM; - uint8_t RfBusy; - uint8_t FieldOn; - uint8_t FieldOff; - uint8_t MsgInMailbox; - uint8_t MailboxMsgRead; - uint8_t RfInterrupt; - uint8_t Rfuser; + uint8_t WritenEEPROM; + uint8_t RfBusy; + uint8_t FieldOn; + uint8_t FieldOff; + uint8_t MsgInMailbox; + uint8_t MailboxMsgRead; + uint8_t RfInterrupt; + uint8_t Rfuser; } IT_GPO_STATUS; /* Exported macro ------------------------------------------------------------*/ #ifndef MIN -#define MIN(x, y) (((x) < (y)) ? (x) : (y)) + #define MIN(x, y) (((x) < (y)) ? (x) : (y)) #endif /* diff --git a/src/libNDEF/lib_NDEF.cpp b/src/libNDEF/lib_NDEF.cpp index f23f151..115d5af 100755 --- a/src/libNDEF/lib_NDEF.cpp +++ b/src/libNDEF/lib_NDEF.cpp @@ -59,54 +59,54 @@ NDEF::NDEF(ST25DV_IO *dev) { - mydev = dev; - SPRecordStructAdd[0] = &SPRecordStruct1; - SPRecordStructAdd[1] = &SPRecordStruct2; - SPRecordStructAdd[2] = &SPRecordStruct3; - SPRecordStructAdd[3] = &SPRecordStruct4; + mydev = dev; + SPRecordStructAdd[0] = &SPRecordStruct1; + SPRecordStructAdd[1] = &SPRecordStruct2; + SPRecordStructAdd[2] = &SPRecordStruct3; + SPRecordStructAdd[3] = &SPRecordStruct4; } uint16_t NDEF::begin() { - return begin(NULL, 0); + return begin(NULL, 0); } uint16_t NDEF::begin(uint8_t *buffer, uint16_t bufferLength) { - int ret = NDEF_OK; - - if (buffer == NULL) { - NDEF_Buffer = NDEF_Default_Buffer; - NDEF_Buffer_size = NDEF_MAX_SIZE; - } else { - // TODO should we check minimum buffer length? - NDEF_Buffer = buffer; - NDEF_Buffer_size = bufferLength; - } - - if (NfcType5_NDEFDetection() != NDEF_OK) { - CCFileStruct.MagicNumber = NFCT5_MAGICNUMBER_E1_CCFILE; - CCFileStruct.Version = NFCT5_VERSION_V1_0; - CCFileStruct.MemorySize = (ST25DV_MAX_SIZE / 8) & 0xFF; - CCFileStruct.TT5Tag = 0x05; - /* Init of the Type Tag 5 component (M24LR) */ - ret = NfcType5_TT5Init(); - } - return ret; + int ret = NDEF_OK; + + if (buffer == NULL) { + NDEF_Buffer = NDEF_Default_Buffer; + NDEF_Buffer_size = NDEF_MAX_SIZE; + } else { + // TODO should we check minimum buffer length? + NDEF_Buffer = buffer; + NDEF_Buffer_size = bufferLength; + } + + if (NfcType5_NDEFDetection() != NDEF_OK) { + CCFileStruct.MagicNumber = NFCT5_MAGICNUMBER_E1_CCFILE; + CCFileStruct.Version = NFCT5_VERSION_V1_0; + CCFileStruct.MemorySize = (ST25DV_MAX_SIZE / 8) & 0xFF; + CCFileStruct.TT5Tag = 0x05; + /* Init of the Type Tag 5 component (M24LR) */ + ret = NfcType5_TT5Init(); + } + return ret; } uint16_t NDEF::NDEF_IsNDEFPresent(void) { - uint16_t FileSize; + uint16_t FileSize; - /* Check NDEF existence */ - NfcTag_GetLength(&FileSize); + /* Check NDEF existence */ + NfcTag_GetLength(&FileSize); - if (FileSize != 0) { - return NDEF_OK; - } else { - return NDEF_ERROR; - } + if (FileSize != 0) { + return NDEF_OK; + } else { + return NDEF_ERROR; + } } /** @@ -117,64 +117,64 @@ uint16_t NDEF::NDEF_IsNDEFPresent(void) */ uint16_t NDEF::NDEF_IdentifySPRecord(sRecordInfo_t *pRecordStruct, uint8_t *pPayload) { - uint16_t status = NDEF_ERROR; - uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; - - /* Is ID length field present */ - if ((*pPayload) & IL_Mask) { - IDLengthField = ID_LENGTH_FIELD; + uint16_t status = NDEF_ERROR; + uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; + + /* Is ID length field present */ + if ((*pPayload) & IL_Mask) { + IDLengthField = ID_LENGTH_FIELD; + } else { + IDLengthField = 0; + } + + /* it's a SR */ + if ((*pPayload) & SR_Mask) { + TypeNbByte = pPayload[1]; + PayloadLengthField = 1; + if (IDLengthField == ID_LENGTH_FIELD) { + IDNbByte = pPayload[3]; } else { - IDLengthField = 0; + IDNbByte = 0; } - - /* it's a SR */ - if ((*pPayload) & SR_Mask) { - TypeNbByte = pPayload[1]; - PayloadLengthField = 1; - if (IDLengthField == ID_LENGTH_FIELD) { - IDNbByte = pPayload[3]; - } else { - IDNbByte = 0; - } + } else { + TypeNbByte = pPayload[1]; + PayloadLengthField = 4; + if (IDLengthField == ID_LENGTH_FIELD) { + IDNbByte = pPayload[6]; } else { - TypeNbByte = pPayload[1]; - PayloadLengthField = 4; - if (IDLengthField == ID_LENGTH_FIELD) { - IDNbByte = pPayload[6]; - } else { - IDNbByte = 0; - } + IDNbByte = 0; } - - SizeOfRecordHeader = RECORD_FLAG_FIELD + TYPE_LENGTH_FIELD + PayloadLengthField + IDLengthField + TypeNbByte + IDNbByte; - - /* it's a SR */ - if (pPayload[0] & SR_Mask) { - pRecordStruct->RecordFlags = pPayload[0]; - pRecordStruct->TypeLength = TypeNbByte; - pRecordStruct->PayloadLength = pPayload[2]; - pRecordStruct->IDLength = IDNbByte; - memcpy(pRecordStruct->Type, &pPayload[3 + IDNbByte], TypeNbByte); - memcpy(pRecordStruct->ID, &pPayload[3 + IDNbByte + TypeNbByte], IDNbByte); - pRecordStruct->PayloadOffset = SizeOfRecordHeader; - } else { - pRecordStruct->RecordFlags = pPayload[0]; - pRecordStruct->TypeLength = TypeNbByte; - pRecordStruct->PayloadLength = (((uint32_t)pPayload[2]) << 24) | - (((uint32_t)pPayload[3]) << 16) | - (((uint32_t)pPayload[4]) << 8) - | pPayload[5] ; - pRecordStruct->IDLength = IDNbByte; - memcpy(pRecordStruct->Type, &pPayload[6 + IDNbByte], TypeNbByte); - memcpy(pRecordStruct->ID, &pPayload[6 + IDNbByte + TypeNbByte], IDNbByte); - pRecordStruct->PayloadOffset = SizeOfRecordHeader; - } - - pRecordStruct->PayloadBufferAdd = pPayload + SizeOfRecordHeader ; - - status = NDEF_ParseRecordHeader(pRecordStruct); - - return status; + } + + SizeOfRecordHeader = RECORD_FLAG_FIELD + TYPE_LENGTH_FIELD + PayloadLengthField + IDLengthField + TypeNbByte + IDNbByte; + + /* it's a SR */ + if (pPayload[0] & SR_Mask) { + pRecordStruct->RecordFlags = pPayload[0]; + pRecordStruct->TypeLength = TypeNbByte; + pRecordStruct->PayloadLength = pPayload[2]; + pRecordStruct->IDLength = IDNbByte; + memcpy(pRecordStruct->Type, &pPayload[3 + IDNbByte], TypeNbByte); + memcpy(pRecordStruct->ID, &pPayload[3 + IDNbByte + TypeNbByte], IDNbByte); + pRecordStruct->PayloadOffset = SizeOfRecordHeader; + } else { + pRecordStruct->RecordFlags = pPayload[0]; + pRecordStruct->TypeLength = TypeNbByte; + pRecordStruct->PayloadLength = (((uint32_t)pPayload[2]) << 24) | + (((uint32_t)pPayload[3]) << 16) | + (((uint32_t)pPayload[4]) << 8) + | pPayload[5] ; + pRecordStruct->IDLength = IDNbByte; + memcpy(pRecordStruct->Type, &pPayload[6 + IDNbByte], TypeNbByte); + memcpy(pRecordStruct->ID, &pPayload[6 + IDNbByte + TypeNbByte], IDNbByte); + pRecordStruct->PayloadOffset = SizeOfRecordHeader; + } + + pRecordStruct->PayloadBufferAdd = pPayload + SizeOfRecordHeader ; + + status = NDEF_ParseRecordHeader(pRecordStruct); + + return status; } /** @@ -185,27 +185,27 @@ uint16_t NDEF::NDEF_IdentifySPRecord(sRecordInfo_t *pRecordStruct, uint8_t *pPay */ uint16_t NDEF::NDEF_ParseRecordHeader(sRecordInfo_t *pRecordStruct) { - uint16_t status = NDEF_OK; + uint16_t status = NDEF_OK; - switch ((pRecordStruct->RecordFlags & TNF_Mask)) { + switch ((pRecordStruct->RecordFlags & TNF_Mask)) { case TNF_WellKnown: - NDEF_ParseWellKnownType(pRecordStruct); - break; + NDEF_ParseWellKnownType(pRecordStruct); + break; case TNF_MediaType: - NDEF_ParseMediaType(pRecordStruct); - break; + NDEF_ParseMediaType(pRecordStruct); + break; case TNF_NFCForumExternal: - NDEF_ParseForumExternalType(pRecordStruct); - break; + NDEF_ParseForumExternalType(pRecordStruct); + break; default: - /* currently not supported or unknown*/ - pRecordStruct->NDEF_Type = UNKNOWN_TYPE; - status = NDEF_ERROR; - } - return status; + /* currently not supported or unknown*/ + pRecordStruct->NDEF_Type = UNKNOWN_TYPE; + status = NDEF_ERROR; + } + return status; } /** @@ -214,41 +214,41 @@ uint16_t NDEF::NDEF_ParseRecordHeader(sRecordInfo_t *pRecordStruct) */ void NDEF::NDEF_ParseWellKnownType(sRecordInfo_t *pRecordStruct) { - uint8_t *pPayload; - - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - - if (!memcmp(&(pRecordStruct->Type), SMART_POSTER_TYPE_STRING, pRecordStruct->TypeLength)) { - /* special case where we have to parse others records */ - pRecordStruct->NDEF_Type = SMARTPOSTER_TYPE; - NDEF_ParseSP(pRecordStruct); - } - - else if (!memcmp(&(pRecordStruct->Type), URI_TYPE_STRING, pRecordStruct->TypeLength)) { - /* it's an URI Type check if it's an URL or SMS or ... */ - /* check identifier */ - if (*pPayload == URI_ID_0x00) { - NDEF_ParseURI(pRecordStruct); - } else if ((*pPayload > URI_ID_0x00) && (*pPayload < URI_RFU)) { - /* email special case */ - if (*pPayload == (uint8_t) URI_ID_0x06) { - pRecordStruct->NDEF_Type = URI_EMAIL_TYPE; - } else { - pRecordStruct->NDEF_Type = WELL_KNOWN_ABRIDGED_URI_TYPE; - } - } else { - pRecordStruct->NDEF_Type = UNKNOWN_TYPE; - } - } - - else if (!memcmp(&(pRecordStruct->Type), TEXT_TYPE_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = TEXT_TYPE; - } else if ((!memcmp(&(pRecordStruct->Type), NDEF_HANDOVER_SELECT_TYPE_STR, pRecordStruct->TypeLength)) || - (!memcmp(&(pRecordStruct->Type), NDEF_HANDOVER_REQUEST_TYPE_STR, pRecordStruct->TypeLength))) { - pRecordStruct->NDEF_Type = HANDOVER_TYPE; + uint8_t *pPayload; + + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + + if (!memcmp(&(pRecordStruct->Type), SMART_POSTER_TYPE_STRING, pRecordStruct->TypeLength)) { + /* special case where we have to parse others records */ + pRecordStruct->NDEF_Type = SMARTPOSTER_TYPE; + NDEF_ParseSP(pRecordStruct); + } + + else if (!memcmp(&(pRecordStruct->Type), URI_TYPE_STRING, pRecordStruct->TypeLength)) { + /* it's an URI Type check if it's an URL or SMS or ... */ + /* check identifier */ + if (*pPayload == URI_ID_0x00) { + NDEF_ParseURI(pRecordStruct); + } else if ((*pPayload > URI_ID_0x00) && (*pPayload < URI_RFU)) { + /* email special case */ + if (*pPayload == (uint8_t) URI_ID_0x06) { + pRecordStruct->NDEF_Type = URI_EMAIL_TYPE; + } else { + pRecordStruct->NDEF_Type = WELL_KNOWN_ABRIDGED_URI_TYPE; + } } else { - pRecordStruct->NDEF_Type = UNKNOWN_TYPE; + pRecordStruct->NDEF_Type = UNKNOWN_TYPE; } + } + + else if (!memcmp(&(pRecordStruct->Type), TEXT_TYPE_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = TEXT_TYPE; + } else if ((!memcmp(&(pRecordStruct->Type), NDEF_HANDOVER_SELECT_TYPE_STR, pRecordStruct->TypeLength)) || + (!memcmp(&(pRecordStruct->Type), NDEF_HANDOVER_REQUEST_TYPE_STR, pRecordStruct->TypeLength))) { + pRecordStruct->NDEF_Type = HANDOVER_TYPE; + } else { + pRecordStruct->NDEF_Type = UNKNOWN_TYPE; + } } /** @@ -257,21 +257,21 @@ void NDEF::NDEF_ParseWellKnownType(sRecordInfo_t *pRecordStruct) */ void NDEF::NDEF_ParseMediaType(sRecordInfo_t *pRecordStruct) { - if (!memcmp(&(pRecordStruct->Type), VCARD_TYPE_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = VCARD_TYPE; - } else if (!memcmp(&(pRecordStruct->Type), XVCARD_TYPE_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = VCARD_TYPE; - } else if (!memcmp(&(pRecordStruct->Type), XVCARD2_TYPE_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = VCARD_TYPE; - } else if (!memcmp(&pRecordStruct->Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = BT_TYPE; - } else if (!memcmp(&pRecordStruct->Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = BLE_TYPE; - } else if (!memcmp(&pRecordStruct->Type, WIFITOKEN_TYPE_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = URI_WIFITOKEN_TYPE; - } else { - pRecordStruct->NDEF_Type = UNKNOWN_TYPE; - } + if (!memcmp(&(pRecordStruct->Type), VCARD_TYPE_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = VCARD_TYPE; + } else if (!memcmp(&(pRecordStruct->Type), XVCARD_TYPE_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = VCARD_TYPE; + } else if (!memcmp(&(pRecordStruct->Type), XVCARD2_TYPE_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = VCARD_TYPE; + } else if (!memcmp(&pRecordStruct->Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = BT_TYPE; + } else if (!memcmp(&pRecordStruct->Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = BLE_TYPE; + } else if (!memcmp(&pRecordStruct->Type, WIFITOKEN_TYPE_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = URI_WIFITOKEN_TYPE; + } else { + pRecordStruct->NDEF_Type = UNKNOWN_TYPE; + } } /** @@ -280,11 +280,11 @@ void NDEF::NDEF_ParseMediaType(sRecordInfo_t *pRecordStruct) */ void NDEF::NDEF_ParseForumExternalType(sRecordInfo_t *pRecordStruct) { - if (!memcmp(&(pRecordStruct->Type), M24SR_DISCOVERY_APP_STRING, pRecordStruct->TypeLength)) { - pRecordStruct->NDEF_Type = M24SR_DISCOVERY_APP_TYPE; - } else { - pRecordStruct->NDEF_Type = UNKNOWN_TYPE; - } + if (!memcmp(&(pRecordStruct->Type), M24SR_DISCOVERY_APP_STRING, pRecordStruct->TypeLength)) { + pRecordStruct->NDEF_Type = M24SR_DISCOVERY_APP_TYPE; + } else { + pRecordStruct->NDEF_Type = UNKNOWN_TYPE; + } } /** @@ -293,18 +293,18 @@ void NDEF::NDEF_ParseForumExternalType(sRecordInfo_t *pRecordStruct) */ void NDEF::NDEF_ParseURI(sRecordInfo_t *pRecordStruct) { - uint8_t *pPayload; - - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - pPayload++; /* to skip URI identifier first URI payload byte */ - - if (!memcmp(pPayload, SMS_TYPE_STRING, strlen(SMS_TYPE_STRING))) { - pRecordStruct->NDEF_Type = URI_SMS_TYPE; - } else if (!memcmp(pPayload, GEO_TYPE_STRING, strlen(GEO_TYPE_STRING))) { - pRecordStruct->NDEF_Type = URI_GEO_TYPE; - } else { - pRecordStruct->NDEF_Type = UNABRIDGED_URI_TYPE; - } + uint8_t *pPayload; + + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + pPayload++; /* to skip URI identifier first URI payload byte */ + + if (!memcmp(pPayload, SMS_TYPE_STRING, strlen(SMS_TYPE_STRING))) { + pRecordStruct->NDEF_Type = URI_SMS_TYPE; + } else if (!memcmp(pPayload, GEO_TYPE_STRING, strlen(GEO_TYPE_STRING))) { + pRecordStruct->NDEF_Type = URI_GEO_TYPE; + } else { + pRecordStruct->NDEF_Type = UNABRIDGED_URI_TYPE; + } } /** @@ -313,41 +313,41 @@ void NDEF::NDEF_ParseURI(sRecordInfo_t *pRecordStruct) */ void NDEF::NDEF_ParseSP(sRecordInfo_t *pRecordStruct) { - uint8_t *pPayload; - uint32_t PayloadSize = 0; - uint32_t SPPayloadSize = 0; - uint32_t OffsetInSPPayload = 0; - uint32_t RecordPosition = 0; - sRecordInfo_t *pSPRecordStruct; - - /* initialize variable with size of the payload and pointer on data */ - PayloadSize = pRecordStruct->PayloadLength; - - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - - pSPRecordStruct = SPRecordStructAdd[0]; - - /* Initialize the number of record find in the SP payload */ - pRecordStruct->NbOfRecordInSPPayload = 0; - - do { - pSPRecordStruct = SPRecordStructAdd[RecordPosition]; - /* identify the record in the SP payload */ - if (NDEF_IdentifySPRecord(pSPRecordStruct, pPayload) == NDEF_OK) { - /* store add of structure that will contain the other record information */ - pRecordStruct->NbOfRecordInSPPayload++; - pRecordStruct->SPRecordStructAdd[RecordPosition] = pSPRecordStruct; - - /* After SPRecord + First Record check if we are at the end of NDEF file */ - SPPayloadSize = pSPRecordStruct->PayloadLength; - - OffsetInSPPayload += pSPRecordStruct->PayloadOffset + SPPayloadSize; - pPayload += OffsetInSPPayload; - } else { /* Recommended Action Record for example */ - SPPayloadSize = 0; - } - RecordPosition++; - } while ((OffsetInSPPayload < PayloadSize) && RecordPosition < SP_MAX_RECORD); /* there is another record */ + uint8_t *pPayload; + uint32_t PayloadSize = 0; + uint32_t SPPayloadSize = 0; + uint32_t OffsetInSPPayload = 0; + uint32_t RecordPosition = 0; + sRecordInfo_t *pSPRecordStruct; + + /* initialize variable with size of the payload and pointer on data */ + PayloadSize = pRecordStruct->PayloadLength; + + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + + pSPRecordStruct = SPRecordStructAdd[0]; + + /* Initialize the number of record find in the SP payload */ + pRecordStruct->NbOfRecordInSPPayload = 0; + + do { + pSPRecordStruct = SPRecordStructAdd[RecordPosition]; + /* identify the record in the SP payload */ + if (NDEF_IdentifySPRecord(pSPRecordStruct, pPayload) == NDEF_OK) { + /* store add of structure that will contain the other record information */ + pRecordStruct->NbOfRecordInSPPayload++; + pRecordStruct->SPRecordStructAdd[RecordPosition] = pSPRecordStruct; + + /* After SPRecord + First Record check if we are at the end of NDEF file */ + SPPayloadSize = pSPRecordStruct->PayloadLength; + + OffsetInSPPayload += pSPRecordStruct->PayloadOffset + SPPayloadSize; + pPayload += OffsetInSPPayload; + } else { /* Recommended Action Record for example */ + SPPayloadSize = 0; + } + RecordPosition++; + } while ((OffsetInSPPayload < PayloadSize) && RecordPosition < SP_MAX_RECORD); /* there is another record */ } /** @@ -367,7 +367,7 @@ void NDEF::NDEF_ParseSP(sRecordInfo_t *pRecordStruct) */ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct) { - return NDEF_IdentifyNDEF(pRecordStruct, NDEF_Buffer, NDEF_Buffer_size); + return NDEF_IdentifyNDEF(pRecordStruct, NDEF_Buffer, NDEF_Buffer_size); } /** @@ -380,7 +380,7 @@ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct) */ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF) { - return NDEF_IdentifyNDEF(pRecordStruct, pNDEF, NDEF_MAX_SIZE); + return NDEF_IdentifyNDEF(pRecordStruct, pNDEF, NDEF_MAX_SIZE); } /** @@ -392,17 +392,17 @@ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF) */ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF, uint16_t bufferLength) { - uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; + uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; - /* check NDEF present */ - if (NDEF_IsNDEFPresent() != NDEF_OK) { - return NDEF_ERROR; - } + /* check NDEF present */ + if (NDEF_IsNDEFPresent() != NDEF_OK) { + return NDEF_ERROR; + } - /* Read the NDEF file up to the max length of the record header*/ - NfcTag_ReadNDEF(pNDEF, bufferLength); + /* Read the NDEF file up to the max length of the record header*/ + NfcTag_ReadNDEF(pNDEF, bufferLength); - return NDEF_IdentifyBuffer(pRecordStruct, pNDEF); + return NDEF_IdentifyBuffer(pRecordStruct, pNDEF); } /** @@ -416,7 +416,7 @@ uint16_t NDEF::NDEF_IdentifyNDEF(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF, u */ uint16_t NDEF::NDEF_ReadNDEF() { - return NfcTag_ReadNDEF(NDEF_Buffer, NDEF_Buffer_size); + return NfcTag_ReadNDEF(NDEF_Buffer, NDEF_Buffer_size); } /** @@ -431,7 +431,7 @@ uint16_t NDEF::NDEF_ReadNDEF() */ uint16_t NDEF::NDEF_ReadNDEF(uint8_t *pNDEF) { - return NfcTag_ReadNDEF(pNDEF, NDEF_MAX_SIZE); + return NfcTag_ReadNDEF(pNDEF, NDEF_MAX_SIZE); } /** @@ -446,7 +446,7 @@ uint16_t NDEF::NDEF_ReadNDEF(uint8_t *pNDEF) */ uint16_t NDEF::NDEF_ReadNDEF(uint8_t *pNDEF, uint16_t bufferLength) { - return NfcTag_ReadNDEF(pNDEF, bufferLength); + return NfcTag_ReadNDEF(pNDEF, bufferLength); } @@ -462,7 +462,7 @@ uint16_t NDEF::NDEF_ReadNDEF(uint8_t *pNDEF, uint16_t bufferLength) */ uint16_t NDEF::NDEF_getNDEFSize(uint16_t *Size) { - return NfcTag_GetLength(Size); + return NfcTag_GetLength(Size); } /** * @brief This function write the NDEF in the TAG. @@ -476,7 +476,7 @@ uint16_t NDEF::NDEF_getNDEFSize(uint16_t *Size) */ uint16_t NDEF::NDEF_WriteNDEF(uint16_t NDEF_Size, uint8_t *pNDEF) { - return NfcTag_WriteNDEF(NDEF_Size, pNDEF); + return NfcTag_WriteNDEF(NDEF_Size, pNDEF); } @@ -492,43 +492,43 @@ uint16_t NDEF::NDEF_WriteNDEF(uint16_t NDEF_Size, uint8_t *pNDEF) */ uint16_t NDEF::NDEF_AppendRecord(sRecordInfo_t *Record) { - uint16_t status; - uint16_t NDEF_Size = 0; - uint8_t *pData = NDEF_Buffer; + uint16_t status; + uint16_t NDEF_Size = 0; + uint8_t *pData = NDEF_Buffer; - status = NDEF_getNDEFSize(&NDEF_Size); - if (status != NDEF_OK) { - return status ; - } + status = NDEF_getNDEFSize(&NDEF_Size); + if (status != NDEF_OK) { + return status ; + } - if (NDEF_Size != 0) { - // There are already records in the NDEF - Record->RecordFlags &= ~MB_Mask; - - status = NfcTag_ReadNDEF(pData); - if (status != NDEF_OK) { - return status ; - } - - uint8_t *pNdefRecord; - sRecordInfo_t LastRecord; - do { - pNdefRecord = pData; - NDEF_IdentifyBuffer(&LastRecord, pData); - pData += LastRecord.PayloadOffset + LastRecord.PayloadLength; - // TO DO: add a security condition to avoid infinite loop if NDEF file is corrupted - } while (!(LastRecord.RecordFlags & ME_Mask)); - LastRecord.RecordFlags &= ~ME_Mask; - *pNdefRecord = LastRecord.RecordFlags; - } else { - // This will be the first message in memory - Record->RecordFlags |= MB_Mask; - } - Record->RecordFlags |= ME_Mask; - uint32_t RecordLength = NDEF_WriteRecord(Record, pData); + if (NDEF_Size != 0) { + // There are already records in the NDEF + Record->RecordFlags &= ~MB_Mask; + status = NfcTag_ReadNDEF(pData); + if (status != NDEF_OK) { + return status ; + } - return NfcTag_WriteNDEF(NDEF_Size + RecordLength, NDEF_Buffer); + uint8_t *pNdefRecord; + sRecordInfo_t LastRecord; + do { + pNdefRecord = pData; + NDEF_IdentifyBuffer(&LastRecord, pData); + pData += LastRecord.PayloadOffset + LastRecord.PayloadLength; + // TO DO: add a security condition to avoid infinite loop if NDEF file is corrupted + } while (!(LastRecord.RecordFlags & ME_Mask)); + LastRecord.RecordFlags &= ~ME_Mask; + *pNdefRecord = LastRecord.RecordFlags; + } else { + // This will be the first message in memory + Record->RecordFlags |= MB_Mask; + } + Record->RecordFlags |= ME_Mask; + uint32_t RecordLength = NDEF_WriteRecord(Record, pData); + + + return NfcTag_WriteNDEF(NDEF_Size + RecordLength, NDEF_Buffer); } @@ -543,65 +543,65 @@ uint16_t NDEF::NDEF_AppendRecord(sRecordInfo_t *Record) */ uint16_t NDEF::NDEF_IdentifyBuffer(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF) { - uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; - - /* Is ID length field present */ - if ((*pNDEF) & IL_Mask) { - IDLengthField = ID_LENGTH_FIELD; + uint16_t SizeOfRecordHeader, TypeNbByte, PayloadLengthField, IDLengthField, IDNbByte; + + /* Is ID length field present */ + if ((*pNDEF) & IL_Mask) { + IDLengthField = ID_LENGTH_FIELD; + } else { + IDLengthField = 0; + } + + /* it's a SR */ + if ((*pNDEF) & SR_Mask) { + /* Analyse short record layout */ + TypeNbByte = pNDEF[1]; + PayloadLengthField = 1; + if (IDLengthField == ID_LENGTH_FIELD) { + IDNbByte = pNDEF[3]; } else { - IDLengthField = 0; + IDNbByte = 0; } - - /* it's a SR */ - if ((*pNDEF) & SR_Mask) { - /* Analyse short record layout */ - TypeNbByte = pNDEF[1]; - PayloadLengthField = 1; - if (IDLengthField == ID_LENGTH_FIELD) { - IDNbByte = pNDEF[3]; - } else { - IDNbByte = 0; - } + } else { + /* Analyse normal record layout */ + TypeNbByte = pNDEF[1]; + PayloadLengthField = 4; + if (IDLengthField == ID_LENGTH_FIELD) { + IDNbByte = pNDEF[6]; } else { - /* Analyse normal record layout */ - TypeNbByte = pNDEF[1]; - PayloadLengthField = 4; - if (IDLengthField == ID_LENGTH_FIELD) { - IDNbByte = pNDEF[6]; - } else { - IDNbByte = 0; - } + IDNbByte = 0; } - - SizeOfRecordHeader = RECORD_FLAG_FIELD + TYPE_LENGTH_FIELD + PayloadLengthField + IDLengthField + TypeNbByte + IDNbByte; - - /* it's a SR */ - if (pNDEF[0] & SR_Mask) { - pRecordStruct->RecordFlags = pNDEF[0]; - pRecordStruct->TypeLength = TypeNbByte; - pRecordStruct->PayloadLength = pNDEF[2]; - pRecordStruct->IDLength = IDNbByte; - memcpy(pRecordStruct->Type, &pNDEF[3 + IDLengthField], TypeNbByte); - memcpy(pRecordStruct->ID, &pNDEF[3 + IDLengthField + TypeNbByte], IDNbByte); - pRecordStruct->PayloadOffset = SizeOfRecordHeader; - } else { - pRecordStruct->RecordFlags = pNDEF[0]; - pRecordStruct->TypeLength = TypeNbByte; - pRecordStruct->PayloadLength = (((uint32_t)pNDEF[2]) << 24) | - (((uint32_t)pNDEF[3]) << 16) | - (((uint32_t)pNDEF[4]) << 8) - | pNDEF[5] ; - pRecordStruct->IDLength = IDNbByte; - memcpy(pRecordStruct->Type, &pNDEF[6 + IDNbByte], TypeNbByte); - memcpy(pRecordStruct->ID, &pNDEF[6 + IDNbByte + TypeNbByte], IDNbByte); - pRecordStruct->PayloadOffset = SizeOfRecordHeader; - } - - pRecordStruct->PayloadBufferAdd = &pNDEF[pRecordStruct->PayloadOffset]; - - NDEF_ParseRecordHeader(pRecordStruct); - - return NDEF_OK; + } + + SizeOfRecordHeader = RECORD_FLAG_FIELD + TYPE_LENGTH_FIELD + PayloadLengthField + IDLengthField + TypeNbByte + IDNbByte; + + /* it's a SR */ + if (pNDEF[0] & SR_Mask) { + pRecordStruct->RecordFlags = pNDEF[0]; + pRecordStruct->TypeLength = TypeNbByte; + pRecordStruct->PayloadLength = pNDEF[2]; + pRecordStruct->IDLength = IDNbByte; + memcpy(pRecordStruct->Type, &pNDEF[3 + IDLengthField], TypeNbByte); + memcpy(pRecordStruct->ID, &pNDEF[3 + IDLengthField + TypeNbByte], IDNbByte); + pRecordStruct->PayloadOffset = SizeOfRecordHeader; + } else { + pRecordStruct->RecordFlags = pNDEF[0]; + pRecordStruct->TypeLength = TypeNbByte; + pRecordStruct->PayloadLength = (((uint32_t)pNDEF[2]) << 24) | + (((uint32_t)pNDEF[3]) << 16) | + (((uint32_t)pNDEF[4]) << 8) + | pNDEF[5] ; + pRecordStruct->IDLength = IDNbByte; + memcpy(pRecordStruct->Type, &pNDEF[6 + IDNbByte], TypeNbByte); + memcpy(pRecordStruct->ID, &pNDEF[6 + IDNbByte + TypeNbByte], IDNbByte); + pRecordStruct->PayloadOffset = SizeOfRecordHeader; + } + + pRecordStruct->PayloadBufferAdd = &pNDEF[pRecordStruct->PayloadOffset]; + + NDEF_ParseRecordHeader(pRecordStruct); + + return NDEF_OK; } /** @@ -612,66 +612,66 @@ uint16_t NDEF::NDEF_IdentifyBuffer(sRecordInfo_t *pRecordStruct, uint8_t *pNDEF) */ uint32_t NDEF::NDEF_WriteRecord(sRecordInfo_t *pRecord, uint8_t *pNDEF) { - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ - /*----------------------------------*/ - /* PAYLOAD */ - /************************************/ - uint8_t *start = pNDEF; - - // start by considering payload length - if (pRecord->PayloadLength <= 0xFF) { - pRecord->RecordFlags |= SR_Mask; - } else { - pRecord->RecordFlags &= ~SR_Mask; - } - - // Then start writing! - *pNDEF++ = pRecord->RecordFlags; - - *pNDEF++ = pRecord->TypeLength; - - if (!(pRecord->RecordFlags & SR_Mask)) { - *pNDEF++ = (pRecord->PayloadLength >> 24) & 0xFF; - *pNDEF++ = (pRecord->PayloadLength >> 16) & 0xFF ; - *pNDEF++ = (pRecord->PayloadLength >> 8) & 0xFF; - } - *pNDEF++ = (pRecord->PayloadLength) & 0xFF; - - if (pRecord->RecordFlags & IL_Mask) { - *pNDEF++ = (pRecord->IDLength); - } - - memcpy(pNDEF, pRecord->Type, pRecord->TypeLength); - pNDEF += pRecord->TypeLength; - - if (pRecord->RecordFlags & IL_Mask) { - memcpy(pNDEF, pRecord->ID, pRecord->IDLength); - pNDEF += pRecord->IDLength; - } - - memcpy(pNDEF, pRecord->PayloadBufferAdd, pRecord->PayloadLength); - pNDEF += pRecord->PayloadLength; - - return (pNDEF - start); + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ + /*----------------------------------*/ + /* PAYLOAD */ + /************************************/ + uint8_t *start = pNDEF; + + // start by considering payload length + if (pRecord->PayloadLength <= 0xFF) { + pRecord->RecordFlags |= SR_Mask; + } else { + pRecord->RecordFlags &= ~SR_Mask; + } + + // Then start writing! + *pNDEF++ = pRecord->RecordFlags; + + *pNDEF++ = pRecord->TypeLength; + + if (!(pRecord->RecordFlags & SR_Mask)) { + *pNDEF++ = (pRecord->PayloadLength >> 24) & 0xFF; + *pNDEF++ = (pRecord->PayloadLength >> 16) & 0xFF ; + *pNDEF++ = (pRecord->PayloadLength >> 8) & 0xFF; + } + *pNDEF++ = (pRecord->PayloadLength) & 0xFF; + + if (pRecord->RecordFlags & IL_Mask) { + *pNDEF++ = (pRecord->IDLength); + } + + memcpy(pNDEF, pRecord->Type, pRecord->TypeLength); + pNDEF += pRecord->TypeLength; + + if (pRecord->RecordFlags & IL_Mask) { + memcpy(pNDEF, pRecord->ID, pRecord->IDLength); + pNDEF += pRecord->IDLength; + } + + memcpy(pNDEF, pRecord->PayloadBufferAdd, pRecord->PayloadLength); + pNDEF += pRecord->PayloadLength; + + return (pNDEF - start); } /** @@ -681,23 +681,23 @@ uint32_t NDEF::NDEF_WriteRecord(sRecordInfo_t *pRecord, uint8_t *pNDEF) */ uint32_t NDEF::NDEF_GetRecordLength(sRecordInfo_t *pRecord) { - // start by considering payload length - if (pRecord->PayloadLength <= 0xFF) { - pRecord->RecordFlags |= SR_Mask; - } else { - pRecord->RecordFlags &= ~SR_Mask; - } - - // Then compute the length - uint32_t length = 1 + // Flags - 1 + // Type length - ((pRecord->RecordFlags & SR_Mask) ? 1 : 4) + // Payload length - ((pRecord->RecordFlags & IL_Mask) ? 1 : 0) + // ID length - pRecord->TypeLength + // Type - ((pRecord->RecordFlags & IL_Mask) ? pRecord->IDLength : 0) + // ID - pRecord->PayloadLength; // Payload; - - return length; + // start by considering payload length + if (pRecord->PayloadLength <= 0xFF) { + pRecord->RecordFlags |= SR_Mask; + } else { + pRecord->RecordFlags &= ~SR_Mask; + } + + // Then compute the length + uint32_t length = 1 + // Flags + 1 + // Type length + ((pRecord->RecordFlags & SR_Mask) ? 1 : 4) + // Payload length + ((pRecord->RecordFlags & IL_Mask) ? 1 : 0) + // ID length + pRecord->TypeLength + // Type + ((pRecord->RecordFlags & IL_Mask) ? pRecord->IDLength : 0) + // ID + pRecord->PayloadLength; // Payload; + + return length; } /** @@ -706,7 +706,7 @@ uint32_t NDEF::NDEF_GetRecordLength(sRecordInfo_t *pRecord) */ uint16_t NDEF::NDEF_ClearNDEF(void) { - return NDEF_WriteNDEF(0, NULL); + return NDEF_WriteNDEF(0, NULL); } /** diff --git a/src/libNDEF/lib_NDEF.h b/src/libNDEF/lib_NDEF.h index b95a7cb..c86ab39 100755 --- a/src/libNDEF/lib_NDEF.h +++ b/src/libNDEF/lib_NDEF.h @@ -44,9 +44,9 @@ #endif #if __has_include("custom_config.h") -#include "custom_config.h" + #include "custom_config.h" #else -#include "default_config.h" + #include "default_config.h" #endif @@ -217,38 +217,38 @@ extern uint8_t NDEF_Record_Buffer [NDEF_RECORD_MAX_SIZE]; extern uint32_t NDEF_Record_Buffer_size; typedef enum { - UNKNOWN_TYPE = 0, - VCARD_TYPE, - UNABRIDGED_URI_TYPE, - WELL_KNOWN_ABRIDGED_URI_TYPE, - URI_SMS_TYPE, - URI_GEO_TYPE, - URI_EMAIL_TYPE, - SMARTPOSTER_TYPE, - URL_TYPE, - TEXT_TYPE, - HANDOVER_TYPE, - /* list of "external type" known by this demo, other external type will be addressed as UNKNWON_TYPE */ - M24SR_DISCOVERY_APP_TYPE, - BT_TYPE, - BLE_TYPE, - URI_WIFITOKEN_TYPE + UNKNOWN_TYPE = 0, + VCARD_TYPE, + UNABRIDGED_URI_TYPE, + WELL_KNOWN_ABRIDGED_URI_TYPE, + URI_SMS_TYPE, + URI_GEO_TYPE, + URI_EMAIL_TYPE, + SMARTPOSTER_TYPE, + URL_TYPE, + TEXT_TYPE, + HANDOVER_TYPE, + /* list of "external type" known by this demo, other external type will be addressed as UNKNWON_TYPE */ + M24SR_DISCOVERY_APP_TYPE, + BT_TYPE, + BLE_TYPE, + URI_WIFITOKEN_TYPE } NDEF_TypeDef; typedef struct sRecordInfo sRecordInfo_t; struct sRecordInfo { - uint8_t RecordFlags; - uint8_t TypeLength; - uint32_t PayloadLength; - uint8_t IDLength; - uint8_t Type[20]; - uint8_t ID[20]; - uint16_t PayloadOffset; - uint8_t *PayloadBufferAdd; /* add where payload content has been stored */ - NDEF_TypeDef NDEF_Type; /* to store identification ID for application */ - sRecordInfo_t *SPRecordStructAdd[SP_MAX_RECORD]; /*in case of smart poster array to store add of other sRecordInfo struct */ - uint8_t NbOfRecordInSPPayload; + uint8_t RecordFlags; + uint8_t TypeLength; + uint32_t PayloadLength; + uint8_t IDLength; + uint8_t Type[20]; + uint8_t ID[20]; + uint16_t PayloadOffset; + uint8_t *PayloadBufferAdd; /* add where payload content has been stored */ + NDEF_TypeDef NDEF_Type; /* to store identification ID for application */ + sRecordInfo_t *SPRecordStructAdd[SP_MAX_RECORD]; /*in case of smart poster array to store add of other sRecordInfo struct */ + uint8_t NbOfRecordInSPPayload; }; #endif /* __LIB_NDEF_H */ diff --git a/src/libNDEF/lib_NDEF_AAR.cpp b/src/libNDEF/lib_NDEF_AAR.cpp index a34e5c1..f84c3ce 100755 --- a/src/libNDEF/lib_NDEF_AAR.cpp +++ b/src/libNDEF/lib_NDEF_AAR.cpp @@ -70,48 +70,48 @@ */ uint16_t NDEF::NDEF_AddAAR(const sAARInfo *pAARStruct) { - uint16_t status = NDEF_ERROR; - - /* AAR: External Type Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- IL=0, CF=0 and SR=1 TNF=4 NFC Forum external type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ /* android.com:pkg */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* Do we have to add AAR to an existing NDEF message */ - /* retrieve current NDEF size and current record flag*/ - sRecordInfo_t AARrecord; - - /* fill AAR record header */ - AARrecord.RecordFlags = SR_Mask | TNF_NFCForumExternal; - AARrecord.TypeLength = AAR_TYPE_STRING_LENGTH; - - memcpy(AARrecord.Type, AAR_TYPE_STRING, AAR_TYPE_STRING_LENGTH); - - /* fill AAR payload */ - AARrecord.PayloadBufferAdd = (uint8_t *)pAARStruct->PackageName; - AARrecord.PayloadLength = strlen(pAARStruct->PackageName) ; - - status = NDEF_AppendRecord(&AARrecord); - - return status; + uint16_t status = NDEF_ERROR; + + /* AAR: External Type Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- IL=0, CF=0 and SR=1 TNF=4 NFC Forum external type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ /* android.com:pkg */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* Do we have to add AAR to an existing NDEF message */ + /* retrieve current NDEF size and current record flag*/ + sRecordInfo_t AARrecord; + + /* fill AAR record header */ + AARrecord.RecordFlags = SR_Mask | TNF_NFCForumExternal; + AARrecord.TypeLength = AAR_TYPE_STRING_LENGTH; + + memcpy(AARrecord.Type, AAR_TYPE_STRING, AAR_TYPE_STRING_LENGTH); + + /* fill AAR payload */ + AARrecord.PayloadBufferAdd = (uint8_t *)pAARStruct->PackageName; + AARrecord.PayloadLength = strlen(pAARStruct->PackageName) ; + + status = NDEF_AppendRecord(&AARrecord); + + return status; } diff --git a/src/libNDEF/lib_NDEF_AAR.h b/src/libNDEF/lib_NDEF_AAR.h index 2069c66..b9fdf47 100755 --- a/src/libNDEF/lib_NDEF_AAR.h +++ b/src/libNDEF/lib_NDEF_AAR.h @@ -35,7 +35,7 @@ #include "lib_NDEF.h" typedef struct { - char PackageName[80]; + char PackageName[80]; } sAARInfo; diff --git a/src/libNDEF/lib_NDEF_Bluetooth.cpp b/src/libNDEF/lib_NDEF_Bluetooth.cpp index 89b3e30..3b05773 100755 --- a/src/libNDEF/lib_NDEF_Bluetooth.cpp +++ b/src/libNDEF/lib_NDEF_Bluetooth.cpp @@ -109,11 +109,11 @@ */ uint8_t *NDEF::NDEF_BluetoothCopy(uint8_t *dst, uint8_t *src, uint32_t length) { - uint32_t index; - for (index = 0 ; index < length; index++) { - dst[index] = src[length - index - 1]; - } - return dst; + uint32_t index; + for (index = 0 ; index < length; index++) { + dst[index] = src[length - index - 1]; + } + return dst; } /** @@ -125,150 +125,150 @@ uint8_t *NDEF::NDEF_BluetoothCopy(uint8_t *dst, uint8_t *src, uint32_t length) */ uint16_t NDEF::NDEF_ReadBluetoothOOB(sRecordInfo_t *pRecord, Ndef_Bluetooth_OOB_t *pBluetooth) { - uint8_t *pData = pRecord->PayloadBufferAdd; - uint8_t *OOBEnd = pRecord->PayloadBufferAdd + pRecord->PayloadLength; - - pBluetooth->OptionalMask = 0; - pBluetooth->nbServiceData = 0; - pBluetooth->Role = NDEF_BLE_ROLE_UNDEF; - pBluetooth->DeviceAddressType = NDEF_BLE_UNDEF_ADDRESS_TYPE; - pBluetooth->nbUUID16 = 0; - pBluetooth->nbUUID32 = 0; - pBluetooth->nbUUID128 = 0; - pBluetooth->nbServiceSolicitation16 = 0; - pBluetooth->nbServiceSolicitation128 = 0; - - if ((pRecord->TypeLength == strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE)) && - !memcmp(pRecord->Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE))) { - pBluetooth->Type = NDEF_BLUETOOTH_BREDR; - /* Retrieve mandatory OOB data: */ - /* 2 bytes for length and 6 bytes for device addr */ - NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceAddress, &pData[2], sizeof(pBluetooth->DeviceAddress)); - pData += 8; - } else if ((pRecord->TypeLength == strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE)) && - !memcmp(pRecord->Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE))) { - pBluetooth->Type = NDEF_BLUETOOTH_BLE; - /* for BLE, mandatory fields are in EIR */ - } else { - /* This is an unknown MIME type */ - return NDEF_ERROR; - } - - /* EIR format: 1 byte for length, 1 byte for type, n bytes for data */ - while (pData < OOBEnd) { - NDEF_EIR_t *rEIR = (NDEF_EIR_t *)pData; - /* +1 for EIR length byte */ - pData += rEIR->length + 1; - - /* keep track of all EIR found */ - if (rEIR->type < 0x20) { - NDEF_BLUETOOTH_SET_OPTIONAL_MASK(pBluetooth, rEIR->type); - } - - switch (rEIR->type) { - case BLUETOOTH_EIR_FLAGS: - pBluetooth->Flags = *rEIR->value; - break; - - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16: - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16: - pBluetooth->nbUUID16 = (rEIR->length - 1) / 2 ; - NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID16, rEIR->value, rEIR->length - 1); - break; - - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32: - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32: - pBluetooth->nbUUID32 = (rEIR->length - 1) / 4 ; - NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID32, rEIR->value, rEIR->length - 1); - break; - - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128: - case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128: - pBluetooth->nbUUID128 = (rEIR->length - 1) / 16 ; - NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID128, rEIR->value, rEIR->length - 1); - break; - - case BLUETOOTH_EIR_SHORT_LOCAL_NAME: - case BLUETOOTH_EIR_COMPLETE_LOCAL_NAME: - /* No worry about name length as max EIR length is 0xff using 1 byte for the type metadata */ - memcpy(pBluetooth->LocalName, rEIR->value, rEIR->length - 1); - pBluetooth->LocalName[rEIR->length] = '\0'; - break; - - case BLUETOOTH_EIR_TX_POWER_LEVEL: - pBluetooth->TxPowerLevel = *rEIR->value; - break; - - case BLUETOOTH_EIR_DEVICE_CLASS: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceClass, rEIR->value, sizeof(pBluetooth->DeviceClass)); - break; - - case BLUETOOTH_EIR_SIMPLE_PAIRING_HASH: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->SimplePairingHash, rEIR->value, sizeof(pBluetooth->SimplePairingHash)); - break; - - case BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->SimplePairingRandomizer, rEIR->value, sizeof(pBluetooth->SimplePairingRandomizer)); - break; - - case BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->SecureManagerTK, rEIR->value, sizeof(pBluetooth->SecureManagerTK)); - break; - - case BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS: - pBluetooth->SMFlags = *rEIR->value; - break; - - case BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->SlaveConnIntervalRange, rEIR->value, sizeof(pBluetooth->SlaveConnIntervalRange)); - break; - - case BLUETOOTH_EIR_SERVICE_SOLICITATION_16: - pBluetooth->nbServiceSolicitation16 = (rEIR->length - 1) / 2 ; - NDEF_BluetoothCopy((uint8_t *)pBluetooth->ServiceSolicitation16, rEIR->value, rEIR->length - 1); - break; - - case BLUETOOTH_EIR_SERVICE_SOLICITATION_128: - pBluetooth->nbServiceSolicitation128 = (rEIR->length - 1) / 16 ; - NDEF_BluetoothCopy((uint8_t *)pBluetooth->ServiceSolicitation128, rEIR->value, rEIR->length - 1); - break; - - case BLUETOOTH_EIR_SERVICE_DATA: - /* a specific function should be used for this EIR */ - pBluetooth->nbServiceData++; - break; - - case BLUETOOTH_EIR_MANUFACTURER_DATA: - /* a specific function should be used for this EIR */ - pBluetooth->nbManufacturerData++; - break; - - case BLUETOOTH_EIR_APPEARANCE: - pBluetooth->Appearance = *(uint16_t *)rEIR->value; - break; - - case BLUETOOTH_EIR_BLE_DEVICE_ADDRESS: - NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceAddress, rEIR->value, sizeof(pBluetooth->DeviceAddress)); - pBluetooth->DeviceAddressType = (Ndef_BLE_Address_Type_t)rEIR->value[sizeof(pBluetooth->DeviceAddress)]; - break; - - case BLUETOOTH_EIR_BLE_ROLE: - pBluetooth->Role = (Ndef_BLE_Role_t) * rEIR->value; - break; - - default: - pBluetooth->nbUnknown++; - break; - } /* switch rEIR->type */ - } /* while (pData < OOBEnd) */ - /* Check that BLE mandatory fields are there */ - if ((pBluetooth->Type == NDEF_BLUETOOTH_BLE) && - (!NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_BLE_DEVICE_ADDRESS) || - !NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_BLE_ROLE))) { - return NDEF_ERROR; + uint8_t *pData = pRecord->PayloadBufferAdd; + uint8_t *OOBEnd = pRecord->PayloadBufferAdd + pRecord->PayloadLength; + + pBluetooth->OptionalMask = 0; + pBluetooth->nbServiceData = 0; + pBluetooth->Role = NDEF_BLE_ROLE_UNDEF; + pBluetooth->DeviceAddressType = NDEF_BLE_UNDEF_ADDRESS_TYPE; + pBluetooth->nbUUID16 = 0; + pBluetooth->nbUUID32 = 0; + pBluetooth->nbUUID128 = 0; + pBluetooth->nbServiceSolicitation16 = 0; + pBluetooth->nbServiceSolicitation128 = 0; + + if ((pRecord->TypeLength == strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE)) && + !memcmp(pRecord->Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE))) { + pBluetooth->Type = NDEF_BLUETOOTH_BREDR; + /* Retrieve mandatory OOB data: */ + /* 2 bytes for length and 6 bytes for device addr */ + NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceAddress, &pData[2], sizeof(pBluetooth->DeviceAddress)); + pData += 8; + } else if ((pRecord->TypeLength == strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE)) && + !memcmp(pRecord->Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE))) { + pBluetooth->Type = NDEF_BLUETOOTH_BLE; + /* for BLE, mandatory fields are in EIR */ + } else { + /* This is an unknown MIME type */ + return NDEF_ERROR; + } + + /* EIR format: 1 byte for length, 1 byte for type, n bytes for data */ + while (pData < OOBEnd) { + NDEF_EIR_t *rEIR = (NDEF_EIR_t *)pData; + /* +1 for EIR length byte */ + pData += rEIR->length + 1; + + /* keep track of all EIR found */ + if (rEIR->type < 0x20) { + NDEF_BLUETOOTH_SET_OPTIONAL_MASK(pBluetooth, rEIR->type); } - return NDEF_OK; + switch (rEIR->type) { + case BLUETOOTH_EIR_FLAGS: + pBluetooth->Flags = *rEIR->value; + break; + + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16: + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16: + pBluetooth->nbUUID16 = (rEIR->length - 1) / 2 ; + NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID16, rEIR->value, rEIR->length - 1); + break; + + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32: + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32: + pBluetooth->nbUUID32 = (rEIR->length - 1) / 4 ; + NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID32, rEIR->value, rEIR->length - 1); + break; + + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128: + case BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128: + pBluetooth->nbUUID128 = (rEIR->length - 1) / 16 ; + NDEF_BluetoothCopy((uint8_t *)pBluetooth->ClassUUID128, rEIR->value, rEIR->length - 1); + break; + + case BLUETOOTH_EIR_SHORT_LOCAL_NAME: + case BLUETOOTH_EIR_COMPLETE_LOCAL_NAME: + /* No worry about name length as max EIR length is 0xff using 1 byte for the type metadata */ + memcpy(pBluetooth->LocalName, rEIR->value, rEIR->length - 1); + pBluetooth->LocalName[rEIR->length] = '\0'; + break; + + case BLUETOOTH_EIR_TX_POWER_LEVEL: + pBluetooth->TxPowerLevel = *rEIR->value; + break; + + case BLUETOOTH_EIR_DEVICE_CLASS: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceClass, rEIR->value, sizeof(pBluetooth->DeviceClass)); + break; + + case BLUETOOTH_EIR_SIMPLE_PAIRING_HASH: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->SimplePairingHash, rEIR->value, sizeof(pBluetooth->SimplePairingHash)); + break; + + case BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->SimplePairingRandomizer, rEIR->value, sizeof(pBluetooth->SimplePairingRandomizer)); + break; + + case BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->SecureManagerTK, rEIR->value, sizeof(pBluetooth->SecureManagerTK)); + break; + + case BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS: + pBluetooth->SMFlags = *rEIR->value; + break; + + case BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->SlaveConnIntervalRange, rEIR->value, sizeof(pBluetooth->SlaveConnIntervalRange)); + break; + + case BLUETOOTH_EIR_SERVICE_SOLICITATION_16: + pBluetooth->nbServiceSolicitation16 = (rEIR->length - 1) / 2 ; + NDEF_BluetoothCopy((uint8_t *)pBluetooth->ServiceSolicitation16, rEIR->value, rEIR->length - 1); + break; + + case BLUETOOTH_EIR_SERVICE_SOLICITATION_128: + pBluetooth->nbServiceSolicitation128 = (rEIR->length - 1) / 16 ; + NDEF_BluetoothCopy((uint8_t *)pBluetooth->ServiceSolicitation128, rEIR->value, rEIR->length - 1); + break; + + case BLUETOOTH_EIR_SERVICE_DATA: + /* a specific function should be used for this EIR */ + pBluetooth->nbServiceData++; + break; + + case BLUETOOTH_EIR_MANUFACTURER_DATA: + /* a specific function should be used for this EIR */ + pBluetooth->nbManufacturerData++; + break; + + case BLUETOOTH_EIR_APPEARANCE: + pBluetooth->Appearance = *(uint16_t *)rEIR->value; + break; + + case BLUETOOTH_EIR_BLE_DEVICE_ADDRESS: + NDEF_BluetoothCopy((uint8_t *)pBluetooth->DeviceAddress, rEIR->value, sizeof(pBluetooth->DeviceAddress)); + pBluetooth->DeviceAddressType = (Ndef_BLE_Address_Type_t)rEIR->value[sizeof(pBluetooth->DeviceAddress)]; + break; + + case BLUETOOTH_EIR_BLE_ROLE: + pBluetooth->Role = (Ndef_BLE_Role_t) * rEIR->value; + break; + + default: + pBluetooth->nbUnknown++; + break; + } /* switch rEIR->type */ + } /* while (pData < OOBEnd) */ + /* Check that BLE mandatory fields are there */ + if ((pBluetooth->Type == NDEF_BLUETOOTH_BLE) && + (!NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_BLE_DEVICE_ADDRESS) || + !NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_BLE_ROLE))) { + return NDEF_ERROR; + } + + return NDEF_OK; } /** @@ -281,224 +281,224 @@ uint16_t NDEF::NDEF_ReadBluetoothOOB(sRecordInfo_t *pRecord, Ndef_Bluetooth_OOB_ */ uint16_t NDEF::NDEF_AppendBluetoothOOB(Ndef_Bluetooth_OOB_t *pBluetooth, char *RecordID) { - sRecordInfo_t Record; - uint16_t status; - - Record.RecordFlags = TNF_MediaType; - Record.RecordFlags |= (RecordID != NULL) ? IL_Mask : 0; - Record.IDLength = strlen(RecordID); - memcpy(Record.ID, RecordID, Record.IDLength); - - if (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) { - Record.TypeLength = strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE); - memcpy(Record.Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, Record.TypeLength); - } else if (pBluetooth->Type == NDEF_BLUETOOTH_BLE) { - Record.TypeLength = strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE); - memcpy(Record.Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, Record.TypeLength); + sRecordInfo_t Record; + uint16_t status; + + Record.RecordFlags = TNF_MediaType; + Record.RecordFlags |= (RecordID != NULL) ? IL_Mask : 0; + Record.IDLength = strlen(RecordID); + memcpy(Record.ID, RecordID, Record.IDLength); + + if (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) { + Record.TypeLength = strlen(NDEF_BLUETOOTH_BREDR_MIME_TYPE); + memcpy(Record.Type, NDEF_BLUETOOTH_BREDR_MIME_TYPE, Record.TypeLength); + } else if (pBluetooth->Type == NDEF_BLUETOOTH_BLE) { + Record.TypeLength = strlen(NDEF_BLUETOOTH_BLE_MIME_TYPE); + memcpy(Record.Type, NDEF_BLUETOOTH_BLE_MIME_TYPE, Record.TypeLength); + } else { + return NDEF_ERROR; + } + + /* Generate OOB payload */ + Record.PayloadLength = NDEF_GetBluetoothOOBLength(pBluetooth); + Record.PayloadBufferAdd = NDEF_Record_Buffer; + if (Record.PayloadLength > NDEF_RECORD_MAX_SIZE) { + return NDEF_ERROR_MEMORY_INTERNAL; + } + + /* pData: pointer to ease increment of record buffer address (byte granularity) */ + uint8_t *pData = Record.PayloadBufferAdd; + + /* for BR-EDR Device address & length are managed outside EIR */ + if (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) { + *pData = Record.PayloadLength; + pData += 2; + NDEF_BluetoothCopy(pData, (uint8_t *)pBluetooth->DeviceAddress, sizeof(pBluetooth->DeviceAddress)); + pData += sizeof(pBluetooth->DeviceAddress); + } + + /* wEIR: pointer to ease write to the buffer. + * length always set with an additional +1 corresponding to the EIR type byte. + * pData increment is always done with an additional +1 corresponding to the EIR length byte. + */ + NDEF_EIR_t *wEIR; + + + if (pBluetooth->Type == NDEF_BLUETOOTH_BLE) { + /* following EIR are mandatory for BLE */ + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->DeviceAddress) + sizeof(pBluetooth->DeviceAddressType) + 1; + wEIR->type = BLUETOOTH_EIR_BLE_DEVICE_ADDRESS; + NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->DeviceAddress, sizeof(pBluetooth->DeviceAddress)); + wEIR->value[sizeof(pBluetooth->DeviceAddress)] = pBluetooth->DeviceAddressType; + pData += wEIR->length + 1; + + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->Role) + 1; + wEIR->type = BLUETOOTH_EIR_BLE_ROLE; + wEIR->value[0] = pBluetooth->Role; + pData += wEIR->length + 1; + + } + + /* Rely on the optional mask to know if a EIR is required or not */ + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_FLAGS)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->Flags) + 1; + wEIR->type = BLUETOOTH_EIR_FLAGS; + wEIR->value[0] = pBluetooth->Flags; + pData += wEIR->length + 1; + } + + if (pBluetooth->nbUUID16 > 0) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = 2 * pBluetooth->nbUUID16 + 1; + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16)) { + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16; } else { - return NDEF_ERROR; - } - - /* Generate OOB payload */ - Record.PayloadLength = NDEF_GetBluetoothOOBLength(pBluetooth); - Record.PayloadBufferAdd = NDEF_Record_Buffer; - if (Record.PayloadLength > NDEF_RECORD_MAX_SIZE) { - return NDEF_ERROR_MEMORY_INTERNAL; - } - - /* pData: pointer to ease increment of record buffer address (byte granularity) */ - uint8_t *pData = Record.PayloadBufferAdd; - - /* for BR-EDR Device address & length are managed outside EIR */ - if (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) { - *pData = Record.PayloadLength; - pData += 2; - NDEF_BluetoothCopy(pData, (uint8_t *)pBluetooth->DeviceAddress, sizeof(pBluetooth->DeviceAddress)); - pData += sizeof(pBluetooth->DeviceAddress); - } - - /* wEIR: pointer to ease write to the buffer. - * length always set with an additional +1 corresponding to the EIR type byte. - * pData increment is always done with an additional +1 corresponding to the EIR length byte. - */ - NDEF_EIR_t *wEIR; - - - if (pBluetooth->Type == NDEF_BLUETOOTH_BLE) { - /* following EIR are mandatory for BLE */ - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->DeviceAddress) + sizeof(pBluetooth->DeviceAddressType) + 1; - wEIR->type = BLUETOOTH_EIR_BLE_DEVICE_ADDRESS; - NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->DeviceAddress, sizeof(pBluetooth->DeviceAddress)); - wEIR->value[sizeof(pBluetooth->DeviceAddress)] = pBluetooth->DeviceAddressType; - pData += wEIR->length + 1; - - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->Role) + 1; - wEIR->type = BLUETOOTH_EIR_BLE_ROLE; - wEIR->value[0] = pBluetooth->Role; - pData += wEIR->length + 1; - - } - - /* Rely on the optional mask to know if a EIR is required or not */ - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_FLAGS)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->Flags) + 1; - wEIR->type = BLUETOOTH_EIR_FLAGS; - wEIR->value[0] = pBluetooth->Flags; - pData += wEIR->length + 1; - } - - if (pBluetooth->nbUUID16 > 0) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = 2 * pBluetooth->nbUUID16 + 1; - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16)) { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16; - } else { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16; - } - NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ClassUUID16, 2 * pBluetooth->nbUUID16); - pData += wEIR->length + 1; - - } - - if (pBluetooth->nbUUID32 > 0) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = 4 * pBluetooth->nbUUID32 + 1; - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32)) { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32; - } else { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32; - } - NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->ClassUUID32, 4 * pBluetooth->nbUUID32); - pData += wEIR->length + 1; - - } - - if (pBluetooth->nbUUID128 > 0) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = 16 * pBluetooth->nbUUID128 + 1; - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128)) { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128; - } else { - wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128; - } - NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ClassUUID128, 16 * pBluetooth->nbUUID128); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME) || - NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_COMPLETE_LOCAL_NAME)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = strlen(pBluetooth->LocalName) + 1; - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME)) { - wEIR->type = BLUETOOTH_EIR_SHORT_LOCAL_NAME; - } else { - wEIR->type = BLUETOOTH_EIR_COMPLETE_LOCAL_NAME; - } - memcpy(wEIR->value, pBluetooth->LocalName, strlen(pBluetooth->LocalName)); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_TX_POWER_LEVEL)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->TxPowerLevel) + 1; - wEIR->type = BLUETOOTH_EIR_TX_POWER_LEVEL; - wEIR->value[0] = pBluetooth->TxPowerLevel; - pData += wEIR->length + 1; - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_DEVICE_CLASS)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->DeviceClass) + 1; - wEIR->type = BLUETOOTH_EIR_DEVICE_CLASS; - NDEF_BluetoothCopy(wEIR->value, pBluetooth->DeviceClass, sizeof(pBluetooth->DeviceClass)); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_HASH)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->SimplePairingHash) + 1; - wEIR->type = BLUETOOTH_EIR_SIMPLE_PAIRING_HASH; - NDEF_BluetoothCopy(wEIR->value, pBluetooth->SimplePairingHash, sizeof(pBluetooth->SimplePairingHash)); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->SimplePairingRandomizer) + 1; - wEIR->type = BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER; - NDEF_BluetoothCopy(wEIR->value, pBluetooth->SimplePairingRandomizer, sizeof(pBluetooth->SimplePairingRandomizer)); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->SecureManagerTK) + 1; - wEIR->type = BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE; - NDEF_BluetoothCopy(wEIR->value, pBluetooth->SecureManagerTK, sizeof(pBluetooth->SecureManagerTK)); - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->SMFlags) + 1; - wEIR->type = BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS; - wEIR->value[0] = pBluetooth->SMFlags; - pData += wEIR->length + 1; - - } - - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->SlaveConnIntervalRange) + 1; - wEIR->type = BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE; - NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->SlaveConnIntervalRange, sizeof(pBluetooth->SlaveConnIntervalRange)); - pData += wEIR->length + 1; - + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16; } + NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ClassUUID16, 2 * pBluetooth->nbUUID16); + pData += wEIR->length + 1; - if (pBluetooth->nbServiceSolicitation16 > 0) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = 2 * pBluetooth->nbServiceSolicitation16 + 1; - wEIR->type = BLUETOOTH_EIR_SERVICE_SOLICITATION_16; - NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->ServiceSolicitation16, 16 * pBluetooth->nbServiceSolicitation16); - pData += wEIR->length + 1; - - } - - if (pBluetooth->nbServiceSolicitation128 > 0) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = 16 * pBluetooth->nbServiceSolicitation128 + 1; - wEIR->type = BLUETOOTH_EIR_SERVICE_SOLICITATION_128; - NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ServiceSolicitation128, 16 * pBluetooth->nbServiceSolicitation128); - pData += wEIR->length + 1; + } + if (pBluetooth->nbUUID32 > 0) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = 4 * pBluetooth->nbUUID32 + 1; + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32)) { + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32; + } else { + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32; } + NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->ClassUUID32, 4 * pBluetooth->nbUUID32); + pData += wEIR->length + 1; - if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_APPEARANCE)) { - wEIR = (NDEF_EIR_t *)pData; - wEIR->length = sizeof(pBluetooth->Appearance) + 1; - wEIR->type = BLUETOOTH_EIR_APPEARANCE; - wEIR->value[0] = pBluetooth->Appearance; - pData += wEIR->length + 1; + } + if (pBluetooth->nbUUID128 > 0) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = 16 * pBluetooth->nbUUID128 + 1; + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128)) { + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128; + } else { + wEIR->type = BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128; } + NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ClassUUID128, 16 * pBluetooth->nbUUID128); + pData += wEIR->length + 1; + } - status = NDEF_AppendRecord(&Record); - if (status != NDEF_OK) { - return status; + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME) || + NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_COMPLETE_LOCAL_NAME)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = strlen(pBluetooth->LocalName) + 1; + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME)) { + wEIR->type = BLUETOOTH_EIR_SHORT_LOCAL_NAME; + } else { + wEIR->type = BLUETOOTH_EIR_COMPLETE_LOCAL_NAME; } - - return NDEF_OK; + memcpy(wEIR->value, pBluetooth->LocalName, strlen(pBluetooth->LocalName)); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_TX_POWER_LEVEL)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->TxPowerLevel) + 1; + wEIR->type = BLUETOOTH_EIR_TX_POWER_LEVEL; + wEIR->value[0] = pBluetooth->TxPowerLevel; + pData += wEIR->length + 1; + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_DEVICE_CLASS)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->DeviceClass) + 1; + wEIR->type = BLUETOOTH_EIR_DEVICE_CLASS; + NDEF_BluetoothCopy(wEIR->value, pBluetooth->DeviceClass, sizeof(pBluetooth->DeviceClass)); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_HASH)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->SimplePairingHash) + 1; + wEIR->type = BLUETOOTH_EIR_SIMPLE_PAIRING_HASH; + NDEF_BluetoothCopy(wEIR->value, pBluetooth->SimplePairingHash, sizeof(pBluetooth->SimplePairingHash)); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->SimplePairingRandomizer) + 1; + wEIR->type = BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER; + NDEF_BluetoothCopy(wEIR->value, pBluetooth->SimplePairingRandomizer, sizeof(pBluetooth->SimplePairingRandomizer)); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->SecureManagerTK) + 1; + wEIR->type = BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE; + NDEF_BluetoothCopy(wEIR->value, pBluetooth->SecureManagerTK, sizeof(pBluetooth->SecureManagerTK)); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->SMFlags) + 1; + wEIR->type = BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS; + wEIR->value[0] = pBluetooth->SMFlags; + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->SlaveConnIntervalRange) + 1; + wEIR->type = BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE; + NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->SlaveConnIntervalRange, sizeof(pBluetooth->SlaveConnIntervalRange)); + pData += wEIR->length + 1; + + } + + if (pBluetooth->nbServiceSolicitation16 > 0) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = 2 * pBluetooth->nbServiceSolicitation16 + 1; + wEIR->type = BLUETOOTH_EIR_SERVICE_SOLICITATION_16; + NDEF_BluetoothCopy(wEIR->value, (uint8_t *)pBluetooth->ServiceSolicitation16, 16 * pBluetooth->nbServiceSolicitation16); + pData += wEIR->length + 1; + + } + + if (pBluetooth->nbServiceSolicitation128 > 0) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = 16 * pBluetooth->nbServiceSolicitation128 + 1; + wEIR->type = BLUETOOTH_EIR_SERVICE_SOLICITATION_128; + NDEF_BluetoothCopy(wEIR->value, (uint8_t *) pBluetooth->ServiceSolicitation128, 16 * pBluetooth->nbServiceSolicitation128); + pData += wEIR->length + 1; + + } + + if (NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_APPEARANCE)) { + wEIR = (NDEF_EIR_t *)pData; + wEIR->length = sizeof(pBluetooth->Appearance) + 1; + wEIR->type = BLUETOOTH_EIR_APPEARANCE; + wEIR->value[0] = pBluetooth->Appearance; + pData += wEIR->length + 1; + + } + + + status = NDEF_AppendRecord(&Record); + if (status != NDEF_OK) { + return status; + } + + return NDEF_OK; } /** @@ -508,27 +508,27 @@ uint16_t NDEF::NDEF_AppendBluetoothOOB(Ndef_Bluetooth_OOB_t *pBluetooth, char *R */ uint32_t NDEF::NDEF_GetBluetoothOOBLength(Ndef_Bluetooth_OOB_t *pBluetooth) { - uint32_t length = (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) ? sizeof(pBluetooth->DeviceAddress) + 2 : 0; // +2 is for BR/EDR mandatory length - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_FLAGS) ? sizeof(pBluetooth->Flags) + 2 : 0 ; - length += pBluetooth->nbUUID16 ? pBluetooth->nbUUID16 * 2 + 2 : 0; - length += pBluetooth->nbUUID32 ? pBluetooth->nbUUID32 * 4 + 2 : 0; - length += pBluetooth->nbUUID128 ? pBluetooth->nbUUID128 * 16 + 2 : 0; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME) ? strlen(pBluetooth->LocalName) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_COMPLETE_LOCAL_NAME) ? strlen(pBluetooth->LocalName) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_TX_POWER_LEVEL) ? sizeof(pBluetooth->TxPowerLevel + 2) : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_DEVICE_CLASS) ? sizeof(pBluetooth->DeviceClass) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_HASH) ? sizeof(pBluetooth->SimplePairingHash) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER) ? sizeof(pBluetooth->SimplePairingRandomizer) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE) ? sizeof(pBluetooth->SecureManagerTK) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS) ? sizeof(pBluetooth->SMFlags) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE) ? sizeof(pBluetooth->SlaveConnIntervalRange) + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_SOLICITATION_16) ? pBluetooth->nbServiceSolicitation16 * 2 + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_SOLICITATION_128) ? pBluetooth->nbServiceSolicitation128 * 16 + 2 : 0 ; - length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_APPEARANCE) ? sizeof(pBluetooth->Appearance) + 2 : 0 ; - length += (pBluetooth->Type == NDEF_BLUETOOTH_BLE) ? sizeof(pBluetooth->DeviceAddress) + sizeof(pBluetooth->DeviceAddressType) + 2 : 0 ; - length += (pBluetooth->Type == NDEF_BLUETOOTH_BLE) ? sizeof(pBluetooth->Role) + 2 : 0; - - return length; + uint32_t length = (pBluetooth->Type == NDEF_BLUETOOTH_BREDR) ? sizeof(pBluetooth->DeviceAddress) + 2 : 0; // +2 is for BR/EDR mandatory length + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_FLAGS) ? sizeof(pBluetooth->Flags) + 2 : 0 ; + length += pBluetooth->nbUUID16 ? pBluetooth->nbUUID16 * 2 + 2 : 0; + length += pBluetooth->nbUUID32 ? pBluetooth->nbUUID32 * 4 + 2 : 0; + length += pBluetooth->nbUUID128 ? pBluetooth->nbUUID128 * 16 + 2 : 0; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SHORT_LOCAL_NAME) ? strlen(pBluetooth->LocalName) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_COMPLETE_LOCAL_NAME) ? strlen(pBluetooth->LocalName) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_TX_POWER_LEVEL) ? sizeof(pBluetooth->TxPowerLevel + 2) : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_DEVICE_CLASS) ? sizeof(pBluetooth->DeviceClass) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_HASH) ? sizeof(pBluetooth->SimplePairingHash) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER) ? sizeof(pBluetooth->SimplePairingRandomizer) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE) ? sizeof(pBluetooth->SecureManagerTK) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS) ? sizeof(pBluetooth->SMFlags) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE) ? sizeof(pBluetooth->SlaveConnIntervalRange) + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_SOLICITATION_16) ? pBluetooth->nbServiceSolicitation16 * 2 + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_SERVICE_SOLICITATION_128) ? pBluetooth->nbServiceSolicitation128 * 16 + 2 : 0 ; + length += NDEF_BLUETOOTH_GET_OPTIONAL_MASK(pBluetooth, BLUETOOTH_EIR_APPEARANCE) ? sizeof(pBluetooth->Appearance) + 2 : 0 ; + length += (pBluetooth->Type == NDEF_BLUETOOTH_BLE) ? sizeof(pBluetooth->DeviceAddress) + sizeof(pBluetooth->DeviceAddressType) + 2 : 0 ; + length += (pBluetooth->Type == NDEF_BLUETOOTH_BLE) ? sizeof(pBluetooth->Role) + 2 : 0; + + return length; } /** * @} diff --git a/src/libNDEF/lib_NDEF_Bluetooth.h b/src/libNDEF/lib_NDEF_Bluetooth.h index 91bfabd..7f7e1bb 100755 --- a/src/libNDEF/lib_NDEF_Bluetooth.h +++ b/src/libNDEF/lib_NDEF_Bluetooth.h @@ -46,40 +46,40 @@ /** @brief Enumerates the Extended Inquiry Responses, as defined in the Bluetooth v4.0 core specification. */ typedef enum { - BLUETOOTH_EIR_FLAGS = 0x01, /**< Bluetooth flags:\n + BLUETOOTH_EIR_FLAGS = 0x01, /**< Bluetooth flags:\n b0: LE limited Discoverable Mode,\n b1: LE general Discoverable Mode,\n b2: BR/EDR not supported,\n b3: Simultaneous LE & BR/EDR Controller,\n b4: Simultaneous LE & BR/EDR Host */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16 = 0x02, /**< Bluetooth service UUID on 16-bits (partial list) */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16 = 0x03, /**< Bluetooth service UUID on 16-bits (complete list) */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32 = 0x04, /**< Bluetooth service UUID on 32-bits (partial list) */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32 = 0x05, /**< Bluetooth service UUID on 32-bits (complete list) */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128 = 0x06, /**< Bluetooth service UUID on 128-bits (partial list) */ - BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128 = 0x07, /**< Bluetooth service UUID on 128-bits (complete list) */ - BLUETOOTH_EIR_SHORT_LOCAL_NAME = 0x08, /**< Shortened local name */ - BLUETOOTH_EIR_COMPLETE_LOCAL_NAME = 0x09, /**< Complete local name */ - BLUETOOTH_EIR_TX_POWER_LEVEL = 0x0A, /**< TX Power Level (1 byte): 0xXX:-127 to +127dBm */ - BLUETOOTH_EIR_DEVICE_CLASS = 0x0D, /**< Class of device, Format defined in Assigned Numbers */ - BLUETOOTH_EIR_SIMPLE_PAIRING_HASH = 0x0E, /**< Simple Pairing Hash C (16 octets), Format defined in [Vol. 2], Part H Section 7.2.2*/ - BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER = 0x0F, /**< Simple Pairing Randomizer R (16 octets), Format defined in[Vol. 2], Part H Section 7.2.2 */ - BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE = 0x10, /**< TK Value: Value as used in pairing over LE Physical channel. Format defined in [Vol. 3], Part H Section 2.3*/ - BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS = 0x11, /**< Flags (1 octet):\n + BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16 = 0x02, /**< Bluetooth service UUID on 16-bits (partial list) */ + BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16 = 0x03, /**< Bluetooth service UUID on 16-bits (complete list) */ + BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32 = 0x04, /**< Bluetooth service UUID on 32-bits (partial list) */ + BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32 = 0x05, /**< Bluetooth service UUID on 32-bits (complete list) */ + BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128 = 0x06, /**< Bluetooth service UUID on 128-bits (partial list) */ + BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128 = 0x07, /**< Bluetooth service UUID on 128-bits (complete list) */ + BLUETOOTH_EIR_SHORT_LOCAL_NAME = 0x08, /**< Shortened local name */ + BLUETOOTH_EIR_COMPLETE_LOCAL_NAME = 0x09, /**< Complete local name */ + BLUETOOTH_EIR_TX_POWER_LEVEL = 0x0A, /**< TX Power Level (1 byte): 0xXX:-127 to +127dBm */ + BLUETOOTH_EIR_DEVICE_CLASS = 0x0D, /**< Class of device, Format defined in Assigned Numbers */ + BLUETOOTH_EIR_SIMPLE_PAIRING_HASH = 0x0E, /**< Simple Pairing Hash C (16 octets), Format defined in [Vol. 2], Part H Section 7.2.2*/ + BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER = 0x0F, /**< Simple Pairing Randomizer R (16 octets), Format defined in[Vol. 2], Part H Section 7.2.2 */ + BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE = 0x10, /**< TK Value: Value as used in pairing over LE Physical channel. Format defined in [Vol. 3], Part H Section 2.3*/ + BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS = 0x11, /**< Flags (1 octet):\n b0: OOB Flags Field (0 = OOB data not present, 1 = OOB data present),\n b1: LE supported (Host) (i.e. bit 65 of LMP Extended Feature bits Page 1),\n b2: Simultaneous LE and BR/EDR to Same Device Capable (Host) (i.e. bit 66 of LMP Extended Feature bits Page 1)\n b3: Address type (0 = Public Address, 1 = Random Address) */ - BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE = 0x12, /**< Slave Connection Interval Range: The first 2 octets defines the minimum value for the connection interval, The second 2 octets defines the maximum value for the connection interval */ - BLUETOOTH_EIR_SERVICE_SOLICITATION_16 = 0x14, /**< Service UUIDs: List of 16 bit Service UUIDs*/ - BLUETOOTH_EIR_SERVICE_SOLICITATION_128 = 0x15, /**< Service UUIDs: List of 128 bit Service UUID*/ - BLUETOOTH_EIR_SERVICE_DATA = 0x16, /**< Service Data (2 or more octets): The first 2 octets contain the 16 bit Service UUID followed by additional service data */ - BLUETOOTH_EIR_APPEARANCE = 0x19, /**< UUID for `Appearance`: The Appearance characteristic value shall be the enumerated value as defined by Bluetooth Assigned Numbers document. */ - BLUETOOTH_EIR_BLE_DEVICE_ADDRESS = 0x1B, /**< 6 LSB bytes: Device address, 7th byte: Address type (Public/Random) */ - BLUETOOTH_EIR_BLE_ROLE = 0x1C, /**< Device Role: Periph only, Central only, Periph preferred, Central preferred */ - BLUETOOTH_EIR_MANUFACTURER_DATA = 0xFF /**< Manufacturer Specific Data (2 or more octets): The first 2 octets contain the Company Identifier Code followed by additional manufacturer specific data */ + BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE = 0x12, /**< Slave Connection Interval Range: The first 2 octets defines the minimum value for the connection interval, The second 2 octets defines the maximum value for the connection interval */ + BLUETOOTH_EIR_SERVICE_SOLICITATION_16 = 0x14, /**< Service UUIDs: List of 16 bit Service UUIDs*/ + BLUETOOTH_EIR_SERVICE_SOLICITATION_128 = 0x15, /**< Service UUIDs: List of 128 bit Service UUID*/ + BLUETOOTH_EIR_SERVICE_DATA = 0x16, /**< Service Data (2 or more octets): The first 2 octets contain the 16 bit Service UUID followed by additional service data */ + BLUETOOTH_EIR_APPEARANCE = 0x19, /**< UUID for `Appearance`: The Appearance characteristic value shall be the enumerated value as defined by Bluetooth Assigned Numbers document. */ + BLUETOOTH_EIR_BLE_DEVICE_ADDRESS = 0x1B, /**< 6 LSB bytes: Device address, 7th byte: Address type (Public/Random) */ + BLUETOOTH_EIR_BLE_ROLE = 0x1C, /**< Device Role: Periph only, Central only, Periph preferred, Central preferred */ + BLUETOOTH_EIR_MANUFACTURER_DATA = 0xFF /**< Manufacturer Specific Data (2 or more octets): The first 2 octets contain the Company Identifier Code followed by additional manufacturer specific data */ } Ndef_Bluetooth_Eir_Types_t; @@ -94,24 +94,24 @@ typedef enum { /** @brief Enumerates the Bluetooth LE address types. */ typedef enum { - NDEF_BLE_PUBLIC_ADDRESS_TYPE = 0x0, /**< Public Device Address. */ - NDEF_BLE_RANDOM_ADDRESS_TYPE = 0x1, /**< Random Device Address. */ - NDEF_BLE_UNDEF_ADDRESS_TYPE = 0xff /**< Device Address is undefined. */ + NDEF_BLE_PUBLIC_ADDRESS_TYPE = 0x0, /**< Public Device Address. */ + NDEF_BLE_RANDOM_ADDRESS_TYPE = 0x1, /**< Random Device Address. */ + NDEF_BLE_UNDEF_ADDRESS_TYPE = 0xff /**< Device Address is undefined. */ } Ndef_BLE_Address_Type_t; /** @brief Enumerates Bluetooth LE Roles */ typedef enum { - NDEF_BLE_ROLE_PERIPH_ONLY = 0x0, /**< Only Peripheral Role supported. */ - NDEF_BLE_ROLE_CENTRAL_ONLY = 0x1, /**< Only Central Role supported. */ - NDEF_BLE_ROLE_PERIPH_PREFERRED = 0x2, /**< Peripheral and Central Role supported, Peripheral Role preferred for connection establishment. */ - NDEF_BLE_ROLE_CENTRAL_PREFERRED = 0x3, /**< Peripheral and Central Role supported, Central Role preferred for connection establishment. */ - NDEF_BLE_ROLE_UNDEF = 0xff /**< LE Role is undefined. */ + NDEF_BLE_ROLE_PERIPH_ONLY = 0x0, /**< Only Peripheral Role supported. */ + NDEF_BLE_ROLE_CENTRAL_ONLY = 0x1, /**< Only Central Role supported. */ + NDEF_BLE_ROLE_PERIPH_PREFERRED = 0x2, /**< Peripheral and Central Role supported, Peripheral Role preferred for connection establishment. */ + NDEF_BLE_ROLE_CENTRAL_PREFERRED = 0x3, /**< Peripheral and Central Role supported, Central Role preferred for connection establishment. */ + NDEF_BLE_ROLE_UNDEF = 0xff /**< LE Role is undefined. */ } Ndef_BLE_Role_t; /** @brief Enumerates Bluetooth protocols */ typedef enum { - NDEF_BLUETOOTH_BREDR, /**< Standard bluetooth */ - NDEF_BLUETOOTH_BLE /**< Bluetooth Low Energy */ + NDEF_BLUETOOTH_BREDR, /**< Standard bluetooth */ + NDEF_BLUETOOTH_BLE /**< Bluetooth Low Energy */ } Ndef_Bluetooth_type_t; /** @brief Helper macro to set a particular EIR in the EIR mask of a `Ndef_Bluetooth_OOB_t` instance. @@ -138,53 +138,53 @@ typedef enum { * No union used here to comply with the Cube coding guidelines, despite the fact that it could have save memory space. */ typedef struct { - /* Mandatory fields */ - Ndef_Bluetooth_type_t Type; /**< *Mandatory*: Bluetooth type (Br/Edr or LE). */ - char DeviceAddress[6]; /**< *Mandatory*: Device address. For LE: 6 LSB of Device Address EIR. */ - /* Optional common fields */ - uint32_t OptionalMask; /**< This Mask is used to keep track of EIRs present in the OOB: each bit index corresponds to a `Ndef_Bluetooth_Eir_Types_t` value. */ - uint8_t Flags; /**< Flags from BLUETOOTH_EIR_FLAGS. */ - - uint16_t ClassUUID16[0xff / 2]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16. */ - uint32_t ClassUUID32[0xff / 4]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32. */ - uint32_t ClassUUID128[0xff / 16][4]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128. */ - uint8_t nbUUID16; /**< Number of UUIDs specified in ClassUUID16. */ - uint8_t nbUUID32; /**< Number of UUIDs specified in ClassUUID32. */ - uint8_t nbUUID128; /**< Number of UUIDs specified in ClassUUID128. */ - - char LocalName[0xff]; /**< Device local name from BLUETOOTH_EIR_SHORT_LOCAL_NAME or BLUETOOTH_EIR_COMPLETE_LOCAL_NAME. */ - uint8_t DeviceClass[3]; /**< Class of device from BLUETOOTH_EIR_DEVICE_CLASS. */ - // if no TPL, TPL is unknown - uint8_t TxPowerLevel; /**< TX power Level from BLUETOOTH_EIR_TX_POWER_LEVEL. */ - - uint8_t SMFlags; /**< Security Manager Flags from BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS. */ - uint16_t SlaveConnIntervalRange[2]; /**< Slave Connection Interval Range from BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE. */ - uint16_t ServiceSolicitation16[0xff / 2]; /**< Service Solicitation from BLUETOOTH_EIR_SERVICE_SOLICITATION_16. */ - uint32_t ServiceSolicitation128[0xff / 16][4]; /**< Service Solicitation from BLUETOOTH_EIR_SERVICE_SOLICITATION_128. */ - uint8_t nbServiceSolicitation16; /**< Number of UUIDs in ServiceSolicitation16. */ - uint8_t nbServiceSolicitation128; /**< Number of UUIDs in ServiceSolicitation128. */ - /* for br/edr only */ - uint8_t SimplePairingHash[16]; /**< *For Br/Edr only*: Simple Pairing Hash from BLUETOOTH_EIR_SIMPLE_PAIRING_HASH. */ - uint8_t SimplePairingRandomizer[16]; /**< *For Br/Edr only*: Simple Pairing Randomizer from BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER. */ - /* BLE mandatory fields */ - Ndef_BLE_Address_Type_t DeviceAddressType; /**< *For LE only*, *Mandatory*: Address Type, MSB of the Device Address EIR (Public or Random) */ - Ndef_BLE_Role_t Role; /**< *For LE only*, *Mandatory*: LE Role from BLUETOOTH_EIR_BLE_ROLE and defined in `Ndef_BLE_Role_t`. */ - /* BLE optional fields */ - uint8_t SecureManagerTK[16]; /**< *For LE only*: Security Manager TK from BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE. */ - uint16_t Appearance; /**< *For LE only*: Appearance from BLUETOOTH_EIR_APPEARANCE. */ - /* track number of unparsed EIR */ - uint8_t nbUnknown; /**< Number of EIRs not parsed because of an unknown EIR type. */ - uint8_t nbServiceData; /**< Number of EIRs not parsed because being of type BLUETOOTH_EIR_SERVICE_DATA. */ - uint8_t nbManufacturerData; /**< Number of EIRs not parsed because being of type BLUETOOTH_EIR_MANUFACTURER_DATA. */ + /* Mandatory fields */ + Ndef_Bluetooth_type_t Type; /**< *Mandatory*: Bluetooth type (Br/Edr or LE). */ + char DeviceAddress[6]; /**< *Mandatory*: Device address. For LE: 6 LSB of Device Address EIR. */ + /* Optional common fields */ + uint32_t OptionalMask; /**< This Mask is used to keep track of EIRs present in the OOB: each bit index corresponds to a `Ndef_Bluetooth_Eir_Types_t` value. */ + uint8_t Flags; /**< Flags from BLUETOOTH_EIR_FLAGS. */ + + uint16_t ClassUUID16[0xff / 2]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_16 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_16. */ + uint32_t ClassUUID32[0xff / 4]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_32 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_32. */ + uint32_t ClassUUID128[0xff / 16][4]; /**< UUIDs from BLUETOOTH_EIR_SERVICE_CLASS_UUID_PARTIAL_128 or BLUETOOTH_EIR_SERVICE_CLASS_UUID_COMPLETE_128. */ + uint8_t nbUUID16; /**< Number of UUIDs specified in ClassUUID16. */ + uint8_t nbUUID32; /**< Number of UUIDs specified in ClassUUID32. */ + uint8_t nbUUID128; /**< Number of UUIDs specified in ClassUUID128. */ + + char LocalName[0xff]; /**< Device local name from BLUETOOTH_EIR_SHORT_LOCAL_NAME or BLUETOOTH_EIR_COMPLETE_LOCAL_NAME. */ + uint8_t DeviceClass[3]; /**< Class of device from BLUETOOTH_EIR_DEVICE_CLASS. */ + // if no TPL, TPL is unknown + uint8_t TxPowerLevel; /**< TX power Level from BLUETOOTH_EIR_TX_POWER_LEVEL. */ + + uint8_t SMFlags; /**< Security Manager Flags from BLUETOOTH_EIR_SECURITY_MANAGER_FLAGS. */ + uint16_t SlaveConnIntervalRange[2]; /**< Slave Connection Interval Range from BLUETOOTH_EIR_SLAVE_CONNECTION_INTERVAL_RANGE. */ + uint16_t ServiceSolicitation16[0xff / 2]; /**< Service Solicitation from BLUETOOTH_EIR_SERVICE_SOLICITATION_16. */ + uint32_t ServiceSolicitation128[0xff / 16][4]; /**< Service Solicitation from BLUETOOTH_EIR_SERVICE_SOLICITATION_128. */ + uint8_t nbServiceSolicitation16; /**< Number of UUIDs in ServiceSolicitation16. */ + uint8_t nbServiceSolicitation128; /**< Number of UUIDs in ServiceSolicitation128. */ + /* for br/edr only */ + uint8_t SimplePairingHash[16]; /**< *For Br/Edr only*: Simple Pairing Hash from BLUETOOTH_EIR_SIMPLE_PAIRING_HASH. */ + uint8_t SimplePairingRandomizer[16]; /**< *For Br/Edr only*: Simple Pairing Randomizer from BLUETOOTH_EIR_SIMPLE_PAIRING_RANDOMIZER. */ + /* BLE mandatory fields */ + Ndef_BLE_Address_Type_t DeviceAddressType; /**< *For LE only*, *Mandatory*: Address Type, MSB of the Device Address EIR (Public or Random) */ + Ndef_BLE_Role_t Role; /**< *For LE only*, *Mandatory*: LE Role from BLUETOOTH_EIR_BLE_ROLE and defined in `Ndef_BLE_Role_t`. */ + /* BLE optional fields */ + uint8_t SecureManagerTK[16]; /**< *For LE only*: Security Manager TK from BLUETOOTH_EIR_SECURITY_MANAGER_TK_VALUE. */ + uint16_t Appearance; /**< *For LE only*: Appearance from BLUETOOTH_EIR_APPEARANCE. */ + /* track number of unparsed EIR */ + uint8_t nbUnknown; /**< Number of EIRs not parsed because of an unknown EIR type. */ + uint8_t nbServiceData; /**< Number of EIRs not parsed because being of type BLUETOOTH_EIR_SERVICE_DATA. */ + uint8_t nbManufacturerData; /**< Number of EIRs not parsed because being of type BLUETOOTH_EIR_MANUFACTURER_DATA. */ } Ndef_Bluetooth_OOB_t ; /** @brief Extended Inquiry Response format. * @details This structure is used to parse/build EIRs in the Bluetooth OOB. */ typedef struct { - uint8_t length; /**< Length of the EIRs, including the type field (1 byte). */ - uint8_t type; /**< EIR type as defined in `Ndef_Bluetooth_Eir_Types_t`. */ - uint8_t value[1]; /**< single-element array, to keep track of the address of the EIR data */ + uint8_t length; /**< Length of the EIRs, including the type field (1 byte). */ + uint8_t type; /**< EIR type as defined in `Ndef_Bluetooth_Eir_Types_t`. */ + uint8_t value[1]; /**< single-element array, to keep track of the address of the EIR data */ } NDEF_EIR_t ; /** @} diff --git a/src/libNDEF/lib_NDEF_Email.cpp b/src/libNDEF/lib_NDEF_Email.cpp index 1ced864..26080f2 100755 --- a/src/libNDEF/lib_NDEF_Email.cpp +++ b/src/libNDEF/lib_NDEF_Email.cpp @@ -66,94 +66,94 @@ */ void NDEF::NDEF_FillEmailStruct(uint8_t *pPayload, uint32_t PayloadSize, sEmailInfo *pEmailStruct) { - uint8_t *pLastByteAdd, *pLook4Word, *pEndString; - uint32_t SizeOfKeyWord = 0; + uint8_t *pLastByteAdd, *pLook4Word, *pEndString; + uint32_t SizeOfKeyWord = 0; - pEndString = 0; + pEndString = 0; - /* First character force to NULL in case not matching found */ + /* First character force to NULL in case not matching found */ #ifdef NDEF_DYN_ALLOC - pEmailStruct->EmailAdd = NULL; - pEmailStruct->Subject = NULL; - pEmailStruct->Message = NULL; - pEmailStruct->Information = NULL; + pEmailStruct->EmailAdd = NULL; + pEmailStruct->Subject = NULL; + pEmailStruct->Message = NULL; + pEmailStruct->Information = NULL; #else - *pEmailStruct->EmailAdd = 0; - *pEmailStruct->Subject = 0; - *pEmailStruct->Message = 0; + *pEmailStruct->EmailAdd = 0; + *pEmailStruct->Subject = 0; + *pEmailStruct->Message = 0; #endif - /* Interesting information are stored before picture if any */ - /* Moreover picture is not used in this demonstration SW */ - pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); + /* Interesting information are stored before picture if any */ + /* Moreover picture is not used in this demonstration SW */ + pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); - /* first byte should be the "mailto:" well know URI type, skip it */ - pLook4Word = ++pPayload; + /* first byte should be the "mailto:" well know URI type, skip it */ + pLook4Word = ++pPayload; - /* Retrieve email add */ - if (pLook4Word != pLastByteAdd) { - pEndString = pLook4Word; - while (memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { - pEndString++; - } - if ((!memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH)) || (pEndString == pLastByteAdd)) { + /* Retrieve email add */ + if (pLook4Word != pLastByteAdd) { + pEndString = pLook4Word; + while (memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { + pEndString++; + } + if ((!memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH)) || (pEndString == pLastByteAdd)) { #ifdef NDEF_DYN_ALLOC - pEmailStruct->EmailAdd = malloc(pEndString - pLook4Word + 1); - if (pEmailStruct->EmailAdd != NULL) + pEmailStruct->EmailAdd = malloc(pEndString - pLook4Word + 1); + if (pEmailStruct->EmailAdd != NULL) #endif - { - memcpy(pEmailStruct->EmailAdd, pLook4Word, pEndString - pLook4Word); - /* add end of string character */ - pEmailStruct->EmailAdd[pEndString - pLook4Word] = 0; - } - } + { + memcpy(pEmailStruct->EmailAdd, pLook4Word, pEndString - pLook4Word); + /* add end of string character */ + pEmailStruct->EmailAdd[pEndString - pLook4Word] = 0; + } } + } - pEndString += URI_FIRST_DATA_END_LENGTH; - pLook4Word = pEndString; - - /* check if e-mail subject is present */ - if (!memcmp(pLook4Word, SUBJECT_BEGIN_STRING, SUBJECT_BEGIN_STRING_LENGTH)) { - SizeOfKeyWord = SUBJECT_BEGIN_STRING_LENGTH; - - /* Retrieve subject */ - if (pLook4Word != pLastByteAdd) { - pLook4Word += SizeOfKeyWord; - pEndString = pLook4Word; - while (memcmp(pEndString, URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { - pEndString++; - } - if ((!memcmp(pEndString, URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH)) || (pEndString == pLastByteAdd)) { + pEndString += URI_FIRST_DATA_END_LENGTH; + pLook4Word = pEndString; + + /* check if e-mail subject is present */ + if (!memcmp(pLook4Word, SUBJECT_BEGIN_STRING, SUBJECT_BEGIN_STRING_LENGTH)) { + SizeOfKeyWord = SUBJECT_BEGIN_STRING_LENGTH; + + /* Retrieve subject */ + if (pLook4Word != pLastByteAdd) { + pLook4Word += SizeOfKeyWord; + pEndString = pLook4Word; + while (memcmp(pEndString, URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { + pEndString++; + } + if ((!memcmp(pEndString, URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH)) || (pEndString == pLastByteAdd)) { #ifdef NDEF_DYN_ALLOC - pEmailStruct->Subject = malloc(pEndString - pLook4Word + 1); - if (pEmailStruct->Subject != NULL) + pEmailStruct->Subject = malloc(pEndString - pLook4Word + 1); + if (pEmailStruct->Subject != NULL) #endif - { - memcpy(pEmailStruct->Subject, pLook4Word, pEndString - pLook4Word); - /* add end of string character */ - pEmailStruct->Subject[pEndString - pLook4Word] = 0; - } - } - pEndString += URI_SECOND_DATA_END_LENGTH; + { + memcpy(pEmailStruct->Subject, pLook4Word, pEndString - pLook4Word); + /* add end of string character */ + pEmailStruct->Subject[pEndString - pLook4Word] = 0; } + } + pEndString += URI_SECOND_DATA_END_LENGTH; } + } - pLook4Word = pEndString; + pLook4Word = pEndString; - /* check if e-mail message is present */ - if (!memcmp(pLook4Word, MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH)) { - pEndString += MESSAGE_BEGIN_STRING_LENGTH; - /* Retrieve message */ + /* check if e-mail message is present */ + if (!memcmp(pLook4Word, MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH)) { + pEndString += MESSAGE_BEGIN_STRING_LENGTH; + /* Retrieve message */ #ifdef NDEF_DYN_ALLOC - pEmailStruct->Message = malloc(PayloadSize - (pEndString - pPayload + 1) + 1); - if (pEmailStruct->Message != NULL) + pEmailStruct->Message = malloc(PayloadSize - (pEndString - pPayload + 1) + 1); + if (pEmailStruct->Message != NULL) #endif - { - memcpy(pEmailStruct->Message, pEndString, PayloadSize - (pEndString - pPayload + 1)); - /* add end of string character */ - pEmailStruct->Message[PayloadSize - (pEndString - pPayload + 1)] = 0; - } + { + memcpy(pEmailStruct->Message, pEndString, PayloadSize - (pEndString - pPayload + 1)); + /* add end of string character */ + pEmailStruct->Message[PayloadSize - (pEndString - pPayload + 1)] = 0; } + } } /** @@ -163,17 +163,17 @@ void NDEF::NDEF_FillEmailStruct(uint8_t *pPayload, uint32_t PayloadSize, sEmailI */ void NDEF::NDEF_ReadURI_Email(sRecordInfo_t *pRecordStruct, sEmailInfo *pEmailStruct) { - uint8_t *pPayload; - uint32_t PayloadSize; + uint8_t *pPayload; + uint32_t PayloadSize; - PayloadSize = pRecordStruct->PayloadLength; + PayloadSize = pRecordStruct->PayloadLength; - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - if (pRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { - NDEF_FillEmailStruct(pPayload, PayloadSize, pEmailStruct); - } + if (pRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { + NDEF_FillEmailStruct(pPayload, PayloadSize, pEmailStruct); + } } @@ -195,36 +195,36 @@ void NDEF::NDEF_ReadURI_Email(sRecordInfo_t *pRecordStruct, sEmailInfo *pEmailSt */ uint16_t NDEF::NDEF_ReadEmail(sRecordInfo_t *pRecordStruct, sEmailInfo *pEmailStruct) { - uint16_t status = NDEF_ERROR; - sRecordInfo_t *pSPRecordStruct; - uint32_t PayloadSize, RecordPosition; - uint8_t *pData; + uint16_t status = NDEF_ERROR; + sRecordInfo_t *pSPRecordStruct; + uint32_t PayloadSize, RecordPosition; + uint8_t *pData; + + + if (pRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { + NDEF_ReadURI_Email(pRecordStruct, pEmailStruct); + status = NDEF_OK; + } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { + for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { + pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; + if (pSPRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { + NDEF_ReadURI_Email(pSPRecordStruct, pEmailStruct); + status = NDEF_OK; + } + if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { + PayloadSize = pSPRecordStruct->PayloadLength; + /* The instruction content the UTF-8 language code that is not used here */ + pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; + PayloadSize -= *pData + 1; /* remove not useful data */ + pData += *pData + 1; - if (pRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { - NDEF_ReadURI_Email(pRecordStruct, pEmailStruct); - status = NDEF_OK; - } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { - for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { - pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; - if (pSPRecordStruct->NDEF_Type == URI_EMAIL_TYPE) { - NDEF_ReadURI_Email(pSPRecordStruct, pEmailStruct); - status = NDEF_OK; - } - if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { - PayloadSize = pSPRecordStruct->PayloadLength; - - /* The instruction content the UTF-8 language code that is not used here */ - pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; - PayloadSize -= *pData + 1; /* remove not useful data */ - pData += *pData + 1; - - memcpy(pEmailStruct->Information, pData, PayloadSize); - } - } + memcpy(pEmailStruct->Information, pData, PayloadSize); + } } + } - return status; + return status; } /** @@ -239,13 +239,13 @@ uint16_t NDEF::NDEF_ReadEmail(sRecordInfo_t *pRecordStruct, sEmailInfo *pEmailSt */ uint16_t NDEF::NDEF_WriteEmail(sEmailInfo *pEmailStruct) { - uint16_t status = NDEF_ERROR, Offset = 0; + uint16_t status = NDEF_ERROR, Offset = 0; - NDEF_PrepareEmailMessage(pEmailStruct, NDEF_Buffer, &Offset); + NDEF_PrepareEmailMessage(pEmailStruct, NDEF_Buffer, &Offset); - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); - return status; + return status; } /** @@ -256,139 +256,139 @@ uint16_t NDEF::NDEF_WriteEmail(sEmailInfo *pEmailStruct) */ void NDEF::NDEF_PrepareEmailMessage(sEmailInfo *pEmailStruct, uint8_t *pNDEFMessage, uint16_t *size) { - uint16_t Offset = 0; - uint32_t emailSize = 0; - uint32_t infoSize = 0; - uint32_t totalSize = 0; - - /* Email is an URI but can be included in a smart poster to add text to give instruction to user for instance */ - - /* Email (smart poster) Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* Email : 1+@+1+subject+1+message */ - emailSize = 1 + strlen(pEmailStruct->EmailAdd) + URI_FIRST_DATA_END_LENGTH + SUBJECT_BEGIN_STRING_LENGTH + - strlen(pEmailStruct->Subject) + URI_SECOND_DATA_END_LENGTH + MESSAGE_BEGIN_STRING_LENGTH + strlen(pEmailStruct->Message); - - /* Check if a Smart poster is needed */ - if (pEmailStruct->Information[0] != '\0') { - /* Info : 1+2+info */ - infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pEmailStruct->Information); - /* Total */ - totalSize = 4 + emailSize + 4 + infoSize; - if (emailSize > 255) { - totalSize += 3; /* Normal Email size */ - } - if (infoSize > 255) { - totalSize += 3; /* Normal Info size */ - } - - /* SmartPoster header */ - if (totalSize > 255) { - pNDEFMessage[Offset++] = 0xC1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = totalSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0xD1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)totalSize; - } - memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); - Offset += SMART_POSTER_TYPE_STRING_LENGTH; - } - - /* Email header */ - pNDEFMessage[Offset] = 0x81; - if (emailSize < 256) { - pNDEFMessage[Offset] |= 0x10; // Set the SR bit + uint16_t Offset = 0; + uint32_t emailSize = 0; + uint32_t infoSize = 0; + uint32_t totalSize = 0; + + /* Email is an URI but can be included in a smart poster to add text to give instruction to user for instance */ + + /* Email (smart poster) Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* Email : 1+@+1+subject+1+message */ + emailSize = 1 + strlen(pEmailStruct->EmailAdd) + URI_FIRST_DATA_END_LENGTH + SUBJECT_BEGIN_STRING_LENGTH + + strlen(pEmailStruct->Subject) + URI_SECOND_DATA_END_LENGTH + MESSAGE_BEGIN_STRING_LENGTH + strlen(pEmailStruct->Message); + + /* Check if a Smart poster is needed */ + if (pEmailStruct->Information[0] != '\0') { + /* Info : 1+2+info */ + infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pEmailStruct->Information); + /* Total */ + totalSize = 4 + emailSize + 4 + infoSize; + if (emailSize > 255) { + totalSize += 3; /* Normal Email size */ } - if (pEmailStruct->Information[0] == '\0') { - pNDEFMessage[Offset] |= 0x40; // Set the ME bit + if (infoSize > 255) { + totalSize += 3; /* Normal Info size */ } - Offset++; - pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; - if (emailSize > 255) { - pNDEFMessage[Offset++] = (emailSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (emailSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (emailSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = emailSize & 0x000000FF; + /* SmartPoster header */ + if (totalSize > 255) { + pNDEFMessage[Offset++] = 0xC1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = totalSize & 0x000000FF; } else { - pNDEFMessage[Offset++] = (uint8_t)emailSize; + pNDEFMessage[Offset++] = 0xD1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)totalSize; + } + memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); + Offset += SMART_POSTER_TYPE_STRING_LENGTH; + } + + /* Email header */ + pNDEFMessage[Offset] = 0x81; + if (emailSize < 256) { + pNDEFMessage[Offset] |= 0x10; // Set the SR bit + } + if (pEmailStruct->Information[0] == '\0') { + pNDEFMessage[Offset] |= 0x40; // Set the ME bit + } + Offset++; + + pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; + if (emailSize > 255) { + pNDEFMessage[Offset++] = (emailSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (emailSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (emailSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = emailSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = (uint8_t)emailSize; + } + memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); + Offset += URI_TYPE_STRING_LENGTH; + + /* Email pay load */ + pNDEFMessage[Offset++] = URI_ID_0x06; + memcpy(&pNDEFMessage[Offset], pEmailStruct->EmailAdd, strlen(pEmailStruct->EmailAdd)); + Offset += strlen(pEmailStruct->EmailAdd); + memcpy(&pNDEFMessage[Offset], URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH); + Offset += URI_FIRST_DATA_END_LENGTH; + + memcpy(&pNDEFMessage[Offset], SUBJECT_BEGIN_STRING, SUBJECT_BEGIN_STRING_LENGTH); + Offset += SUBJECT_BEGIN_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], pEmailStruct->Subject, strlen(pEmailStruct->Subject)); + Offset += strlen(pEmailStruct->Subject); + memcpy(&pNDEFMessage[Offset], URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH); + Offset += URI_SECOND_DATA_END_LENGTH; + + memcpy(&pNDEFMessage[Offset], MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH); + Offset += MESSAGE_BEGIN_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], pEmailStruct->Message, strlen(pEmailStruct->Message)); + Offset += strlen(pEmailStruct->Message); + + /* Information header */ + if (pEmailStruct->Information[0] != '\0') { + if (infoSize > 255) { + pNDEFMessage[Offset++] = 0x41; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = infoSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = 0x51; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)infoSize; } - memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); - Offset += URI_TYPE_STRING_LENGTH; - - /* Email pay load */ - pNDEFMessage[Offset++] = URI_ID_0x06; - memcpy(&pNDEFMessage[Offset], pEmailStruct->EmailAdd, strlen(pEmailStruct->EmailAdd)); - Offset += strlen(pEmailStruct->EmailAdd); - memcpy(&pNDEFMessage[Offset], URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH); - Offset += URI_FIRST_DATA_END_LENGTH; - - memcpy(&pNDEFMessage[Offset], SUBJECT_BEGIN_STRING, SUBJECT_BEGIN_STRING_LENGTH); - Offset += SUBJECT_BEGIN_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], pEmailStruct->Subject, strlen(pEmailStruct->Subject)); - Offset += strlen(pEmailStruct->Subject); - memcpy(&pNDEFMessage[Offset], URI_SECOND_DATA_END, URI_SECOND_DATA_END_LENGTH); - Offset += URI_SECOND_DATA_END_LENGTH; - - memcpy(&pNDEFMessage[Offset], MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH); - Offset += MESSAGE_BEGIN_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], pEmailStruct->Message, strlen(pEmailStruct->Message)); - Offset += strlen(pEmailStruct->Message); - - /* Information header */ - if (pEmailStruct->Information[0] != '\0') { - if (infoSize > 255) { - pNDEFMessage[Offset++] = 0x41; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = infoSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0x51; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)infoSize; - } - memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); - Offset += TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ - memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); - Offset += ISO_ENGLISH_CODE_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); + Offset += TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ + memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); + Offset += ISO_ENGLISH_CODE_STRING_LENGTH; - /* Information payload */ - memcpy(&pNDEFMessage[Offset], pEmailStruct->Information, strlen(pEmailStruct->Information)); - Offset += strlen(pEmailStruct->Information); + /* Information payload */ + memcpy(&pNDEFMessage[Offset], pEmailStruct->Information, strlen(pEmailStruct->Information)); + Offset += strlen(pEmailStruct->Information); - } + } - *size = (uint16_t)(Offset); + *size = (uint16_t)(Offset); } @@ -399,21 +399,21 @@ void NDEF::NDEF_PrepareEmailMessage(sEmailInfo *pEmailStruct, uint8_t *pNDEFMess void NDEF::NDEF_closeEmail(sEmailInfo *pEmailStruct) { #ifdef NDEF_DYN_ALLOC - if (pEmailStruct->EmailAdd != NULL) { - free(pEmailStruct->EmailAdd); - } - if (pEmailStruct->Information != NULL) { - free(pEmailStruct->Information); - } - if (pEmailStruct->Message != NULL) { - free(pEmailStruct->Message); - } - if (pEmailStruct->Subject != NULL) { - free(pEmailStruct->Subject); - } + if (pEmailStruct->EmailAdd != NULL) { + free(pEmailStruct->EmailAdd); + } + if (pEmailStruct->Information != NULL) { + free(pEmailStruct->Information); + } + if (pEmailStruct->Message != NULL) { + free(pEmailStruct->Message); + } + if (pEmailStruct->Subject != NULL) { + free(pEmailStruct->Subject); + } #else - // Unused parameter - (void)(pEmailStruct); + // Unused parameter + (void)(pEmailStruct); #endif } diff --git a/src/libNDEF/lib_NDEF_Email.h b/src/libNDEF/lib_NDEF_Email.h index 8da5561..5b4df66 100755 --- a/src/libNDEF/lib_NDEF_Email.h +++ b/src/libNDEF/lib_NDEF_Email.h @@ -38,17 +38,17 @@ #ifdef NDEF_DYN_ALLOC typedef struct { - char *EmailAdd; - char *Subject; - char *Message; - char *Information; + char *EmailAdd; + char *Subject; + char *Message; + char *Information; } sEmailInfo; #else typedef struct { - char EmailAdd[64]; - char Subject[100]; - char Message[2000]; - char Information[400]; + char EmailAdd[64]; + char Subject[100]; + char Message[2000]; + char Information[400]; } sEmailInfo; #endif diff --git a/src/libNDEF/lib_NDEF_Geo.cpp b/src/libNDEF/lib_NDEF_Geo.cpp index dbadc0b..022784f 100755 --- a/src/libNDEF/lib_NDEF_Geo.cpp +++ b/src/libNDEF/lib_NDEF_Geo.cpp @@ -61,43 +61,43 @@ */ void NDEF::NDEF_FillGeoStruct(uint8_t *pPayload, uint32_t PayloadSize, sGeoInfo *pGeoStruct) { - uint8_t *pLastByteAdd, *pLook4Word, *pEndString; - const char *pKeyWord = GEO_TYPE_STRING; - uint32_t SizeOfKeyWord = GEO_TYPE_STRING_LENGTH; - pEndString = 0; - - /* First character force to NULL in case not matching found */ - *pGeoStruct->Latitude = 0; - *pGeoStruct->Longitude = 0; - - /* Interesting information are stored before picture if any */ - /* Moreover picture is not used in this demonstration SW */ - pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); - - pLook4Word = pPayload; - while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { - pLook4Word++; + uint8_t *pLastByteAdd, *pLook4Word, *pEndString; + const char *pKeyWord = GEO_TYPE_STRING; + uint32_t SizeOfKeyWord = GEO_TYPE_STRING_LENGTH; + pEndString = 0; + + /* First character force to NULL in case not matching found */ + *pGeoStruct->Latitude = 0; + *pGeoStruct->Longitude = 0; + + /* Interesting information are stored before picture if any */ + /* Moreover picture is not used in this demonstration SW */ + pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); + + pLook4Word = pPayload; + while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { + pLook4Word++; + } + + /* Retrieve phone number */ + if (pLook4Word != pLastByteAdd) { + pLook4Word += SizeOfKeyWord; + pEndString = pLook4Word; + while (memcmp(pEndString, URI_LATITUDE_END, URI_LATITUDE_END_LENGTH) && (pEndString < pLastByteAdd)) { + pEndString++; } - - /* Retrieve phone number */ - if (pLook4Word != pLastByteAdd) { - pLook4Word += SizeOfKeyWord; - pEndString = pLook4Word; - while (memcmp(pEndString, URI_LATITUDE_END, URI_LATITUDE_END_LENGTH) && (pEndString < pLastByteAdd)) { - pEndString++; - } - if (pEndString != pLastByteAdd) { - memcpy(pGeoStruct->Latitude, pLook4Word, pEndString - pLook4Word); - /* add end of string character */ - pGeoStruct->Latitude[pEndString - pLook4Word] = 0; - } + if (pEndString != pLastByteAdd) { + memcpy(pGeoStruct->Latitude, pLook4Word, pEndString - pLook4Word); + /* add end of string character */ + pGeoStruct->Latitude[pEndString - pLook4Word] = 0; } - pEndString += URI_LATITUDE_END_LENGTH; - pLook4Word = pEndString; + } + pEndString += URI_LATITUDE_END_LENGTH; + pLook4Word = pEndString; - memcpy(pGeoStruct->Longitude, pEndString, PayloadSize - (pEndString - pPayload)); - /* add end of string character */ - pGeoStruct->Longitude[PayloadSize - (pEndString - pPayload)] = 0; + memcpy(pGeoStruct->Longitude, pEndString, PayloadSize - (pEndString - pPayload)); + /* add end of string character */ + pGeoStruct->Longitude[PayloadSize - (pEndString - pPayload)] = 0; } @@ -108,17 +108,17 @@ void NDEF::NDEF_FillGeoStruct(uint8_t *pPayload, uint32_t PayloadSize, sGeoInfo */ void NDEF::NDEF_ReadURI_Geo(sRecordInfo_t *pRecordStruct, sGeoInfo *pGeoStruct) { - uint8_t *pPayload; - uint32_t PayloadSize; + uint8_t *pPayload; + uint32_t PayloadSize; - PayloadSize = pRecordStruct->PayloadLength; + PayloadSize = pRecordStruct->PayloadLength; - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - if (pRecordStruct->NDEF_Type == URI_GEO_TYPE) { - NDEF_FillGeoStruct(pPayload, PayloadSize, pGeoStruct); - } + if (pRecordStruct->NDEF_Type == URI_GEO_TYPE) { + NDEF_FillGeoStruct(pPayload, PayloadSize, pGeoStruct); + } } @@ -140,37 +140,37 @@ void NDEF::NDEF_ReadURI_Geo(sRecordInfo_t *pRecordStruct, sGeoInfo *pGeoStruct) */ uint16_t NDEF::NDEF_ReadGeo(sRecordInfo_t *pRecordStruct, sGeoInfo *pGeoStruct) { - uint16_t status = NDEF_ERROR; - sRecordInfo_t *pSPRecordStruct; - uint32_t PayloadSize, RecordPosition; - uint8_t *pData; - - if (pRecordStruct->NDEF_Type == URI_GEO_TYPE) { - NDEF_ReadURI_Geo(pRecordStruct, pGeoStruct); + uint16_t status = NDEF_ERROR; + sRecordInfo_t *pSPRecordStruct; + uint32_t PayloadSize, RecordPosition; + uint8_t *pData; + + if (pRecordStruct->NDEF_Type == URI_GEO_TYPE) { + NDEF_ReadURI_Geo(pRecordStruct, pGeoStruct); + status = NDEF_OK; + } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { + for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { + pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; + if (pSPRecordStruct->NDEF_Type == URI_GEO_TYPE) { + NDEF_ReadURI_Geo(pSPRecordStruct, pGeoStruct); status = NDEF_OK; - } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { - for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { - pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; - if (pSPRecordStruct->NDEF_Type == URI_GEO_TYPE) { - NDEF_ReadURI_Geo(pSPRecordStruct, pGeoStruct); - status = NDEF_OK; - } - if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { - PayloadSize = pSPRecordStruct->PayloadLength; - - /* The instruction content the UTF-8 language code that is not used here */ - pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; - PayloadSize -= *pData + 1; /* remove not useful data */ - pData += *pData + 1; /* set pointer on useful data */ - - memcpy(pGeoStruct->Information, pData, PayloadSize); - /* add end of string character */ - pGeoStruct->Information[PayloadSize] = 0; - } - } + } + if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { + PayloadSize = pSPRecordStruct->PayloadLength; + + /* The instruction content the UTF-8 language code that is not used here */ + pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; + PayloadSize -= *pData + 1; /* remove not useful data */ + pData += *pData + 1; /* set pointer on useful data */ + + memcpy(pGeoStruct->Information, pData, PayloadSize); + /* add end of string character */ + pGeoStruct->Information[PayloadSize] = 0; + } } + } - return status; + return status; } /** @@ -184,13 +184,13 @@ uint16_t NDEF::NDEF_ReadGeo(sRecordInfo_t *pRecordStruct, sGeoInfo *pGeoStruct) */ uint16_t NDEF::NDEF_WriteGeo(sGeoInfo *pGeoStruct) { - uint16_t status = NDEF_ERROR, Offset = 0; + uint16_t status = NDEF_ERROR, Offset = 0; - NDEF_PrepareGeoMessage(pGeoStruct, NDEF_Buffer, &Offset); + NDEF_PrepareGeoMessage(pGeoStruct, NDEF_Buffer, &Offset); - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); - return status; + return status; } /** @@ -201,129 +201,129 @@ uint16_t NDEF::NDEF_WriteGeo(sGeoInfo *pGeoStruct) */ void NDEF::NDEF_PrepareGeoMessage(sGeoInfo *pGeoStruct, uint8_t *pNDEFMessage, uint16_t *size) { - uint16_t Offset = 0; - uint32_t geoSize = 0; - uint32_t infoSize = 0; - uint32_t totalSize = 0; - - /* GEO is an URI but can be included in a smart poster to add text to give instruction to user for instance */ - - /* GEO (smart poster) Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* GEO : 1+geo:+latitude+1+longitude */ - geoSize = 1 + GEO_TYPE_STRING_LENGTH + strlen(pGeoStruct->Latitude) + URI_LATITUDE_END_LENGTH + strlen(pGeoStruct->Longitude); - - /* Check if a Smart poster is needed */ - if (pGeoStruct->Information[0] != '\0') { - /* Info : 1+2+info */ - infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pGeoStruct->Information); - /* Total */ - totalSize = 4 + geoSize + 4 + infoSize; - if (geoSize > 255) { - totalSize += 3; /* Normal Geo size */ - } - if (infoSize > 255) { - totalSize += 3; /* Normal Info size */ - } - - /* SmartPoster header */ - if (totalSize > 255) { - pNDEFMessage[Offset++] = 0xC1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = totalSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0xD1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)totalSize; - } - memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); - Offset += SMART_POSTER_TYPE_STRING_LENGTH; - } - - /* GEO header */ - pNDEFMessage[Offset] = 0x81; - if (geoSize < 256) { - pNDEFMessage[Offset] |= 0x10; // Set the SR bit + uint16_t Offset = 0; + uint32_t geoSize = 0; + uint32_t infoSize = 0; + uint32_t totalSize = 0; + + /* GEO is an URI but can be included in a smart poster to add text to give instruction to user for instance */ + + /* GEO (smart poster) Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* GEO : 1+geo:+latitude+1+longitude */ + geoSize = 1 + GEO_TYPE_STRING_LENGTH + strlen(pGeoStruct->Latitude) + URI_LATITUDE_END_LENGTH + strlen(pGeoStruct->Longitude); + + /* Check if a Smart poster is needed */ + if (pGeoStruct->Information[0] != '\0') { + /* Info : 1+2+info */ + infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pGeoStruct->Information); + /* Total */ + totalSize = 4 + geoSize + 4 + infoSize; + if (geoSize > 255) { + totalSize += 3; /* Normal Geo size */ } - if (pGeoStruct->Information[0] == '\0') { - pNDEFMessage[Offset] |= 0x40; // Set the ME bit + if (infoSize > 255) { + totalSize += 3; /* Normal Info size */ } - Offset++; - pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; - if (geoSize > 255) { - pNDEFMessage[Offset++] = (geoSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (geoSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (geoSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = geoSize & 0x000000FF; + /* SmartPoster header */ + if (totalSize > 255) { + pNDEFMessage[Offset++] = 0xC1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = totalSize & 0x000000FF; } else { - pNDEFMessage[Offset++] = (uint8_t)geoSize; + pNDEFMessage[Offset++] = 0xD1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)totalSize; } - memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); - Offset += URI_TYPE_STRING_LENGTH; - - /* GEO payload */ - pNDEFMessage[Offset++] = URI_ID_0x00; /* URI identifier no abbreviation */ - memcpy(&pNDEFMessage[Offset], GEO_TYPE_STRING, GEO_TYPE_STRING_LENGTH); - Offset += GEO_TYPE_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], pGeoStruct->Latitude, strlen(pGeoStruct->Latitude)); - Offset += strlen(pGeoStruct->Latitude); - memcpy(&pNDEFMessage[Offset], URI_LATITUDE_END, URI_LATITUDE_END_LENGTH); - Offset += URI_LATITUDE_END_LENGTH; - memcpy(&pNDEFMessage[Offset], pGeoStruct->Longitude, strlen(pGeoStruct->Longitude)); - Offset += strlen(pGeoStruct->Longitude); - - /* Information header */ - if (pGeoStruct->Information[0] != '\0') { - if (infoSize > 255) { - pNDEFMessage[Offset++] = 0x41; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = infoSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0x51; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)infoSize; - } - - memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); - Offset += TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ - memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); - Offset += ISO_ENGLISH_CODE_STRING_LENGTH; - - /* Information payload */ - memcpy(&pNDEFMessage[Offset], pGeoStruct->Information, strlen(pGeoStruct->Information)); - Offset += strlen(pGeoStruct->Information); + memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); + Offset += SMART_POSTER_TYPE_STRING_LENGTH; + } + + /* GEO header */ + pNDEFMessage[Offset] = 0x81; + if (geoSize < 256) { + pNDEFMessage[Offset] |= 0x10; // Set the SR bit + } + if (pGeoStruct->Information[0] == '\0') { + pNDEFMessage[Offset] |= 0x40; // Set the ME bit + } + Offset++; + + pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; + if (geoSize > 255) { + pNDEFMessage[Offset++] = (geoSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (geoSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (geoSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = geoSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = (uint8_t)geoSize; + } + memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); + Offset += URI_TYPE_STRING_LENGTH; + + /* GEO payload */ + pNDEFMessage[Offset++] = URI_ID_0x00; /* URI identifier no abbreviation */ + memcpy(&pNDEFMessage[Offset], GEO_TYPE_STRING, GEO_TYPE_STRING_LENGTH); + Offset += GEO_TYPE_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], pGeoStruct->Latitude, strlen(pGeoStruct->Latitude)); + Offset += strlen(pGeoStruct->Latitude); + memcpy(&pNDEFMessage[Offset], URI_LATITUDE_END, URI_LATITUDE_END_LENGTH); + Offset += URI_LATITUDE_END_LENGTH; + memcpy(&pNDEFMessage[Offset], pGeoStruct->Longitude, strlen(pGeoStruct->Longitude)); + Offset += strlen(pGeoStruct->Longitude); + + /* Information header */ + if (pGeoStruct->Information[0] != '\0') { + if (infoSize > 255) { + pNDEFMessage[Offset++] = 0x41; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = infoSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = 0x51; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)infoSize; } - *size = (uint16_t)(Offset); + memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); + Offset += TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ + memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); + Offset += ISO_ENGLISH_CODE_STRING_LENGTH; + + /* Information payload */ + memcpy(&pNDEFMessage[Offset], pGeoStruct->Information, strlen(pGeoStruct->Information)); + Offset += strlen(pGeoStruct->Information); + } + + *size = (uint16_t)(Offset); } /** diff --git a/src/libNDEF/lib_NDEF_Geo.h b/src/libNDEF/lib_NDEF_Geo.h index 346ea3b..2ba6569 100755 --- a/src/libNDEF/lib_NDEF_Geo.h +++ b/src/libNDEF/lib_NDEF_Geo.h @@ -35,9 +35,9 @@ #include "lib_NDEF.h" typedef struct { - char Latitude[GEO_LATITUDE_MAX_SIZE]; - char Longitude[GEO_LONGITUDE_MAX_SIZE]; - char Information[GEO_INFO_MAX_SIZE]; + char Latitude[GEO_LATITUDE_MAX_SIZE]; + char Longitude[GEO_LONGITUDE_MAX_SIZE]; + char Information[GEO_INFO_MAX_SIZE]; } sGeoInfo; #endif /* __LIB_NDEF_GEO_H */ diff --git a/src/libNDEF/lib_NDEF_Handover.cpp b/src/libNDEF/lib_NDEF_Handover.cpp index 96e50e1..91c8354 100755 --- a/src/libNDEF/lib_NDEF_Handover.cpp +++ b/src/libNDEF/lib_NDEF_Handover.cpp @@ -147,52 +147,52 @@ */ uint16_t NDEF::NDEF_ReadAuxData(uint8_t aux_data_nb, Ndef_Handover_alternative_carrier_t *pAC, sRecordInfo_t *pRecord) { - uint16_t status; - uint8_t *pData = pAC->aux_data_ref_start; - uint8_t current_aux = 0; - uint8_t *aux_id = NULL; - uint8_t aux_id_length = 0; - - if ((pAC->aux_data_ref_start == NULL) || - (pAC->aux_data_ref_end == NULL) || - (pAC->aux_data_ref_count == 0) || - (aux_data_nb >= pAC->aux_data_ref_count)) { - return NDEF_ERROR; - } - - - while ((current_aux < aux_data_nb) && (pData < pAC->aux_data_ref_end)) { - aux_id_length = *pData++; - aux_id = pData; - pData += aux_id_length; - current_aux++; - } - - pData = pAC->aux_data_ref_end; - /* if ac has been found */ - if (current_aux == aux_data_nb) { - /* let's now look for the corresponding record - must be after the Handover record */ - do { - status = NDEF_IdentifyBuffer(pRecord, pData); - if (status != NDEF_OK) { - return status; - } - pData = pAC->ac_record.PayloadBufferAdd; - - if ((pRecord->IDLength == aux_id_length) && - !memcmp(pRecord->ID, aux_id, aux_id_length)) { - /* this is the record we were looking for, so exit */ - return NDEF_OK; - } - - // go to next record - pData = pRecord->PayloadBufferAdd + pRecord->PayloadLength; - - } while (!(pRecord->RecordFlags & MB_Mask)); - - } - // if we go there, it means that the record ID is not found + uint16_t status; + uint8_t *pData = pAC->aux_data_ref_start; + uint8_t current_aux = 0; + uint8_t *aux_id = NULL; + uint8_t aux_id_length = 0; + + if ((pAC->aux_data_ref_start == NULL) || + (pAC->aux_data_ref_end == NULL) || + (pAC->aux_data_ref_count == 0) || + (aux_data_nb >= pAC->aux_data_ref_count)) { return NDEF_ERROR; + } + + + while ((current_aux < aux_data_nb) && (pData < pAC->aux_data_ref_end)) { + aux_id_length = *pData++; + aux_id = pData; + pData += aux_id_length; + current_aux++; + } + + pData = pAC->aux_data_ref_end; + /* if ac has been found */ + if (current_aux == aux_data_nb) { + /* let's now look for the corresponding record - must be after the Handover record */ + do { + status = NDEF_IdentifyBuffer(pRecord, pData); + if (status != NDEF_OK) { + return status; + } + pData = pAC->ac_record.PayloadBufferAdd; + + if ((pRecord->IDLength == aux_id_length) && + !memcmp(pRecord->ID, aux_id, aux_id_length)) { + /* this is the record we were looking for, so exit */ + return NDEF_OK; + } + + // go to next record + pData = pRecord->PayloadBufferAdd + pRecord->PayloadLength; + + } while (!(pRecord->RecordFlags & MB_Mask)); + + } + // if we go there, it means that the record ID is not found + return NDEF_ERROR; } @@ -207,73 +207,73 @@ uint16_t NDEF::NDEF_ReadAuxData(uint8_t aux_data_nb, Ndef_Handover_alternative_c */ uint16_t NDEF::NDEF_ReadAC(uint8_t ac_nb, Ndef_Handover_t *pHandover, Ndef_Handover_alternative_carrier_t *pAC) { - uint16_t status; - uint8_t *pData = pHandover->ac_start; - uint8_t current_ac = 0; - uint8_t *ac_id; - uint8_t ac_id_length; - sRecordInfo_t NestedRecord; - uint8_t ac_found = 0; - - if ((pHandover->ac_start == NULL) || - (pHandover->ac_end == NULL) || - (pHandover->nb_alternative_carrier == 0) || - (ac_nb >= pHandover->nb_alternative_carrier)) { - return NDEF_ERROR; - } + uint16_t status; + uint8_t *pData = pHandover->ac_start; + uint8_t current_ac = 0; + uint8_t *ac_id; + uint8_t ac_id_length; + sRecordInfo_t NestedRecord; + uint8_t ac_found = 0; + + if ((pHandover->ac_start == NULL) || + (pHandover->ac_end == NULL) || + (pHandover->nb_alternative_carrier == 0) || + (ac_nb >= pHandover->nb_alternative_carrier)) { + return NDEF_ERROR; + } - // Default handover init - pAC->aux_data_ref_count = 0; - - while ((current_ac <= ac_nb) && (current_ac <= pHandover->nb_alternative_carrier) && (pData < pHandover->ac_end)) { - status = NDEF_IdentifyBuffer(&NestedRecord, pData); - if (status != NDEF_OK) { - return status; - } - // go to payload address - pData = NestedRecord.PayloadBufferAdd; - - if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR))) { - if (current_ac == ac_nb) { - // parse the AC now - pAC->cps = pData[0] & NDEF_HANDOVER_AC_CPS_MASK; - ac_id_length = pData[1]; - ac_id = &pData[2]; - pAC->aux_data_ref_count = pData[2 + ac_id_length]; - pAC->aux_data_ref_start = &pData[3 + ac_id_length]; - pAC->aux_data_ref_end = pData + NestedRecord.PayloadLength; - ac_found = 1; - } - current_ac++; - } - // go to next record - pData += NestedRecord.PayloadLength; - } - pData = pHandover->ac_end; - /* if ac has been found */ - if (ac_found) { - /* let's now look for the corresponding record - must be after the Handover record */ - do { - status = NDEF_IdentifyBuffer(&pAC->ac_record, pData); - if (status != NDEF_OK) { - return status; - } - pData = pAC->ac_record.PayloadBufferAdd; - - if ((pAC->ac_record.IDLength == ac_id_length) && - !memcmp(pAC->ac_record.ID, ac_id, ac_id_length)) { - /* this is the record we were looking for, so exit */ - return NDEF_OK; - } - - // go to next record - pData = pAC->ac_record.PayloadBufferAdd + pAC->ac_record.PayloadLength; - // TO DO: add a security condition to avoid infinite loop if NDEF file is corrupted - } while (!(pAC->ac_record.RecordFlags & ME_Mask)); + // Default handover init + pAC->aux_data_ref_count = 0; + while ((current_ac <= ac_nb) && (current_ac <= pHandover->nb_alternative_carrier) && (pData < pHandover->ac_end)) { + status = NDEF_IdentifyBuffer(&NestedRecord, pData); + if (status != NDEF_OK) { + return status; } - // if we go there, it means that the record ID is not found - return NDEF_ERROR; + // go to payload address + pData = NestedRecord.PayloadBufferAdd; + + if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR))) { + if (current_ac == ac_nb) { + // parse the AC now + pAC->cps = pData[0] & NDEF_HANDOVER_AC_CPS_MASK; + ac_id_length = pData[1]; + ac_id = &pData[2]; + pAC->aux_data_ref_count = pData[2 + ac_id_length]; + pAC->aux_data_ref_start = &pData[3 + ac_id_length]; + pAC->aux_data_ref_end = pData + NestedRecord.PayloadLength; + ac_found = 1; + } + current_ac++; + } + // go to next record + pData += NestedRecord.PayloadLength; + } + pData = pHandover->ac_end; + /* if ac has been found */ + if (ac_found) { + /* let's now look for the corresponding record - must be after the Handover record */ + do { + status = NDEF_IdentifyBuffer(&pAC->ac_record, pData); + if (status != NDEF_OK) { + return status; + } + pData = pAC->ac_record.PayloadBufferAdd; + + if ((pAC->ac_record.IDLength == ac_id_length) && + !memcmp(pAC->ac_record.ID, ac_id, ac_id_length)) { + /* this is the record we were looking for, so exit */ + return NDEF_OK; + } + + // go to next record + pData = pAC->ac_record.PayloadBufferAdd + pAC->ac_record.PayloadLength; + // TO DO: add a security condition to avoid infinite loop if NDEF file is corrupted + } while (!(pAC->ac_record.RecordFlags & ME_Mask)); + + } + // if we go there, it means that the record ID is not found + return NDEF_ERROR; } @@ -286,71 +286,71 @@ uint16_t NDEF::NDEF_ReadAC(uint8_t ac_nb, Ndef_Handover_t *pHandover, Ndef_Hando */ uint16_t NDEF::NDEF_ReadHandover(sRecordInfo_t *pRecord, Ndef_Handover_t *pHandover) { - uint16_t status; - uint8_t *pData = pRecord->PayloadBufferAdd; - uint8_t *pEnd = pData + pRecord->PayloadLength; - sRecordInfo_t NestedRecord; - - /* Default Handover Structure init */ - pHandover->version = 0; - pHandover->nb_alternative_carrier = 0; - pHandover->has_cr = 0; - pHandover->ac_start = NULL; - pHandover->ac_end = NULL; - - /* A Handover record should never be the end of the NDEF message */ - if (pRecord->RecordFlags & ME_Mask) { - return NDEF_ERROR; + uint16_t status; + uint8_t *pData = pRecord->PayloadBufferAdd; + uint8_t *pEnd = pData + pRecord->PayloadLength; + sRecordInfo_t NestedRecord; + + /* Default Handover Structure init */ + pHandover->version = 0; + pHandover->nb_alternative_carrier = 0; + pHandover->has_cr = 0; + pHandover->ac_start = NULL; + pHandover->ac_end = NULL; + + /* A Handover record should never be the end of the NDEF message */ + if (pRecord->RecordFlags & ME_Mask) { + return NDEF_ERROR; + } + + if (!memcmp(pRecord->Type, NDEF_HANDOVER_REQUEST_TYPE_STR, strlen(NDEF_HANDOVER_REQUEST_TYPE_STR))) { + pHandover->type = NDEF_HANDOVER_REQUEST_TYPE; + } else if (!memcmp(pRecord->Type, NDEF_HANDOVER_SELECT_TYPE_STR, strlen(NDEF_HANDOVER_SELECT_TYPE_STR))) { + pHandover->type = NDEF_HANDOVER_SELECT_TYPE; + } else { + /* This is not a Handover record! */ + return NDEF_ERROR; + } + + pHandover->version = *pData++; + + /* Following records are nested into Hr/s record */ + while (pData < pEnd) { + status = NDEF_IdentifyBuffer(&NestedRecord, pData); + if (status != NDEF_OK) { + return status; + } + /* save record address */ + uint8_t *pACRecord = pData; + /* go to payload address */ + pData = NestedRecord.PayloadBufferAdd; + + /* Parse Collision Resolution if Handover request */ + if (pHandover->type == NDEF_HANDOVER_REQUEST_TYPE) { + + if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_COLLISION_RESOLUTION_TYPE_STR, strlen(NDEF_HANDOVER_COLLISION_RESOLUTION_TYPE_STR))) { + pHandover->has_cr = 1; + pHandover->cr_random_number = *(uint16_t *)pData; + } } - if (!memcmp(pRecord->Type, NDEF_HANDOVER_REQUEST_TYPE_STR, strlen(NDEF_HANDOVER_REQUEST_TYPE_STR))) { - pHandover->type = NDEF_HANDOVER_REQUEST_TYPE; - } else if (!memcmp(pRecord->Type, NDEF_HANDOVER_SELECT_TYPE_STR, strlen(NDEF_HANDOVER_SELECT_TYPE_STR))) { - pHandover->type = NDEF_HANDOVER_SELECT_TYPE; + /* Parse AlternativeCarriers just to know how many they are */ + else if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR))) { + pHandover->nb_alternative_carrier++; + if (pHandover->ac_start == NULL) { + pHandover->ac_start = pACRecord; + } + pHandover->ac_end = pData + NestedRecord.PayloadLength; + /* don't parse the AC now */ } else { - /* This is not a Handover record! */ - return NDEF_ERROR; + /* this is an unexpected type, just ignore it */ } + /* go to next record */ + pData += NestedRecord.PayloadLength; - pHandover->version = *pData++; - - /* Following records are nested into Hr/s record */ - while (pData < pEnd) { - status = NDEF_IdentifyBuffer(&NestedRecord, pData); - if (status != NDEF_OK) { - return status; - } - /* save record address */ - uint8_t *pACRecord = pData; - /* go to payload address */ - pData = NestedRecord.PayloadBufferAdd; - - /* Parse Collision Resolution if Handover request */ - if (pHandover->type == NDEF_HANDOVER_REQUEST_TYPE) { - - if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_COLLISION_RESOLUTION_TYPE_STR, strlen(NDEF_HANDOVER_COLLISION_RESOLUTION_TYPE_STR))) { - pHandover->has_cr = 1; - pHandover->cr_random_number = *(uint16_t *)pData; - } - } - - /* Parse AlternativeCarriers just to know how many they are */ - else if (!memcmp(NestedRecord.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR))) { - pHandover->nb_alternative_carrier++; - if (pHandover->ac_start == NULL) { - pHandover->ac_start = pACRecord; - } - pHandover->ac_end = pData + NestedRecord.PayloadLength; - /* don't parse the AC now */ - } else { - /* this is an unexpected type, just ignore it */ - } - /* go to next record */ - pData += NestedRecord.PayloadLength; + } - } - - return NDEF_OK; + return NDEF_OK; } /** @@ -362,34 +362,34 @@ uint16_t NDEF::NDEF_ReadHandover(sRecordInfo_t *pRecord, Ndef_Handover_t *pHand */ uint16_t NDEF::NDEF_CreateHandover(Ndef_Handover_t *pHandover, sRecordInfo_t *pRecord) { - uint16_t status = NDEF_ERROR; - - /* Use a static buffer to prepare the Handover record */ - pRecord->PayloadBufferAdd = NDEF_Record_Buffer; - /* Alternative, where the user must first allocate the Payload buffer in the record: - * if (pRecord->PayloadBufferAdd == NULL) - * return NDEF_ERROR; - */ - - /* Handover MUST be the first record (SR mask to be updated when actually writing the record) */ - pRecord->RecordFlags = MB_Mask | ME_Mask | TNF_WellKnown; - - if (pHandover->type == NDEF_HANDOVER_SELECT_TYPE) { - pRecord->TypeLength = strlen(NDEF_HANDOVER_SELECT_TYPE_STR); - memcpy(pRecord->Type, NDEF_HANDOVER_SELECT_TYPE_STR, pRecord->TypeLength); - } else if (pHandover->type == NDEF_HANDOVER_REQUEST_TYPE) { - pRecord->TypeLength = strlen(NDEF_HANDOVER_SELECT_TYPE_STR); - memcpy(pRecord->Type, NDEF_HANDOVER_REQUEST_TYPE_STR, pRecord->TypeLength); - } else { - return NDEF_ERROR; - } + uint16_t status = NDEF_ERROR; + + /* Use a static buffer to prepare the Handover record */ + pRecord->PayloadBufferAdd = NDEF_Record_Buffer; + /* Alternative, where the user must first allocate the Payload buffer in the record: + * if (pRecord->PayloadBufferAdd == NULL) + * return NDEF_ERROR; + */ + + /* Handover MUST be the first record (SR mask to be updated when actually writing the record) */ + pRecord->RecordFlags = MB_Mask | ME_Mask | TNF_WellKnown; + + if (pHandover->type == NDEF_HANDOVER_SELECT_TYPE) { + pRecord->TypeLength = strlen(NDEF_HANDOVER_SELECT_TYPE_STR); + memcpy(pRecord->Type, NDEF_HANDOVER_SELECT_TYPE_STR, pRecord->TypeLength); + } else if (pHandover->type == NDEF_HANDOVER_REQUEST_TYPE) { + pRecord->TypeLength = strlen(NDEF_HANDOVER_SELECT_TYPE_STR); + memcpy(pRecord->Type, NDEF_HANDOVER_REQUEST_TYPE_STR, pRecord->TypeLength); + } else { + return NDEF_ERROR; + } - pRecord->PayloadLength = sizeof(pHandover->version); - *pRecord->PayloadBufferAdd = pHandover->version; + pRecord->PayloadLength = sizeof(pHandover->version); + *pRecord->PayloadBufferAdd = pHandover->version; - /* Don't write the record for now, additional Alternative Carriers to come as nested records. */ + /* Don't write the record for now, additional Alternative Carriers to come as nested records. */ - return status; + return status; } @@ -405,50 +405,50 @@ uint16_t NDEF::NDEF_CreateHandover(Ndef_Handover_t *pHandover, sRecordInfo_t *p */ uint16_t NDEF::NDEF_AddAlternativeCarrier(Ndef_Handover_alternative_carrier_t *pAC, char *CarrierDataRef, char **AuxDataRefID, sRecordInfo_t *pRecord) { - memset(NDEF_AlternativeCarrier_Buffer, 0x0, ((sizeof(uint8_t))*NDEF_AC_BUFFER_SIZE)); - - /* check that there is enough space in the buffers */ - pAC->ac_record.PayloadLength = NDEF_GetACDataLength(pAC, CarrierDataRef, AuxDataRefID); - if (((pRecord->PayloadLength + pAC->ac_record.PayloadLength) > NDEF_RECORD_MAX_SIZE) || - (pAC->ac_record.PayloadLength > NDEF_AC_BUFFER_SIZE)) { - return NDEF_ERROR_MEMORY_INTERNAL; - } - - /* Use specific buffer to prepare the nested record */ - uint8_t *pData = NDEF_AlternativeCarrier_Buffer; - pAC->ac_record.PayloadBufferAdd = pData; - /* Following line is an alternative where the user must allocate the payload buffer of the ac_record: - * uint8_t* pData = pAC->ac_record.PayloadBufferAdd ; - */ - - if ((pRecord->PayloadBufferAdd == NULL) || - (pRecord->PayloadLength == 0)) { - return NDEF_ERROR; - } - - /* AC is not the first record */ - pAC->ac_record.RecordFlags = TNF_WellKnown; - - pAC->ac_record.TypeLength = strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR); - memcpy(pAC->ac_record.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, pAC->ac_record.TypeLength); - - /* Length : cps byte + data ref length byte + auxiliary data ref count byte + data ref length */ - *pData++ = pAC->cps & NDEF_HANDOVER_AC_CPS_MASK; - *pData++ = strlen(CarrierDataRef); - memcpy(pData, CarrierDataRef, strlen(CarrierDataRef)); - pData += strlen(CarrierDataRef); - *pData++ = pAC->aux_data_ref_count; - - uint8_t AuxDataIndex; - for (AuxDataIndex = 0; AuxDataIndex < pAC->aux_data_ref_count; AuxDataIndex++) { - *pData++ = strlen(AuxDataRefID[AuxDataIndex]); - memcpy(pData, AuxDataRefID[AuxDataIndex], strlen(AuxDataRefID[AuxDataIndex])); - pData += strlen(AuxDataRefID[AuxDataIndex]); - } - - /* Append the nested record right after the Handover record - increase its length accordingly */ - pRecord->PayloadLength += NDEF_WriteRecord(&pAC->ac_record, pRecord->PayloadBufferAdd + pRecord->PayloadLength); - return NDEF_OK; + memset(NDEF_AlternativeCarrier_Buffer, 0x0, ((sizeof(uint8_t))*NDEF_AC_BUFFER_SIZE)); + + /* check that there is enough space in the buffers */ + pAC->ac_record.PayloadLength = NDEF_GetACDataLength(pAC, CarrierDataRef, AuxDataRefID); + if (((pRecord->PayloadLength + pAC->ac_record.PayloadLength) > NDEF_RECORD_MAX_SIZE) || + (pAC->ac_record.PayloadLength > NDEF_AC_BUFFER_SIZE)) { + return NDEF_ERROR_MEMORY_INTERNAL; + } + + /* Use specific buffer to prepare the nested record */ + uint8_t *pData = NDEF_AlternativeCarrier_Buffer; + pAC->ac_record.PayloadBufferAdd = pData; + /* Following line is an alternative where the user must allocate the payload buffer of the ac_record: + * uint8_t* pData = pAC->ac_record.PayloadBufferAdd ; + */ + + if ((pRecord->PayloadBufferAdd == NULL) || + (pRecord->PayloadLength == 0)) { + return NDEF_ERROR; + } + + /* AC is not the first record */ + pAC->ac_record.RecordFlags = TNF_WellKnown; + + pAC->ac_record.TypeLength = strlen(NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR); + memcpy(pAC->ac_record.Type, NDEF_HANDOVER_ALTERNATIVE_CARRIER_TYPE_STR, pAC->ac_record.TypeLength); + + /* Length : cps byte + data ref length byte + auxiliary data ref count byte + data ref length */ + *pData++ = pAC->cps & NDEF_HANDOVER_AC_CPS_MASK; + *pData++ = strlen(CarrierDataRef); + memcpy(pData, CarrierDataRef, strlen(CarrierDataRef)); + pData += strlen(CarrierDataRef); + *pData++ = pAC->aux_data_ref_count; + + uint8_t AuxDataIndex; + for (AuxDataIndex = 0; AuxDataIndex < pAC->aux_data_ref_count; AuxDataIndex++) { + *pData++ = strlen(AuxDataRefID[AuxDataIndex]); + memcpy(pData, AuxDataRefID[AuxDataIndex], strlen(AuxDataRefID[AuxDataIndex])); + pData += strlen(AuxDataRefID[AuxDataIndex]); + } + + /* Append the nested record right after the Handover record - increase its length accordingly */ + pRecord->PayloadLength += NDEF_WriteRecord(&pAC->ac_record, pRecord->PayloadBufferAdd + pRecord->PayloadLength); + return NDEF_OK; } @@ -461,21 +461,21 @@ uint16_t NDEF::NDEF_AddAlternativeCarrier(Ndef_Handover_alternative_carrier_t *p */ uint32_t NDEF::NDEF_GetACDataLength(Ndef_Handover_alternative_carrier_t *pAC, char *CarrierDataRef, char **AuxDataRefID) { - uint8_t AuxDataIndex; - - /* First compute the Data length */ - uint32_t length = 1 + // cps - 1 + // Carrier data ref length - strlen(CarrierDataRef) + // Carrier data ref - 1 + // auxiliary data count - pAC->aux_data_ref_count * 1; // auxiliary data lengths - - /* Then adds the length of the Auxiliary Data */ - for (AuxDataIndex = 0; AuxDataIndex < pAC->aux_data_ref_count; AuxDataIndex++) { - length += strlen(AuxDataRefID[AuxDataIndex]); - } + uint8_t AuxDataIndex; + + /* First compute the Data length */ + uint32_t length = 1 + // cps + 1 + // Carrier data ref length + strlen(CarrierDataRef) + // Carrier data ref + 1 + // auxiliary data count + pAC->aux_data_ref_count * 1; // auxiliary data lengths + + /* Then adds the length of the Auxiliary Data */ + for (AuxDataIndex = 0; AuxDataIndex < pAC->aux_data_ref_count; AuxDataIndex++) { + length += strlen(AuxDataRefID[AuxDataIndex]); + } - return length; + return length; } /** @@ -490,10 +490,10 @@ uint32_t NDEF::NDEF_GetACDataLength(Ndef_Handover_alternative_carrier_t *pAC, ch */ uint16_t NDEF::NDEF_WriteHandover(sRecordInfo_t *pRecord, uint8_t *pNdef) { - /* Note: in case of Handover Select for no matching alternative carrier, the ME bit flag must be set by the caller */ + /* Note: in case of Handover Select for no matching alternative carrier, the ME bit flag must be set by the caller */ - uint32_t Size = NDEF_WriteRecord(pRecord, pNdef); - return NDEF_WriteNDEF(Size, pNdef); + uint32_t Size = NDEF_WriteRecord(pRecord, pNdef); + return NDEF_WriteNDEF(Size, pNdef); } /** diff --git a/src/libNDEF/lib_NDEF_Handover.h b/src/libNDEF/lib_NDEF_Handover.h index 6d5b3b6..6b7fcfb 100755 --- a/src/libNDEF/lib_NDEF_Handover.h +++ b/src/libNDEF/lib_NDEF_Handover.h @@ -64,33 +64,33 @@ #define NDEF_HANDOVER_AC_CPS_MASK (0x3) /** @brief Enumerates the NFC Forum Power States possible values */ typedef enum { - NDEF_HANDOVER_AC_CPS_INACTIVE = 0x0, /**< The HW for this Alternative Carrier has to be switch on before proceeding. */ - NDEF_HANDOVER_AC_CPS_ACTIVE = 0x1, /**< The HW for this Alternative Carrier is currently running. */ - NDEF_HANDOVER_AC_CPS_ACTIVATING = 0x2, /**< The HW for this Alternative Carrier is being activated. */ - NDEF_HANDOVER_AC_CPS_UNKNOWN = 0x3 /**< The HW for this Alternative Carrier is unknown. */ + NDEF_HANDOVER_AC_CPS_INACTIVE = 0x0, /**< The HW for this Alternative Carrier has to be switch on before proceeding. */ + NDEF_HANDOVER_AC_CPS_ACTIVE = 0x1, /**< The HW for this Alternative Carrier is currently running. */ + NDEF_HANDOVER_AC_CPS_ACTIVATING = 0x2, /**< The HW for this Alternative Carrier is being activated. */ + NDEF_HANDOVER_AC_CPS_UNKNOWN = 0x3 /**< The HW for this Alternative Carrier is unknown. */ } Ndef_Handover_ac_cps_t; typedef struct { - uint8_t cps; /**< Current Power State for this Alternative Carrier Hardware. */ - sRecordInfo_t ac_record; /**< The record structure used to store/build the Alternative Carrier record. */ - uint8_t aux_data_ref_count; /**< The number of Auxiliary Data Reference for this Alternative Carrier. */ - /* following fields are only used when reading NDEF */ - uint8_t *aux_data_ref_start; /**< Internal field, managed by the library, to keep track of the Auxiliary Data Reference start address in the AC record. */ - uint8_t *aux_data_ref_end; /**< Internal field, managed by the library, to keep track of the Auxiliary Data Reference end address in the AC record. */ + uint8_t cps; /**< Current Power State for this Alternative Carrier Hardware. */ + sRecordInfo_t ac_record; /**< The record structure used to store/build the Alternative Carrier record. */ + uint8_t aux_data_ref_count; /**< The number of Auxiliary Data Reference for this Alternative Carrier. */ + /* following fields are only used when reading NDEF */ + uint8_t *aux_data_ref_start; /**< Internal field, managed by the library, to keep track of the Auxiliary Data Reference start address in the AC record. */ + uint8_t *aux_data_ref_end; /**< Internal field, managed by the library, to keep track of the Auxiliary Data Reference end address in the AC record. */ } Ndef_Handover_alternative_carrier_t; typedef struct { - uint16_t type; /**< Handover type: could be Select or Request. */ - uint8_t version; /**< Version of the Handover record. */ - /* following fields are only used when reading NDEF */ - uint8_t has_cr; /**< Boolean, if true this Handover has a Collision Resolution nested record. */ - uint16_t cr_random_number; /**< Random number for the Collision Resolution. */ - uint8_t nb_alternative_carrier; /**< Number of Alternative Carrier nested records un this Handover. */ - uint8_t *ac_start; /**< Internal field, managed by the library, to keep track of the Alternative Carrier Reference Data start address in the Handover record. */ - uint8_t *ac_end; /**< Internal field, managed by the library, to keep track of the Alternative Carrier Reference Data end address in the Handover record. */ + uint16_t type; /**< Handover type: could be Select or Request. */ + uint8_t version; /**< Version of the Handover record. */ + /* following fields are only used when reading NDEF */ + uint8_t has_cr; /**< Boolean, if true this Handover has a Collision Resolution nested record. */ + uint16_t cr_random_number; /**< Random number for the Collision Resolution. */ + uint8_t nb_alternative_carrier; /**< Number of Alternative Carrier nested records un this Handover. */ + uint8_t *ac_start; /**< Internal field, managed by the library, to keep track of the Alternative Carrier Reference Data start address in the Handover record. */ + uint8_t *ac_end; /**< Internal field, managed by the library, to keep track of the Alternative Carrier Reference Data end address in the Handover record. */ } Ndef_Handover_t; /** @} diff --git a/src/libNDEF/lib_NDEF_MyApp.cpp b/src/libNDEF/lib_NDEF_MyApp.cpp index ff61bc8..973a812 100755 --- a/src/libNDEF/lib_NDEF_MyApp.cpp +++ b/src/libNDEF/lib_NDEF_MyApp.cpp @@ -62,53 +62,53 @@ */ void NDEF::NDEF_Extract_M24SRDiscoveryApp_Input(sRecordInfo_t *pRecordStruct, sMyAppInfo *pMyAppStruct) { - uint8_t *pPayload; - uint8_t *pLook4Word; - uint16_t BackGroundColor, FontColor; - uint8_t i; - - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - - /* initialize struct in case not matching found */ - for (i = 0; i < 8; i++) { - /* Set the Back Color */ - pMyAppStruct->LineX[i].BackGroundColor = 0xFFFF; - /* Set the Text Color */ - pMyAppStruct->LineX[i].FontColor = 0x0000; - /* Set the line number */ - pMyAppStruct->LineX[i].LineNb = i + 1; - /* Set the line content */ - memcpy(pMyAppStruct->LineX[i].String, " ", 20); - } - - pLook4Word = pPayload; - - for (i = 0; i < 4; i++) { - pMyAppStruct->LedBlinkConf.LedConf[i] = *pLook4Word; - pLook4Word++; - } - pMyAppStruct->LedBlinkConf.Speed = *pLook4Word; + uint8_t *pPayload; + uint8_t *pLook4Word; + uint16_t BackGroundColor, FontColor; + uint8_t i; + + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + + /* initialize struct in case not matching found */ + for (i = 0; i < 8; i++) { + /* Set the Back Color */ + pMyAppStruct->LineX[i].BackGroundColor = 0xFFFF; + /* Set the Text Color */ + pMyAppStruct->LineX[i].FontColor = 0x0000; + /* Set the line number */ + pMyAppStruct->LineX[i].LineNb = i + 1; + /* Set the line content */ + memcpy(pMyAppStruct->LineX[i].String, " ", 20); + } + + pLook4Word = pPayload; + + for (i = 0; i < 4; i++) { + pMyAppStruct->LedBlinkConf.LedConf[i] = *pLook4Word; pLook4Word++; + } + pMyAppStruct->LedBlinkConf.Speed = *pLook4Word; + pLook4Word++; - for (i = 0; i < 8; i++) { - /* Set the line number */ - pMyAppStruct->LineX[i].LineNb = *pLook4Word; - pLook4Word++; - /* Set the Back Color */ - BackGroundColor = (uint16_t)(*pLook4Word << 8); - BackGroundColor = BackGroundColor | (uint16_t)(*++pLook4Word); - pMyAppStruct->LineX[i].BackGroundColor = BackGroundColor; - pLook4Word++; - /* Set the Text Color */ - FontColor = (uint16_t)(*pLook4Word << 8); - FontColor = FontColor | (uint16_t)(*++pLook4Word); - pMyAppStruct->LineX[i].FontColor = FontColor; - pLook4Word++; - /* Set the line content */ - memcpy(pMyAppStruct->LineX[i].String, (char *)pLook4Word, 20); - pLook4Word += 20; - } + for (i = 0; i < 8; i++) { + /* Set the line number */ + pMyAppStruct->LineX[i].LineNb = *pLook4Word; + pLook4Word++; + /* Set the Back Color */ + BackGroundColor = (uint16_t)(*pLook4Word << 8); + BackGroundColor = BackGroundColor | (uint16_t)(*++pLook4Word); + pMyAppStruct->LineX[i].BackGroundColor = BackGroundColor; + pLook4Word++; + /* Set the Text Color */ + FontColor = (uint16_t)(*pLook4Word << 8); + FontColor = FontColor | (uint16_t)(*++pLook4Word); + pMyAppStruct->LineX[i].FontColor = FontColor; + pLook4Word++; + /* Set the line content */ + memcpy(pMyAppStruct->LineX[i].String, (char *)pLook4Word, 20); + pLook4Word += 20; + } } @@ -130,16 +130,16 @@ void NDEF::NDEF_Extract_M24SRDiscoveryApp_Input(sRecordInfo_t *pRecordStruct, sM */ uint16_t NDEF::NDEF_ReadMyApp(sRecordInfo_t *pRecordStruct, sMyAppInfo *pMyAppStruct) { - uint16_t status = NDEF_ERROR; + uint16_t status = NDEF_ERROR; - if (pRecordStruct->NDEF_Type == M24SR_DISCOVERY_APP_TYPE) { - NDEF_Extract_M24SRDiscoveryApp_Input(pRecordStruct, pMyAppStruct); - status = NDEF_OK; - } else { - status = NDEF_ERROR; - } + if (pRecordStruct->NDEF_Type == M24SR_DISCOVERY_APP_TYPE) { + NDEF_Extract_M24SRDiscoveryApp_Input(pRecordStruct, pMyAppStruct); + status = NDEF_OK; + } else { + status = NDEF_ERROR; + } - return status; + return status; } /** @@ -155,105 +155,105 @@ uint16_t NDEF::NDEF_ReadMyApp(sRecordInfo_t *pRecordStruct, sMyAppInfo *pMyAppSt */ uint16_t NDEF::NDEF_WriteMyApp(sMyAppInfo *pMyAppStruct) { - uint16_t status = NDEF_ERROR; - uint16_t DataSize; - uint32_t PayloadSize; - uint8_t i; - uint8_t *pPayload; - - // Unused parameter - (void)(pMyAppStruct); - - /* External Type Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- IL=0, CF=0 and SR=1 TNF=4 NFC Forum external type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Not Used */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ /* The payload will always be 5 + 25*8=205 bytes for this application */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ /* st.com:m24sr_discovery_democtrl */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - - /* fill URI record header */ - NDEF_Buffer[0] = 0xD4; /* Record Flag */ - NDEF_Buffer[1] = M24SR_DISCOVERY_APP_STRING_LENGTH; - NDEF_Buffer[2] = 0x00; /* Will be filled at the end when payload size is known */ - - memcpy(&NDEF_Buffer[3], M24SR_DISCOVERY_APP_STRING, M24SR_DISCOVERY_APP_STRING_LENGTH); - - pPayload = &NDEF_Buffer[ 3 + M24SR_DISCOVERY_APP_STRING_LENGTH]; - PayloadSize = 0; - - /**************************************************************/ - /* BLINK CONFIG data */ - - /* led 1 blinking */ - *pPayload = 0x03; + uint16_t status = NDEF_ERROR; + uint16_t DataSize; + uint32_t PayloadSize; + uint8_t i; + uint8_t *pPayload; + + // Unused parameter + (void)(pMyAppStruct); + + /* External Type Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- IL=0, CF=0 and SR=1 TNF=4 NFC Forum external type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Not Used */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ /* The payload will always be 5 + 25*8=205 bytes for this application */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ /* st.com:m24sr_discovery_democtrl */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + + /* fill URI record header */ + NDEF_Buffer[0] = 0xD4; /* Record Flag */ + NDEF_Buffer[1] = M24SR_DISCOVERY_APP_STRING_LENGTH; + NDEF_Buffer[2] = 0x00; /* Will be filled at the end when payload size is known */ + + memcpy(&NDEF_Buffer[3], M24SR_DISCOVERY_APP_STRING, M24SR_DISCOVERY_APP_STRING_LENGTH); + + pPayload = &NDEF_Buffer[ 3 + M24SR_DISCOVERY_APP_STRING_LENGTH]; + PayloadSize = 0; + + /**************************************************************/ + /* BLINK CONFIG data */ + + /* led 1 blinking */ + *pPayload = 0x03; + pPayload++; + /* led 2 blinking */ + *pPayload = 0x02; + pPayload++; + /* led 3 blinking */ + *pPayload = 0x02; + pPayload++; + /* led 4 blinking */ + *pPayload = 0x03; + pPayload++; + /* speed */ + *pPayload = 0x03; + pPayload++; + + PayloadSize += 5; + + /**************************************************************/ + + /**************************************************************/ + /* SCREEN config data */ + for (i = 0; i < 8; i++) { + /* Line number */ + *pPayload = (uint8_t)(i + 1); pPayload++; - /* led 2 blinking */ - *pPayload = 0x02; + /* Background color */ + *pPayload = 0xFF - (0xFF / i); pPayload++; - /* led 3 blinking */ - *pPayload = 0x02; + *pPayload = 0xFF - (0xFF / i); pPayload++; - /* led 4 blinking */ - *pPayload = 0x03; + /* Font Color */ + *pPayload = 0xFF / i; pPayload++; - /* speed */ - *pPayload = 0x03; + *pPayload = 0xFF / i; pPayload++; + /* String */ + memcpy(pPayload, "ABCDEFGHIJKLMNOPQRST", 20); + pPayload += 20; - PayloadSize += 5; - - /**************************************************************/ - - /**************************************************************/ - /* SCREEN config data */ - for (i = 0; i < 8; i++) { - /* Line number */ - *pPayload = (uint8_t)(i + 1); - pPayload++; - /* Background color */ - *pPayload = 0xFF - (0xFF / i); - pPayload++; - *pPayload = 0xFF - (0xFF / i); - pPayload++; - /* Font Color */ - *pPayload = 0xFF / i; - pPayload++; - *pPayload = 0xFF / i; - pPayload++; - /* String */ - memcpy(pPayload, "ABCDEFGHIJKLMNOPQRST", 20); - pPayload += 20; - - PayloadSize += 25; + PayloadSize += 25; - } + } - NDEF_Buffer[2] = PayloadSize & 0x000000FF; + NDEF_Buffer[2] = PayloadSize & 0x000000FF; - DataSize = PayloadSize + 5 + M24SR_DISCOVERY_APP_STRING_LENGTH; + DataSize = PayloadSize + 5 + M24SR_DISCOVERY_APP_STRING_LENGTH; - /* Write NDEF */ - status = NfcTag_WriteNDEF(DataSize, NDEF_Buffer); + /* Write NDEF */ + status = NfcTag_WriteNDEF(DataSize, NDEF_Buffer); - return status; + return status; } diff --git a/src/libNDEF/lib_NDEF_MyApp.h b/src/libNDEF/lib_NDEF_MyApp.h index adc1709..c280c49 100755 --- a/src/libNDEF/lib_NDEF_MyApp.h +++ b/src/libNDEF/lib_NDEF_MyApp.h @@ -54,20 +54,20 @@ #define MYAPP_LED_CONF_BLINKING ((uint8_t) 0x2) typedef struct { - uint8_t LedConf[4]; - uint8_t Speed; + uint8_t LedConf[4]; + uint8_t Speed; } sLedBlinkConfig; typedef struct { - uint8_t LineNb; - uint16_t BackGroundColor; - uint16_t FontColor; - char String[20]; + uint8_t LineNb; + uint16_t BackGroundColor; + uint16_t FontColor; + char String[20]; } sLineConfig; typedef struct { - sLedBlinkConfig LedBlinkConf; - sLineConfig LineX[MYAPP_NB_LINES]; + sLedBlinkConfig LedBlinkConf; + sLineConfig LineX[MYAPP_NB_LINES]; } sMyAppInfo; #endif /* __LIB_NDEF_MYAPP_H */ diff --git a/src/libNDEF/lib_NDEF_SMS.cpp b/src/libNDEF/lib_NDEF_SMS.cpp index ff22c50..eac14bc 100755 --- a/src/libNDEF/lib_NDEF_SMS.cpp +++ b/src/libNDEF/lib_NDEF_SMS.cpp @@ -63,48 +63,48 @@ */ void NDEF::NDEF_FillSMSStruct(uint8_t *pPayload, uint32_t PayloadSize, sSMSInfo *pSMSStruct) { - uint8_t *pLastByteAdd, *pLook4Word, *pEndString; - const char *pKeyWord = SMS_TYPE_STRING; - uint32_t SizeOfKeyWord = SMS_TYPE_STRING_LENGTH; - pEndString = 0; - - /* First character force to NULL in case not matching found */ - *pSMSStruct->PhoneNumber = 0; - *pSMSStruct->Message = 0; - - /* Interesting information are stored before picture if any */ - /* Moreover picture is not used in this demonstration SW */ - pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); - - pLook4Word = pPayload; - while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { - pLook4Word++; + uint8_t *pLastByteAdd, *pLook4Word, *pEndString; + const char *pKeyWord = SMS_TYPE_STRING; + uint32_t SizeOfKeyWord = SMS_TYPE_STRING_LENGTH; + pEndString = 0; + + /* First character force to NULL in case not matching found */ + *pSMSStruct->PhoneNumber = 0; + *pSMSStruct->Message = 0; + + /* Interesting information are stored before picture if any */ + /* Moreover picture is not used in this demonstration SW */ + pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); + + pLook4Word = pPayload; + while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { + pLook4Word++; + } + + /* Retrieve phone number */ + if (pLook4Word != pLastByteAdd) { + pLook4Word += SizeOfKeyWord; + pEndString = pLook4Word; + while (memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { + pEndString++; } - - /* Retrieve phone number */ - if (pLook4Word != pLastByteAdd) { - pLook4Word += SizeOfKeyWord; - pEndString = pLook4Word; - while (memcmp(pEndString, URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH) && (pEndString < pLastByteAdd)) { - pEndString++; - } - if (pEndString != pLastByteAdd) { - memcpy(pSMSStruct->PhoneNumber, pLook4Word, pEndString - pLook4Word); - /* add end of string character */ - pSMSStruct->PhoneNumber[pEndString - pLook4Word] = 0; - } - } - pEndString += URI_FIRST_DATA_END_LENGTH; - pLook4Word = pEndString; - - /* check if e-mail subject is present */ - if (!memcmp(pLook4Word, MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH)) { - pEndString += MESSAGE_BEGIN_STRING_LENGTH; - /* Retrieve message */ - memcpy(pSMSStruct->Message, pEndString, PayloadSize - (pEndString - pPayload)); - /* add end of string character */ - pSMSStruct->Message[PayloadSize - (pEndString - pPayload)] = 0; + if (pEndString != pLastByteAdd) { + memcpy(pSMSStruct->PhoneNumber, pLook4Word, pEndString - pLook4Word); + /* add end of string character */ + pSMSStruct->PhoneNumber[pEndString - pLook4Word] = 0; } + } + pEndString += URI_FIRST_DATA_END_LENGTH; + pLook4Word = pEndString; + + /* check if e-mail subject is present */ + if (!memcmp(pLook4Word, MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH)) { + pEndString += MESSAGE_BEGIN_STRING_LENGTH; + /* Retrieve message */ + memcpy(pSMSStruct->Message, pEndString, PayloadSize - (pEndString - pPayload)); + /* add end of string character */ + pSMSStruct->Message[PayloadSize - (pEndString - pPayload)] = 0; + } } /** @@ -114,17 +114,17 @@ void NDEF::NDEF_FillSMSStruct(uint8_t *pPayload, uint32_t PayloadSize, sSMSInfo */ void NDEF::NDEF_ReadURI_SMS(sRecordInfo_t *pRecordStruct, sSMSInfo *pSMSStruct) { - uint8_t *pPayload; - uint32_t PayloadSize; + uint8_t *pPayload; + uint32_t PayloadSize; - PayloadSize = pRecordStruct->PayloadLength; + PayloadSize = pRecordStruct->PayloadLength; - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - if (pRecordStruct->NDEF_Type == URI_SMS_TYPE) { - NDEF_FillSMSStruct(pPayload, PayloadSize, pSMSStruct); - } + if (pRecordStruct->NDEF_Type == URI_SMS_TYPE) { + NDEF_FillSMSStruct(pPayload, PayloadSize, pSMSStruct); + } } @@ -146,37 +146,37 @@ void NDEF::NDEF_ReadURI_SMS(sRecordInfo_t *pRecordStruct, sSMSInfo *pSMSStruct) */ uint16_t NDEF::NDEF_ReadSMS(sRecordInfo_t *pRecordStruct, sSMSInfo *pSMSStruct) { - uint16_t status = NDEF_ERROR; - sRecordInfo_t *pSPRecordStruct; - uint32_t PayloadSize, RecordPosition; - uint8_t *pData; - - if (pRecordStruct->NDEF_Type == URI_SMS_TYPE) { - NDEF_ReadURI_SMS(pRecordStruct, pSMSStruct); + uint16_t status = NDEF_ERROR; + sRecordInfo_t *pSPRecordStruct; + uint32_t PayloadSize, RecordPosition; + uint8_t *pData; + + if (pRecordStruct->NDEF_Type == URI_SMS_TYPE) { + NDEF_ReadURI_SMS(pRecordStruct, pSMSStruct); + status = NDEF_OK; + } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { + for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { + pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; + if (pSPRecordStruct->NDEF_Type == URI_SMS_TYPE) { + NDEF_ReadURI_SMS(pSPRecordStruct, pSMSStruct); status = NDEF_OK; - } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { - for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { - pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; - if (pSPRecordStruct->NDEF_Type == URI_SMS_TYPE) { - NDEF_ReadURI_SMS(pSPRecordStruct, pSMSStruct); - status = NDEF_OK; - } - if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { - PayloadSize = pSPRecordStruct->PayloadLength; - - /* The instruction content the UTF-8 language code that is not used here */ - pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; - PayloadSize -= *pData + 1; /* remove not useful data */ - pData += *pData + 1; /* set pointer on useful data */ - - memcpy(pSMSStruct->Information, pData, PayloadSize); - /* add end of string character */ - pSMSStruct->Information[PayloadSize] = 0; - } - } + } + if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { + PayloadSize = pSPRecordStruct->PayloadLength; + + /* The instruction content the UTF-8 language code that is not used here */ + pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; + PayloadSize -= *pData + 1; /* remove not useful data */ + pData += *pData + 1; /* set pointer on useful data */ + + memcpy(pSMSStruct->Information, pData, PayloadSize); + /* add end of string character */ + pSMSStruct->Information[PayloadSize] = 0; + } } + } - return status; + return status; } /** @@ -191,13 +191,13 @@ uint16_t NDEF::NDEF_ReadSMS(sRecordInfo_t *pRecordStruct, sSMSInfo *pSMSStruct) */ uint16_t NDEF::NDEF_WriteSMS(sSMSInfo *pSMSStruct) { - uint16_t status = NDEF_ERROR, Offset = 0; + uint16_t status = NDEF_ERROR, Offset = 0; - NDEF_PrepareSMSMessage(pSMSStruct, NDEF_Buffer, &Offset); + NDEF_PrepareSMSMessage(pSMSStruct, NDEF_Buffer, &Offset); - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); - return status; + return status; } /** @@ -208,133 +208,133 @@ uint16_t NDEF::NDEF_WriteSMS(sSMSInfo *pSMSStruct) */ void NDEF::NDEF_PrepareSMSMessage(sSMSInfo *pSMSStruct, uint8_t *pNDEFMessage, uint16_t *size) { - uint16_t Offset = 0; - uint32_t smsSize = 0; - uint32_t infoSize = 0; - uint32_t totalSize = 0; - - /* SMS is an URI but can be included in a smart poster to add text to give instruction to user for instance */ - - /* SMS (smart poster) Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* SMS : 1+sms:+tel+1+body=+message */ - smsSize = 1 + SMS_TYPE_STRING_LENGTH + strlen(pSMSStruct->PhoneNumber) + URI_FIRST_DATA_END_LENGTH + - MESSAGE_BEGIN_STRING_LENGTH + strlen(pSMSStruct->Message); - - /* Check if a Smart poster is needed */ - if (pSMSStruct->Information[0] != '\0') { - /* Info : 1+2+info */ - infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pSMSStruct->Information); - /* Total */ - totalSize = 4 + smsSize + 4 + infoSize; - if (smsSize > 255) { - totalSize += 3; /* Normal Email size */ - } - if (infoSize > 255) { - totalSize += 3; /* Normal Info size */ - } - - /* SmartPoster header */ - if (totalSize > 255) { - pNDEFMessage[Offset++] = 0xC1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = totalSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0xD1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)totalSize; - } - memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); - Offset += SMART_POSTER_TYPE_STRING_LENGTH; - } - - /* SMS header */ - pNDEFMessage[Offset] = 0x81; - if (smsSize < 256) { - pNDEFMessage[Offset] |= 0x10; // Set the SR bit + uint16_t Offset = 0; + uint32_t smsSize = 0; + uint32_t infoSize = 0; + uint32_t totalSize = 0; + + /* SMS is an URI but can be included in a smart poster to add text to give instruction to user for instance */ + + /* SMS (smart poster) Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* SMS : 1+sms:+tel+1+body=+message */ + smsSize = 1 + SMS_TYPE_STRING_LENGTH + strlen(pSMSStruct->PhoneNumber) + URI_FIRST_DATA_END_LENGTH + + MESSAGE_BEGIN_STRING_LENGTH + strlen(pSMSStruct->Message); + + /* Check if a Smart poster is needed */ + if (pSMSStruct->Information[0] != '\0') { + /* Info : 1+2+info */ + infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pSMSStruct->Information); + /* Total */ + totalSize = 4 + smsSize + 4 + infoSize; + if (smsSize > 255) { + totalSize += 3; /* Normal Email size */ } - if (pSMSStruct->Information[0] == '\0') { - pNDEFMessage[Offset] |= 0x40; // Set the ME bit + if (infoSize > 255) { + totalSize += 3; /* Normal Info size */ } - Offset++; - pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; - if (smsSize > 255) { - pNDEFMessage[Offset++] = (smsSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (smsSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (smsSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = smsSize & 0x000000FF; + /* SmartPoster header */ + if (totalSize > 255) { + pNDEFMessage[Offset++] = 0xC1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = totalSize & 0x000000FF; } else { - pNDEFMessage[Offset++] = (uint8_t)smsSize; + pNDEFMessage[Offset++] = 0xD1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)totalSize; } - memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); - Offset += URI_TYPE_STRING_LENGTH; - - /* SMS payload */ - pNDEFMessage[Offset++] = URI_ID_0x00; - memcpy(&pNDEFMessage[Offset], SMS_TYPE_STRING, SMS_TYPE_STRING_LENGTH); - Offset += SMS_TYPE_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], pSMSStruct->PhoneNumber, strlen(pSMSStruct->PhoneNumber)); - Offset += strlen(pSMSStruct->PhoneNumber); - memcpy(&pNDEFMessage[Offset], URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH); - Offset += URI_FIRST_DATA_END_LENGTH; - - memcpy(&pNDEFMessage[Offset], MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH); - Offset += MESSAGE_BEGIN_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], pSMSStruct->Message, strlen(pSMSStruct->Message)); - Offset += strlen(pSMSStruct->Message); - - /* Information header */ - if (pSMSStruct->Information[0] != '\0') { - if (infoSize > 255) { - pNDEFMessage[Offset++] = 0x41; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = infoSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0x51; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)infoSize; - } - - memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); - Offset += TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ - memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); - Offset += ISO_ENGLISH_CODE_STRING_LENGTH; - - /* Information payload */ - memcpy(&pNDEFMessage[Offset], pSMSStruct->Information, strlen(pSMSStruct->Information)); - Offset += strlen(pSMSStruct->Information); + memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); + Offset += SMART_POSTER_TYPE_STRING_LENGTH; + } + + /* SMS header */ + pNDEFMessage[Offset] = 0x81; + if (smsSize < 256) { + pNDEFMessage[Offset] |= 0x10; // Set the SR bit + } + if (pSMSStruct->Information[0] == '\0') { + pNDEFMessage[Offset] |= 0x40; // Set the ME bit + } + Offset++; + + pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; + if (smsSize > 255) { + pNDEFMessage[Offset++] = (smsSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (smsSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (smsSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = smsSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = (uint8_t)smsSize; + } + memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); + Offset += URI_TYPE_STRING_LENGTH; + + /* SMS payload */ + pNDEFMessage[Offset++] = URI_ID_0x00; + memcpy(&pNDEFMessage[Offset], SMS_TYPE_STRING, SMS_TYPE_STRING_LENGTH); + Offset += SMS_TYPE_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], pSMSStruct->PhoneNumber, strlen(pSMSStruct->PhoneNumber)); + Offset += strlen(pSMSStruct->PhoneNumber); + memcpy(&pNDEFMessage[Offset], URI_FIRST_DATA_END, URI_FIRST_DATA_END_LENGTH); + Offset += URI_FIRST_DATA_END_LENGTH; + + memcpy(&pNDEFMessage[Offset], MESSAGE_BEGIN_STRING, MESSAGE_BEGIN_STRING_LENGTH); + Offset += MESSAGE_BEGIN_STRING_LENGTH; + memcpy(&pNDEFMessage[Offset], pSMSStruct->Message, strlen(pSMSStruct->Message)); + Offset += strlen(pSMSStruct->Message); + + /* Information header */ + if (pSMSStruct->Information[0] != '\0') { + if (infoSize > 255) { + pNDEFMessage[Offset++] = 0x41; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = infoSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = 0x51; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)infoSize; } - *size = (uint16_t)(Offset); + memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); + Offset += TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ + memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); + Offset += ISO_ENGLISH_CODE_STRING_LENGTH; + + /* Information payload */ + memcpy(&pNDEFMessage[Offset], pSMSStruct->Information, strlen(pSMSStruct->Information)); + Offset += strlen(pSMSStruct->Information); + } + + *size = (uint16_t)(Offset); } diff --git a/src/libNDEF/lib_NDEF_SMS.h b/src/libNDEF/lib_NDEF_SMS.h index 64f2548..2b86ef7 100755 --- a/src/libNDEF/lib_NDEF_SMS.h +++ b/src/libNDEF/lib_NDEF_SMS.h @@ -36,9 +36,9 @@ typedef struct { - char PhoneNumber[SMS_PHONE_MAX_SIZE]; - char Message[SMS_MESSAGE_MAX_SIZE]; - char Information[SMS_INFO_MAX_SIZE]; + char PhoneNumber[SMS_PHONE_MAX_SIZE]; + char Message[SMS_MESSAGE_MAX_SIZE]; + char Information[SMS_INFO_MAX_SIZE]; } sSMSInfo; #endif /* __LIB_NDEF_SMS_H */ diff --git a/src/libNDEF/lib_NDEF_Text.cpp b/src/libNDEF/lib_NDEF_Text.cpp index 3e640d8..4993706 100755 --- a/src/libNDEF/lib_NDEF_Text.cpp +++ b/src/libNDEF/lib_NDEF_Text.cpp @@ -70,45 +70,47 @@ */ uint16_t NDEF::NDEF_WriteText(NDEF_Text_info_t *text_info) { - uint16_t status = NDEF_ERROR; - uint32_t textSize, Offset = 0; - - if(strlen(text_info->language_code) > 10) return status; - - /* TEXT : 1+en+message */ - textSize = 1 + strlen(text_info->language_code) + strlen(text_info->text); - - /* TEXT header */ - NDEF_Buffer[Offset] = 0xC1; - if (textSize < 256) { - NDEF_Buffer[Offset] |= 0x10; // Set the SR bit - } - Offset++; - - NDEF_Buffer[Offset++] = TEXT_TYPE_STRING_LENGTH; - if (textSize > 255) { - NDEF_Buffer[Offset++] = (textSize & 0xFF000000) >> 24; - NDEF_Buffer[Offset++] = (textSize & 0x00FF0000) >> 16; - NDEF_Buffer[Offset++] = (textSize & 0x0000FF00) >> 8; - NDEF_Buffer[Offset++] = textSize & 0x000000FF; - } else { - NDEF_Buffer[Offset++] = (uint8_t)textSize; - } - memcpy(&NDEF_Buffer[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); - Offset += TEXT_TYPE_STRING_LENGTH; - - /* TEXT payload */ - NDEF_Buffer[Offset++] = strlen(text_info->language_code) | text_info->encoding << 7; - - memcpy(&NDEF_Buffer[Offset], text_info->language_code, strlen(text_info->language_code)); - Offset += strlen(text_info->language_code); - - memcpy(&NDEF_Buffer[Offset], text_info->text, strlen(text_info->text)); - Offset += strlen(text_info->text); - - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + uint16_t status = NDEF_ERROR; + uint32_t textSize, Offset = 0; + if (strlen(text_info->language_code) > 10) { return status; + } + + /* TEXT : 1+en+message */ + textSize = 1 + strlen(text_info->language_code) + strlen(text_info->text); + + /* TEXT header */ + NDEF_Buffer[Offset] = 0xC1; + if (textSize < 256) { + NDEF_Buffer[Offset] |= 0x10; // Set the SR bit + } + Offset++; + + NDEF_Buffer[Offset++] = TEXT_TYPE_STRING_LENGTH; + if (textSize > 255) { + NDEF_Buffer[Offset++] = (textSize & 0xFF000000) >> 24; + NDEF_Buffer[Offset++] = (textSize & 0x00FF0000) >> 16; + NDEF_Buffer[Offset++] = (textSize & 0x0000FF00) >> 8; + NDEF_Buffer[Offset++] = textSize & 0x000000FF; + } else { + NDEF_Buffer[Offset++] = (uint8_t)textSize; + } + memcpy(&NDEF_Buffer[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); + Offset += TEXT_TYPE_STRING_LENGTH; + + /* TEXT payload */ + NDEF_Buffer[Offset++] = strlen(text_info->language_code) | text_info->encoding << 7; + + memcpy(&NDEF_Buffer[Offset], text_info->language_code, strlen(text_info->language_code)); + Offset += strlen(text_info->language_code); + + memcpy(&NDEF_Buffer[Offset], text_info->text, strlen(text_info->text)); + Offset += strlen(text_info->text); + + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + + return status; } @@ -122,40 +124,40 @@ uint16_t NDEF::NDEF_WriteText(NDEF_Text_info_t *text_info) */ uint16_t NDEF::NDEF_ReadText(sRecordInfo_t *pRecordStruct, NDEF_Text_info_t *pText) { - uint16_t status = NDEF_ERROR; + uint16_t status = NDEF_ERROR; - if (pRecordStruct->NDEF_Type == TEXT_TYPE) { - /* Get the text metadata (status byte (encoding & language code length) + language code) */ - NDEF_Text_metadata_t *text_record_info = (NDEF_Text_metadata_t *)pRecordStruct->PayloadBufferAdd; + if (pRecordStruct->NDEF_Type == TEXT_TYPE) { + /* Get the text metadata (status byte (encoding & language code length) + language code) */ + NDEF_Text_metadata_t *text_record_info = (NDEF_Text_metadata_t *)pRecordStruct->PayloadBufferAdd; - uint32_t text_length = pRecordStruct->PayloadLength /* record length */ - - text_record_info->language_length /* minus language code length */ - - sizeof(uint8_t); /* minus the status byte length */ + uint32_t text_length = pRecordStruct->PayloadLength /* record length */ + - text_record_info->language_length /* minus language code length */ + - sizeof(uint8_t); /* minus the status byte length */ - if ((text_record_info->language_length >= TEXT_LANGUAGE_CODE_MAX_SIZE) || - (text_length >= TEXT_MAX_SIZE)) { - /* One of the text info structure buffer is too small */ - return NDEF_ERROR_MEMORY_INTERNAL; - } + if ((text_record_info->language_length >= TEXT_LANGUAGE_CODE_MAX_SIZE) || + (text_length >= TEXT_MAX_SIZE)) { + /* One of the text info structure buffer is too small */ + return NDEF_ERROR_MEMORY_INTERNAL; + } - /* Retrieve the encoding */ - pText->encoding = (NDEF_Text_encoding_t)text_record_info->encoding; + /* Retrieve the encoding */ + pText->encoding = (NDEF_Text_encoding_t)text_record_info->encoding; - /* Save the language code string (adding null char at the end) */ - memcpy(&pText->language_code, text_record_info->language, text_record_info->language_length); - pText->language_code[text_record_info->language_length] = '\0'; + /* Save the language code string (adding null char at the end) */ + memcpy(&pText->language_code, text_record_info->language, text_record_info->language_length); + pText->language_code[text_record_info->language_length] = '\0'; - /* Copy the text string itself (adding null char at the end) */ - memcpy(&pText->text, text_record_info->language + text_record_info->language_length, text_length); - pText->text[text_length] = '\0'; + /* Copy the text string itself (adding null char at the end) */ + memcpy(&pText->text, text_record_info->language + text_record_info->language_length, text_length); + pText->text[text_length] = '\0'; - status = NDEF_OK; - } else { - /* Not a text record, exit in error */ - status = NDEF_ERROR; - } + status = NDEF_OK; + } else { + /* Not a text record, exit in error */ + status = NDEF_ERROR; + } - return status; + return status; } /** diff --git a/src/libNDEF/lib_NDEF_Text.h b/src/libNDEF/lib_NDEF_Text.h index 4fe2493..74d6e64 100755 --- a/src/libNDEF/lib_NDEF_Text.h +++ b/src/libNDEF/lib_NDEF_Text.h @@ -36,24 +36,24 @@ /** @brief NDEF Text encoding possible values. */ typedef enum { - NDEF_TEXT_UTF8 = 0, - NDEF_TEXT_UTF16 = 1 + NDEF_TEXT_UTF8 = 0, + NDEF_TEXT_UTF16 = 1 } NDEF_Text_encoding_t; /** @brief This structure is used to handle information from a NDEF Text record. */ typedef struct { - NDEF_Text_encoding_t encoding; /**< metadata: UTF-8 / UTF-16. */ - char language_code[TEXT_LANGUAGE_CODE_MAX_SIZE]; /**< metadata: Language code as specified by IANA. */ - char text[TEXT_MAX_SIZE]; /**< The text itself. */ + NDEF_Text_encoding_t encoding; /**< metadata: UTF-8 / UTF-16. */ + char language_code[TEXT_LANGUAGE_CODE_MAX_SIZE]; /**< metadata: Language code as specified by IANA. */ + char text[TEXT_MAX_SIZE]; /**< The text itself. */ } NDEF_Text_info_t; /** @brief This structure is used to parse the raw data from a text record and access its metadata. */ typedef struct { - uint8_t language_length: 4; /**< Language code length. */ - uint8_t rfu: 3; /**< reserved for futur usage */ - uint8_t encoding: 1; /**< UTF-8 (0) or UTF-16 (1) encoding. */ - char language[1]; /**< IANA language code. */ + uint8_t language_length: 4; /**< Language code length. */ + uint8_t rfu: 3; /**< reserved for futur usage */ + uint8_t encoding: 1; /**< UTF-8 (0) or UTF-16 (1) encoding. */ + char language[1]; /**< IANA language code. */ } NDEF_Text_metadata_t; #endif /* __LIB_NDEF_TEXT_H */ diff --git a/src/libNDEF/lib_NDEF_URI.cpp b/src/libNDEF/lib_NDEF_URI.cpp index 67630f9..4e7c796 100755 --- a/src/libNDEF/lib_NDEF_URI.cpp +++ b/src/libNDEF/lib_NDEF_URI.cpp @@ -60,203 +60,203 @@ */ void NDEF::NDEF_Parse_WellKnowType(sRecordInfo_t *pRecordStruct, sURI_Info *pURI) { - uint32_t PayloadSize; - uint8_t Offset; - uint8_t *pPayload; + uint32_t PayloadSize; + uint8_t Offset; + uint8_t *pPayload; - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - switch (*pPayload) { + switch (*pPayload) { case URI_ID_0x01: - memcpy(pURI->protocol, URI_ID_0x01_STRING, strlen(URI_ID_0x01_STRING)); - Offset = strlen(URI_ID_0x01_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x01_STRING, strlen(URI_ID_0x01_STRING)); + Offset = strlen(URI_ID_0x01_STRING); + break; case URI_ID_0x02: - memcpy(pURI->protocol, URI_ID_0x02_STRING, strlen(URI_ID_0x02_STRING)); - Offset = strlen(URI_ID_0x02_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x02_STRING, strlen(URI_ID_0x02_STRING)); + Offset = strlen(URI_ID_0x02_STRING); + break; case URI_ID_0x03: - memcpy(pURI->protocol, URI_ID_0x03_STRING, strlen(URI_ID_0x03_STRING)); - Offset = strlen(URI_ID_0x03_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x03_STRING, strlen(URI_ID_0x03_STRING)); + Offset = strlen(URI_ID_0x03_STRING); + break; case URI_ID_0x04: - memcpy(pURI->protocol, URI_ID_0x04_STRING, strlen(URI_ID_0x04_STRING)); - Offset = strlen(URI_ID_0x04_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x04_STRING, strlen(URI_ID_0x04_STRING)); + Offset = strlen(URI_ID_0x04_STRING); + break; case URI_ID_0x05: - memcpy(pURI->protocol, URI_ID_0x05_STRING, strlen(URI_ID_0x05_STRING)); - Offset = strlen(URI_ID_0x05_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x05_STRING, strlen(URI_ID_0x05_STRING)); + Offset = strlen(URI_ID_0x05_STRING); + break; case URI_ID_0x06: - memcpy(pURI->protocol, URI_ID_0x06_STRING, strlen(URI_ID_0x06_STRING)); - Offset = strlen(URI_ID_0x06_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x06_STRING, strlen(URI_ID_0x06_STRING)); + Offset = strlen(URI_ID_0x06_STRING); + break; case URI_ID_0x07: - memcpy(pURI->protocol, URI_ID_0x07_STRING, strlen(URI_ID_0x07_STRING)); - Offset = strlen(URI_ID_0x07_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x07_STRING, strlen(URI_ID_0x07_STRING)); + Offset = strlen(URI_ID_0x07_STRING); + break; case URI_ID_0x08: - memcpy(pURI->protocol, URI_ID_0x08_STRING, strlen(URI_ID_0x08_STRING)); - Offset = strlen(URI_ID_0x08_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x08_STRING, strlen(URI_ID_0x08_STRING)); + Offset = strlen(URI_ID_0x08_STRING); + break; case URI_ID_0x09: - memcpy(pURI->protocol, URI_ID_0x09_STRING, strlen(URI_ID_0x09_STRING)); - Offset = strlen(URI_ID_0x09_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x09_STRING, strlen(URI_ID_0x09_STRING)); + Offset = strlen(URI_ID_0x09_STRING); + break; case URI_ID_0x0A: - memcpy(pURI->protocol, URI_ID_0x0A_STRING, strlen(URI_ID_0x0A_STRING)); - Offset = strlen(URI_ID_0x0A_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0A_STRING, strlen(URI_ID_0x0A_STRING)); + Offset = strlen(URI_ID_0x0A_STRING); + break; case URI_ID_0x0B: - memcpy(pURI->protocol, URI_ID_0x0B_STRING, strlen(URI_ID_0x0B_STRING)); - Offset = strlen(URI_ID_0x0B_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0B_STRING, strlen(URI_ID_0x0B_STRING)); + Offset = strlen(URI_ID_0x0B_STRING); + break; case URI_ID_0x0C: - memcpy(pURI->protocol, URI_ID_0x0C_STRING, strlen(URI_ID_0x0C_STRING)); - Offset = strlen(URI_ID_0x0C_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0C_STRING, strlen(URI_ID_0x0C_STRING)); + Offset = strlen(URI_ID_0x0C_STRING); + break; case URI_ID_0x0D: - memcpy(pURI->protocol, URI_ID_0x0D_STRING, strlen(URI_ID_0x0D_STRING)); - Offset = strlen(URI_ID_0x0D_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0D_STRING, strlen(URI_ID_0x0D_STRING)); + Offset = strlen(URI_ID_0x0D_STRING); + break; case URI_ID_0x0E: - memcpy(pURI->protocol, URI_ID_0x0E_STRING, strlen(URI_ID_0x0E_STRING)); - Offset = strlen(URI_ID_0x0E_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0E_STRING, strlen(URI_ID_0x0E_STRING)); + Offset = strlen(URI_ID_0x0E_STRING); + break; case URI_ID_0x0F: - memcpy(pURI->protocol, URI_ID_0x0F_STRING, strlen(URI_ID_0x0F_STRING)); - Offset = strlen(URI_ID_0x0F_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x0F_STRING, strlen(URI_ID_0x0F_STRING)); + Offset = strlen(URI_ID_0x0F_STRING); + break; case URI_ID_0x10: - memcpy(pURI->protocol, URI_ID_0x10_STRING, strlen(URI_ID_0x10_STRING)); - Offset = strlen(URI_ID_0x10_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x10_STRING, strlen(URI_ID_0x10_STRING)); + Offset = strlen(URI_ID_0x10_STRING); + break; case URI_ID_0x11: - memcpy(pURI->protocol, URI_ID_0x11_STRING, strlen(URI_ID_0x11_STRING)); - Offset = strlen(URI_ID_0x11_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x11_STRING, strlen(URI_ID_0x11_STRING)); + Offset = strlen(URI_ID_0x11_STRING); + break; case URI_ID_0x12: - memcpy(pURI->protocol, URI_ID_0x12_STRING, strlen(URI_ID_0x12_STRING)); - Offset = strlen(URI_ID_0x12_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x12_STRING, strlen(URI_ID_0x12_STRING)); + Offset = strlen(URI_ID_0x12_STRING); + break; case URI_ID_0x13: - memcpy(pURI->protocol, URI_ID_0x13_STRING, strlen(URI_ID_0x13_STRING)); - Offset = strlen(URI_ID_0x13_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x13_STRING, strlen(URI_ID_0x13_STRING)); + Offset = strlen(URI_ID_0x13_STRING); + break; case URI_ID_0x14: - memcpy(pURI->protocol, URI_ID_0x14_STRING, strlen(URI_ID_0x14_STRING)); - Offset = strlen(URI_ID_0x14_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x14_STRING, strlen(URI_ID_0x14_STRING)); + Offset = strlen(URI_ID_0x14_STRING); + break; case URI_ID_0x15: - memcpy(pURI->protocol, URI_ID_0x15_STRING, strlen(URI_ID_0x15_STRING)); - Offset = strlen(URI_ID_0x15_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x15_STRING, strlen(URI_ID_0x15_STRING)); + Offset = strlen(URI_ID_0x15_STRING); + break; case URI_ID_0x16: - memcpy(pURI->protocol, URI_ID_0x16_STRING, strlen(URI_ID_0x16_STRING)); - Offset = strlen(URI_ID_0x16_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x16_STRING, strlen(URI_ID_0x16_STRING)); + Offset = strlen(URI_ID_0x16_STRING); + break; case URI_ID_0x17: - memcpy(pURI->protocol, URI_ID_0x17_STRING, strlen(URI_ID_0x17_STRING)); - Offset = strlen(URI_ID_0x17_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x17_STRING, strlen(URI_ID_0x17_STRING)); + Offset = strlen(URI_ID_0x17_STRING); + break; case URI_ID_0x18: - memcpy(pURI->protocol, URI_ID_0x18_STRING, strlen(URI_ID_0x18_STRING)); - Offset = strlen(URI_ID_0x18_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x18_STRING, strlen(URI_ID_0x18_STRING)); + Offset = strlen(URI_ID_0x18_STRING); + break; case URI_ID_0x19: - memcpy(pURI->protocol, URI_ID_0x19_STRING, strlen(URI_ID_0x19_STRING)); - Offset = strlen(URI_ID_0x19_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x19_STRING, strlen(URI_ID_0x19_STRING)); + Offset = strlen(URI_ID_0x19_STRING); + break; case URI_ID_0x1A: - memcpy(pURI->protocol, URI_ID_0x1A_STRING, strlen(URI_ID_0x1A_STRING)); - Offset = strlen(URI_ID_0x1A_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1A_STRING, strlen(URI_ID_0x1A_STRING)); + Offset = strlen(URI_ID_0x1A_STRING); + break; case URI_ID_0x1B: - memcpy(pURI->protocol, URI_ID_0x1B_STRING, strlen(URI_ID_0x1B_STRING)); - Offset = strlen(URI_ID_0x1B_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1B_STRING, strlen(URI_ID_0x1B_STRING)); + Offset = strlen(URI_ID_0x1B_STRING); + break; case URI_ID_0x1C: - memcpy(pURI->protocol, URI_ID_0x1C_STRING, strlen(URI_ID_0x1C_STRING)); - Offset = strlen(URI_ID_0x1C_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1C_STRING, strlen(URI_ID_0x1C_STRING)); + Offset = strlen(URI_ID_0x1C_STRING); + break; case URI_ID_0x1D: - memcpy(pURI->protocol, URI_ID_0x1D_STRING, strlen(URI_ID_0x1D_STRING)); - Offset = strlen(URI_ID_0x1D_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1D_STRING, strlen(URI_ID_0x1D_STRING)); + Offset = strlen(URI_ID_0x1D_STRING); + break; case URI_ID_0x1E: - memcpy(pURI->protocol, URI_ID_0x1E_STRING, strlen(URI_ID_0x1E_STRING)); - Offset = strlen(URI_ID_0x1E_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1E_STRING, strlen(URI_ID_0x1E_STRING)); + Offset = strlen(URI_ID_0x1E_STRING); + break; case URI_ID_0x1F: - memcpy(pURI->protocol, URI_ID_0x1F_STRING, strlen(URI_ID_0x1F_STRING)); - Offset = strlen(URI_ID_0x1F_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x1F_STRING, strlen(URI_ID_0x1F_STRING)); + Offset = strlen(URI_ID_0x1F_STRING); + break; case URI_ID_0x20: - memcpy(pURI->protocol, URI_ID_0x20_STRING, strlen(URI_ID_0x20_STRING)); - Offset = strlen(URI_ID_0x20_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x20_STRING, strlen(URI_ID_0x20_STRING)); + Offset = strlen(URI_ID_0x20_STRING); + break; case URI_ID_0x21: - memcpy(pURI->protocol, URI_ID_0x21_STRING, strlen(URI_ID_0x21_STRING)); - Offset = strlen(URI_ID_0x21_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x21_STRING, strlen(URI_ID_0x21_STRING)); + Offset = strlen(URI_ID_0x21_STRING); + break; case URI_ID_0x22: - memcpy(pURI->protocol, URI_ID_0x22_STRING, strlen(URI_ID_0x22_STRING)); - Offset = strlen(URI_ID_0x22_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x22_STRING, strlen(URI_ID_0x22_STRING)); + Offset = strlen(URI_ID_0x22_STRING); + break; case URI_ID_0x23: - memcpy(pURI->protocol, URI_ID_0x23_STRING, strlen(URI_ID_0x23_STRING)); - Offset = strlen(URI_ID_0x23_STRING); - break; + memcpy(pURI->protocol, URI_ID_0x23_STRING, strlen(URI_ID_0x23_STRING)); + Offset = strlen(URI_ID_0x23_STRING); + break; default: - Offset = 0; - /* Should not happened */ - break; - } - /* add end of string character */ - pURI->protocol[Offset] = '\0'; + Offset = 0; + /* Should not happened */ + break; + } + /* add end of string character */ + pURI->protocol[Offset] = '\0'; - pPayload++; /* go after well know byte */ + pPayload++; /* go after well know byte */ - PayloadSize = pRecordStruct->PayloadLength; + PayloadSize = pRecordStruct->PayloadLength; - PayloadSize = PayloadSize - 1; /* remove well know byte */ + PayloadSize = PayloadSize - 1; /* remove well know byte */ - memcpy(pURI->URI_Message, pPayload, PayloadSize); - /* add end of string character */ - pURI->URI_Message[PayloadSize] = '\0'; + memcpy(pURI->URI_Message, pPayload, PayloadSize); + /* add end of string character */ + pURI->URI_Message[PayloadSize] = '\0'; } @@ -278,40 +278,40 @@ void NDEF::NDEF_Parse_WellKnowType(sRecordInfo_t *pRecordStruct, sURI_Info *pURI */ uint16_t NDEF::NDEF_ReadURI(sRecordInfo_t *pRecordStruct, sURI_Info *pURI) { - uint16_t status = NDEF_ERROR; - sRecordInfo_t *pSPRecordStruct; - uint32_t PayloadSize, RecordPosition; - uint8_t *pData; - - if (pRecordStruct->NDEF_Type == UNABRIDGED_URI_TYPE) { - NDEF_Parse_WellKnowType(pRecordStruct, pURI); + uint16_t status = NDEF_ERROR; + sRecordInfo_t *pSPRecordStruct; + uint32_t PayloadSize, RecordPosition; + uint8_t *pData; + + if (pRecordStruct->NDEF_Type == UNABRIDGED_URI_TYPE) { + NDEF_Parse_WellKnowType(pRecordStruct, pURI); + status = NDEF_OK; + } else if (pRecordStruct->NDEF_Type == WELL_KNOWN_ABRIDGED_URI_TYPE) { + NDEF_Parse_WellKnowType(pRecordStruct, pURI); + status = NDEF_OK; + } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { + for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { + pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; + if (pSPRecordStruct->NDEF_Type == WELL_KNOWN_ABRIDGED_URI_TYPE) { + NDEF_Parse_WellKnowType(pSPRecordStruct, pURI); status = NDEF_OK; - } else if (pRecordStruct->NDEF_Type == WELL_KNOWN_ABRIDGED_URI_TYPE) { - NDEF_Parse_WellKnowType(pRecordStruct, pURI); - status = NDEF_OK; - } else if (pRecordStruct->NDEF_Type == SMARTPOSTER_TYPE) { - for (RecordPosition = 0; RecordPosition < pRecordStruct->NbOfRecordInSPPayload; RecordPosition++) { - pSPRecordStruct = pRecordStruct->SPRecordStructAdd[RecordPosition]; - if (pSPRecordStruct->NDEF_Type == WELL_KNOWN_ABRIDGED_URI_TYPE) { - NDEF_Parse_WellKnowType(pSPRecordStruct, pURI); - status = NDEF_OK; - } - if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { - PayloadSize = pSPRecordStruct->PayloadLength; - - /* The instruction content the UTF-8 language code that is not used here */ - pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; - PayloadSize -= *pData + 1; /* remove not useful data */ - pData += *pData + 1; - - memcpy(pURI->Information, pData, PayloadSize); - } - } - } else { - status = NDEF_ERROR; + } + if (pSPRecordStruct->NDEF_Type == TEXT_TYPE) { + PayloadSize = pSPRecordStruct->PayloadLength; + + /* The instruction content the UTF-8 language code that is not used here */ + pData = (uint8_t *)pSPRecordStruct->PayloadBufferAdd; + PayloadSize -= *pData + 1; /* remove not useful data */ + pData += *pData + 1; + + memcpy(pURI->Information, pData, PayloadSize); + } } + } else { + status = NDEF_ERROR; + } - return status; + return status; } /** @@ -322,133 +322,133 @@ uint16_t NDEF::NDEF_ReadURI(sRecordInfo_t *pRecordStruct, sURI_Info *pURI) */ void NDEF::NDEF_PrepareURIMessage(sURI_Info *pURI, uint8_t *pNDEFMessage, uint16_t *size) { - uint32_t uriSize, totalSize, Offset = 0; - uint32_t infoSize = 0; - char type; - - /* An URI can be included in a smart poster to add text to give instruction to user for instance */ - - /* URI (smart poster) Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* We need to know the URI type in order to define if an abbreviation is available */ - type = getUriType(pURI->protocol); - - /* URI : 1+URI for abbreviate protocol*/ - if (type != URI_ID_0x00) { - uriSize = 1 + strlen(pURI->URI_Message); - } else { /*: 1+protocol+URI else*/ - uriSize = 1 + strlen(pURI->protocol) + strlen(pURI->URI_Message); + uint32_t uriSize, totalSize, Offset = 0; + uint32_t infoSize = 0; + char type; + + /* An URI can be included in a smart poster to add text to give instruction to user for instance */ + + /* URI (smart poster) Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=1 TNF=1 NFC Forum Well-known type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ /* <---- Used only if SR=0 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* We need to know the URI type in order to define if an abbreviation is available */ + type = getUriType(pURI->protocol); + + /* URI : 1+URI for abbreviate protocol*/ + if (type != URI_ID_0x00) { + uriSize = 1 + strlen(pURI->URI_Message); + } else { /*: 1+protocol+URI else*/ + uriSize = 1 + strlen(pURI->protocol) + strlen(pURI->URI_Message); + } + + /* Check if a Smart poster is needed */ + if (pURI->Information[0] != '\0') { + /* Info : 1+2+info */ + infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pURI->Information); + /* Total */ + totalSize = 4 + uriSize + 4 + infoSize; + if (uriSize > 255) { + totalSize += 3; /* Normal URI size */ } - - /* Check if a Smart poster is needed */ - if (pURI->Information[0] != '\0') { - /* Info : 1+2+info */ - infoSize = 1 + ISO_ENGLISH_CODE_STRING_LENGTH + strlen(pURI->Information); - /* Total */ - totalSize = 4 + uriSize + 4 + infoSize; - if (uriSize > 255) { - totalSize += 3; /* Normal URI size */ - } - if (infoSize > 255) { - totalSize += 3; /* Normal Info size */ - } - - /* SmartPoster header */ - if (totalSize > 255) { - pNDEFMessage[Offset++] = 0xC1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = totalSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0xD1; - pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)totalSize; - } - memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); - Offset += SMART_POSTER_TYPE_STRING_LENGTH; + if (infoSize > 255) { + totalSize += 3; /* Normal Info size */ } - /* URI header */ - pNDEFMessage[Offset] = 0x81; - if (uriSize < 256) { - pNDEFMessage[Offset] |= 0x10; // Set the SR bit - } - if (pURI->Information[0] == '\0') { - pNDEFMessage[Offset] |= 0x40; // Set the ME bit + /* SmartPoster header */ + if (totalSize > 255) { + pNDEFMessage[Offset++] = 0xC1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (totalSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (totalSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (totalSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = totalSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = 0xD1; + pNDEFMessage[Offset++] = SMART_POSTER_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)totalSize; } - Offset++; - - pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; - if (uriSize > 255) { - pNDEFMessage[Offset++] = (uriSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (uriSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (uriSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = uriSize & 0x000000FF; + memcpy(&pNDEFMessage[Offset], SMART_POSTER_TYPE_STRING, SMART_POSTER_TYPE_STRING_LENGTH); + Offset += SMART_POSTER_TYPE_STRING_LENGTH; + } + + /* URI header */ + pNDEFMessage[Offset] = 0x81; + if (uriSize < 256) { + pNDEFMessage[Offset] |= 0x10; // Set the SR bit + } + if (pURI->Information[0] == '\0') { + pNDEFMessage[Offset] |= 0x40; // Set the ME bit + } + Offset++; + + pNDEFMessage[Offset++] = URI_TYPE_STRING_LENGTH; + if (uriSize > 255) { + pNDEFMessage[Offset++] = (uriSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (uriSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (uriSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = uriSize & 0x000000FF; + } else { + pNDEFMessage[Offset++] = (uint8_t)uriSize; + } + memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); + Offset += URI_TYPE_STRING_LENGTH; + + pNDEFMessage[Offset++] = type; + if (type == URI_ID_0x00) { // No abbreviation + memcpy(&pNDEFMessage[Offset], pURI->protocol, strlen(pURI->protocol)); + Offset += strlen(pURI->protocol); + } + + memcpy(&pNDEFMessage[Offset], pURI->URI_Message, strlen(pURI->URI_Message)); + Offset += strlen(pURI->URI_Message); + + /* Information header */ + if (pURI->Information[0] != '\0') { + if (infoSize > 255) { + pNDEFMessage[Offset++] = 0x41; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; + pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; + pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; + pNDEFMessage[Offset++] = infoSize & 0x000000FF; } else { - pNDEFMessage[Offset++] = (uint8_t)uriSize; + pNDEFMessage[Offset++] = 0x51; + pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = (uint8_t)infoSize; } - memcpy(&pNDEFMessage[Offset], URI_TYPE_STRING, URI_TYPE_STRING_LENGTH); - Offset += URI_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = type; - if (type == URI_ID_0x00) { // No abbreviation - memcpy(&pNDEFMessage[Offset], pURI->protocol, strlen(pURI->protocol)); - Offset += strlen(pURI->protocol); - } + memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); + Offset += TEXT_TYPE_STRING_LENGTH; + pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ + memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); + Offset += ISO_ENGLISH_CODE_STRING_LENGTH; - memcpy(&pNDEFMessage[Offset], pURI->URI_Message, strlen(pURI->URI_Message)); - Offset += strlen(pURI->URI_Message); - - /* Information header */ - if (pURI->Information[0] != '\0') { - if (infoSize > 255) { - pNDEFMessage[Offset++] = 0x41; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (infoSize & 0xFF000000) >> 24; - pNDEFMessage[Offset++] = (infoSize & 0x00FF0000) >> 16; - pNDEFMessage[Offset++] = (infoSize & 0x0000FF00) >> 8; - pNDEFMessage[Offset++] = infoSize & 0x000000FF; - } else { - pNDEFMessage[Offset++] = 0x51; - pNDEFMessage[Offset++] = TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = (uint8_t)infoSize; - } - - memcpy(&pNDEFMessage[Offset], TEXT_TYPE_STRING, TEXT_TYPE_STRING_LENGTH); - Offset += TEXT_TYPE_STRING_LENGTH; - pNDEFMessage[Offset++] = ISO_ENGLISH_CODE_STRING_LENGTH; /* UTF-8 with x byte language code */ - memcpy(&pNDEFMessage[Offset], ISO_ENGLISH_CODE_STRING, ISO_ENGLISH_CODE_STRING_LENGTH); - Offset += ISO_ENGLISH_CODE_STRING_LENGTH; - - /* Information payload */ - memcpy(&pNDEFMessage[Offset], pURI->Information, strlen(pURI->Information)); - Offset += strlen(pURI->Information); - } + /* Information payload */ + memcpy(&pNDEFMessage[Offset], pURI->Information, strlen(pURI->Information)); + Offset += strlen(pURI->Information); + } - *size = Offset; + *size = Offset; } /** @@ -463,90 +463,90 @@ void NDEF::NDEF_PrepareURIMessage(sURI_Info *pURI, uint8_t *pNDEFMessage, uint16 */ uint16_t NDEF::NDEF_WriteURI(sURI_Info *pURI) { - uint16_t status = NDEF_ERROR, Offset = 0; + uint16_t status = NDEF_ERROR, Offset = 0; - NDEF_PrepareURIMessage(pURI, NDEF_Buffer, &Offset); + NDEF_PrepareURIMessage(pURI, NDEF_Buffer, &Offset); - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); - return status; + return status; } char NDEF::getUriType(char *protocol) { - if (!memcmp(protocol, URI_ID_0x01_STRING, strlen(URI_ID_0x01_STRING))) { - return URI_ID_0x01; - } else if (!memcmp(protocol, URI_ID_0x02_STRING, strlen(URI_ID_0x02_STRING))) { - return URI_ID_0x02; - } else if (!memcmp(protocol, URI_ID_0x03_STRING, strlen(URI_ID_0x03_STRING))) { - return URI_ID_0x03; - } else if (!memcmp(protocol, URI_ID_0x04_STRING, strlen(URI_ID_0x04_STRING))) { - return URI_ID_0x04; - } else if (!memcmp(protocol, URI_ID_0x05_STRING, strlen(URI_ID_0x05_STRING))) { - return URI_ID_0x05; - } else if (!memcmp(protocol, URI_ID_0x06_STRING, strlen(URI_ID_0x06_STRING))) { - return URI_ID_0x06; - } else if (!memcmp(protocol, URI_ID_0x07_STRING, strlen(URI_ID_0x07_STRING))) { - return URI_ID_0x07; - } else if (!memcmp(protocol, URI_ID_0x08_STRING, strlen(URI_ID_0x08_STRING))) { - return URI_ID_0x08; - } else if (!memcmp(protocol, URI_ID_0x09_STRING, strlen(URI_ID_0x09_STRING))) { - return URI_ID_0x09; - } else if (!memcmp(protocol, URI_ID_0x0A_STRING, strlen(URI_ID_0x0A_STRING))) { - return URI_ID_0x0A; - } else if (!memcmp(protocol, URI_ID_0x0B_STRING, strlen(URI_ID_0x0B_STRING))) { - return URI_ID_0x0B; - } else if (!memcmp(protocol, URI_ID_0x0C_STRING, strlen(URI_ID_0x0C_STRING))) { - return URI_ID_0x0C; - } else if (!memcmp(protocol, URI_ID_0x0D_STRING, strlen(URI_ID_0x0D_STRING))) { - return URI_ID_0x0D; - } else if (!memcmp(protocol, URI_ID_0x0E_STRING, strlen(URI_ID_0x0E_STRING))) { - return URI_ID_0x0E; - } else if (!memcmp(protocol, URI_ID_0x0F_STRING, strlen(URI_ID_0x0F_STRING))) { - return URI_ID_0x0F; - } else if (!memcmp(protocol, URI_ID_0x10_STRING, strlen(URI_ID_0x10_STRING))) { - return URI_ID_0x10; - } else if (!memcmp(protocol, URI_ID_0x11_STRING, strlen(URI_ID_0x11_STRING))) { - return URI_ID_0x11; - } else if (!memcmp(protocol, URI_ID_0x12_STRING, strlen(URI_ID_0x12_STRING))) { - return URI_ID_0x12; - } else if (!memcmp(protocol, URI_ID_0x13_STRING, strlen(URI_ID_0x13_STRING))) { - return URI_ID_0x13; - } else if (!memcmp(protocol, URI_ID_0x14_STRING, strlen(URI_ID_0x14_STRING))) { - return URI_ID_0x14; - } else if (!memcmp(protocol, URI_ID_0x15_STRING, strlen(URI_ID_0x15_STRING))) { - return URI_ID_0x15; - } else if (!memcmp(protocol, URI_ID_0x16_STRING, strlen(URI_ID_0x16_STRING))) { - return URI_ID_0x16; - } else if (!memcmp(protocol, URI_ID_0x17_STRING, strlen(URI_ID_0x17_STRING))) { - return URI_ID_0x17; - } else if (!memcmp(protocol, URI_ID_0x18_STRING, strlen(URI_ID_0x18_STRING))) { - return URI_ID_0x18; - } else if (!memcmp(protocol, URI_ID_0x19_STRING, strlen(URI_ID_0x19_STRING))) { - return URI_ID_0x19; - } else if (!memcmp(protocol, URI_ID_0x1A_STRING, strlen(URI_ID_0x1A_STRING))) { - return URI_ID_0x1A; - } else if (!memcmp(protocol, URI_ID_0x1B_STRING, strlen(URI_ID_0x1B_STRING))) { - return URI_ID_0x1B; - } else if (!memcmp(protocol, URI_ID_0x1C_STRING, strlen(URI_ID_0x1C_STRING))) { - return URI_ID_0x1C; - } else if (!memcmp(protocol, URI_ID_0x1D_STRING, strlen(URI_ID_0x1D_STRING))) { - return URI_ID_0x1D; - } else if (!memcmp(protocol, URI_ID_0x1E_STRING, strlen(URI_ID_0x1E_STRING))) { - return URI_ID_0x1E; - } else if (!memcmp(protocol, URI_ID_0x1F_STRING, strlen(URI_ID_0x1F_STRING))) { - return URI_ID_0x1F; - } else if (!memcmp(protocol, URI_ID_0x20_STRING, strlen(URI_ID_0x20_STRING))) { - return URI_ID_0x20; - } else if (!memcmp(protocol, URI_ID_0x21_STRING, strlen(URI_ID_0x21_STRING))) { - return URI_ID_0x21; - } else if (!memcmp(protocol, URI_ID_0x22_STRING, strlen(URI_ID_0x22_STRING))) { - return URI_ID_0x22; - } else if (!memcmp(protocol, URI_ID_0x23_STRING, strlen(URI_ID_0x23_STRING))) { - return URI_ID_0x23; - } else { - return URI_ID_0x00; // No abbreviation for this protocol - } + if (!memcmp(protocol, URI_ID_0x01_STRING, strlen(URI_ID_0x01_STRING))) { + return URI_ID_0x01; + } else if (!memcmp(protocol, URI_ID_0x02_STRING, strlen(URI_ID_0x02_STRING))) { + return URI_ID_0x02; + } else if (!memcmp(protocol, URI_ID_0x03_STRING, strlen(URI_ID_0x03_STRING))) { + return URI_ID_0x03; + } else if (!memcmp(protocol, URI_ID_0x04_STRING, strlen(URI_ID_0x04_STRING))) { + return URI_ID_0x04; + } else if (!memcmp(protocol, URI_ID_0x05_STRING, strlen(URI_ID_0x05_STRING))) { + return URI_ID_0x05; + } else if (!memcmp(protocol, URI_ID_0x06_STRING, strlen(URI_ID_0x06_STRING))) { + return URI_ID_0x06; + } else if (!memcmp(protocol, URI_ID_0x07_STRING, strlen(URI_ID_0x07_STRING))) { + return URI_ID_0x07; + } else if (!memcmp(protocol, URI_ID_0x08_STRING, strlen(URI_ID_0x08_STRING))) { + return URI_ID_0x08; + } else if (!memcmp(protocol, URI_ID_0x09_STRING, strlen(URI_ID_0x09_STRING))) { + return URI_ID_0x09; + } else if (!memcmp(protocol, URI_ID_0x0A_STRING, strlen(URI_ID_0x0A_STRING))) { + return URI_ID_0x0A; + } else if (!memcmp(protocol, URI_ID_0x0B_STRING, strlen(URI_ID_0x0B_STRING))) { + return URI_ID_0x0B; + } else if (!memcmp(protocol, URI_ID_0x0C_STRING, strlen(URI_ID_0x0C_STRING))) { + return URI_ID_0x0C; + } else if (!memcmp(protocol, URI_ID_0x0D_STRING, strlen(URI_ID_0x0D_STRING))) { + return URI_ID_0x0D; + } else if (!memcmp(protocol, URI_ID_0x0E_STRING, strlen(URI_ID_0x0E_STRING))) { + return URI_ID_0x0E; + } else if (!memcmp(protocol, URI_ID_0x0F_STRING, strlen(URI_ID_0x0F_STRING))) { + return URI_ID_0x0F; + } else if (!memcmp(protocol, URI_ID_0x10_STRING, strlen(URI_ID_0x10_STRING))) { + return URI_ID_0x10; + } else if (!memcmp(protocol, URI_ID_0x11_STRING, strlen(URI_ID_0x11_STRING))) { + return URI_ID_0x11; + } else if (!memcmp(protocol, URI_ID_0x12_STRING, strlen(URI_ID_0x12_STRING))) { + return URI_ID_0x12; + } else if (!memcmp(protocol, URI_ID_0x13_STRING, strlen(URI_ID_0x13_STRING))) { + return URI_ID_0x13; + } else if (!memcmp(protocol, URI_ID_0x14_STRING, strlen(URI_ID_0x14_STRING))) { + return URI_ID_0x14; + } else if (!memcmp(protocol, URI_ID_0x15_STRING, strlen(URI_ID_0x15_STRING))) { + return URI_ID_0x15; + } else if (!memcmp(protocol, URI_ID_0x16_STRING, strlen(URI_ID_0x16_STRING))) { + return URI_ID_0x16; + } else if (!memcmp(protocol, URI_ID_0x17_STRING, strlen(URI_ID_0x17_STRING))) { + return URI_ID_0x17; + } else if (!memcmp(protocol, URI_ID_0x18_STRING, strlen(URI_ID_0x18_STRING))) { + return URI_ID_0x18; + } else if (!memcmp(protocol, URI_ID_0x19_STRING, strlen(URI_ID_0x19_STRING))) { + return URI_ID_0x19; + } else if (!memcmp(protocol, URI_ID_0x1A_STRING, strlen(URI_ID_0x1A_STRING))) { + return URI_ID_0x1A; + } else if (!memcmp(protocol, URI_ID_0x1B_STRING, strlen(URI_ID_0x1B_STRING))) { + return URI_ID_0x1B; + } else if (!memcmp(protocol, URI_ID_0x1C_STRING, strlen(URI_ID_0x1C_STRING))) { + return URI_ID_0x1C; + } else if (!memcmp(protocol, URI_ID_0x1D_STRING, strlen(URI_ID_0x1D_STRING))) { + return URI_ID_0x1D; + } else if (!memcmp(protocol, URI_ID_0x1E_STRING, strlen(URI_ID_0x1E_STRING))) { + return URI_ID_0x1E; + } else if (!memcmp(protocol, URI_ID_0x1F_STRING, strlen(URI_ID_0x1F_STRING))) { + return URI_ID_0x1F; + } else if (!memcmp(protocol, URI_ID_0x20_STRING, strlen(URI_ID_0x20_STRING))) { + return URI_ID_0x20; + } else if (!memcmp(protocol, URI_ID_0x21_STRING, strlen(URI_ID_0x21_STRING))) { + return URI_ID_0x21; + } else if (!memcmp(protocol, URI_ID_0x22_STRING, strlen(URI_ID_0x22_STRING))) { + return URI_ID_0x22; + } else if (!memcmp(protocol, URI_ID_0x23_STRING, strlen(URI_ID_0x23_STRING))) { + return URI_ID_0x23; + } else { + return URI_ID_0x00; // No abbreviation for this protocol + } } diff --git a/src/libNDEF/lib_NDEF_URI.h b/src/libNDEF/lib_NDEF_URI.h index a96d32a..245eae0 100755 --- a/src/libNDEF/lib_NDEF_URI.h +++ b/src/libNDEF/lib_NDEF_URI.h @@ -35,12 +35,12 @@ #include "lib_NDEF.h" typedef struct { - // char protocol[80]; - // char URI_Message[400]; - // char Information[400]; - char protocol[URI_PROTOCOL_MAX_SIZE]; - char URI_Message[URI_MESSAGE_MAX_SIZE]; - char Information[URI_INFO_MAX_SIZE]; + // char protocol[80]; + // char URI_Message[400]; + // char Information[400]; + char protocol[URI_PROTOCOL_MAX_SIZE]; + char URI_Message[URI_MESSAGE_MAX_SIZE]; + char Information[URI_INFO_MAX_SIZE]; } sURI_Info; #endif /* __LIB_NDEF_URI_H */ diff --git a/src/libNDEF/lib_NDEF_Vcard.cpp b/src/libNDEF/lib_NDEF_Vcard.cpp index 997e121..756c559 100755 --- a/src/libNDEF/lib_NDEF_Vcard.cpp +++ b/src/libNDEF/lib_NDEF_Vcard.cpp @@ -52,37 +52,37 @@ */ void NDEF::NDEF_FillVcardStruct(uint8_t *pPayload, uint32_t PayloadSize, const char *pKeyWord, uint32_t SizeOfKeyWord, uint8_t *pString) { - uint8_t *pLastByteAdd, *pLook4Word, *pEndString; - - /* First character force to NULL in case not matching found */ - *pString = 0; - - /* Interesting information are stored before picture if any */ - /* Moreover picture is not used in this demonstration SW */ - pLastByteAdd = pPayload; - while (memcmp(pLastByteAdd, JPEG, JPEG_STRING_SIZE) && (pLastByteAdd < (pPayload + PayloadSize))) { - pLastByteAdd++; - } - - pLook4Word = pPayload; - while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { - pLook4Word++; - } - - /* Word found */ - if (pLook4Word != pLastByteAdd) { - pLook4Word += SizeOfKeyWord; - pEndString = pLook4Word; - while (memcmp(pEndString, LIMIT, LIMIT_STRING_SIZE) && (pEndString < pLastByteAdd)) { - pEndString++; - } - if (pEndString != pLastByteAdd) { - memcpy(pString, pLook4Word, pEndString - pLook4Word); - /* add end of string character */ - pString += pEndString - pLook4Word; - *pString = '\0'; - } - } + uint8_t *pLastByteAdd, *pLook4Word, *pEndString; + + /* First character force to NULL in case not matching found */ + *pString = 0; + + /* Interesting information are stored before picture if any */ + /* Moreover picture is not used in this demonstration SW */ + pLastByteAdd = pPayload; + while (memcmp(pLastByteAdd, JPEG, JPEG_STRING_SIZE) && (pLastByteAdd < (pPayload + PayloadSize))) { + pLastByteAdd++; + } + + pLook4Word = pPayload; + while (memcmp(pLook4Word, pKeyWord, SizeOfKeyWord) && (pLook4Word < pLastByteAdd)) { + pLook4Word++; + } + + /* Word found */ + if (pLook4Word != pLastByteAdd) { + pLook4Word += SizeOfKeyWord; + pEndString = pLook4Word; + while (memcmp(pEndString, LIMIT, LIMIT_STRING_SIZE) && (pEndString < pLastByteAdd)) { + pEndString++; + } + if (pEndString != pLastByteAdd) { + memcpy(pString, pLook4Word, pEndString - pLook4Word); + /* add end of string character */ + pString += pEndString - pLook4Word; + *pString = '\0'; + } + } } /** @@ -92,34 +92,34 @@ void NDEF::NDEF_FillVcardStruct(uint8_t *pPayload, uint32_t PayloadSize, const c */ void NDEF::NDEF_ExtractVcard(sRecordInfo_t *pRecordStruct, sVcardInfo *pVcardStruct) { - uint32_t PayloadSize; - uint8_t *pPayload; - - - PayloadSize = pRecordStruct->PayloadLength; - - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - - NDEF_FillVcardStruct(pPayload, PayloadSize, VERSION, VERSION_STRING_SIZE, (uint8_t *)(pVcardStruct->Version)); - if (!memcmp(pVcardStruct->Version, VCARD_VERSION_2_1, VCARD_VERSION_2_1_SIZE)) { - NDEF_FillVcardStruct(pPayload, PayloadSize, FIRSTNAME, FIRSTNAME_STRING_SIZE, (uint8_t *)(pVcardStruct->FirstName)); - NDEF_FillVcardStruct(pPayload, PayloadSize, TITLE, TITLE_STRING_SIZE, (uint8_t *)(pVcardStruct->Title)); - NDEF_FillVcardStruct(pPayload, PayloadSize, ORG, ORG_STRING_SIZE, (uint8_t *)(pVcardStruct->Org)); - NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_ADDRESS, HOME_ADDRESS_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeAddress)); - NDEF_FillVcardStruct(pPayload, PayloadSize, GEN_ADDRESS, strlen(GEN_ADDRESS), (uint8_t *)(pVcardStruct->Address)); - NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_ADDRESS, WORK_ADDRESS_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkAddress)); - NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_TEL, HOME_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeTel)); - NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_TEL, WORK_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkTel)); - NDEF_FillVcardStruct(pPayload, PayloadSize, CELL_TEL, CELL_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->CellTel)); - NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_EMAIL, HOME_EMAIL_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeEmail)); - NDEF_FillVcardStruct(pPayload, PayloadSize, GEN_EMAIL, strlen(GEN_EMAIL), (uint8_t *)(pVcardStruct->Email)); - NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_EMAIL, WORK_EMAIL_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkEmail)); - } else if (!memcmp(pVcardStruct->Version, VCARD_VERSION_3_0, VCARD_VERSION_3_0_SIZE)) { - /* need to be implemented */ - } else { - /* maybe new version but not supported in this sw */ - } + uint32_t PayloadSize; + uint8_t *pPayload; + + + PayloadSize = pRecordStruct->PayloadLength; + + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + + NDEF_FillVcardStruct(pPayload, PayloadSize, VERSION, VERSION_STRING_SIZE, (uint8_t *)(pVcardStruct->Version)); + if (!memcmp(pVcardStruct->Version, VCARD_VERSION_2_1, VCARD_VERSION_2_1_SIZE)) { + NDEF_FillVcardStruct(pPayload, PayloadSize, FIRSTNAME, FIRSTNAME_STRING_SIZE, (uint8_t *)(pVcardStruct->FirstName)); + NDEF_FillVcardStruct(pPayload, PayloadSize, TITLE, TITLE_STRING_SIZE, (uint8_t *)(pVcardStruct->Title)); + NDEF_FillVcardStruct(pPayload, PayloadSize, ORG, ORG_STRING_SIZE, (uint8_t *)(pVcardStruct->Org)); + NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_ADDRESS, HOME_ADDRESS_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeAddress)); + NDEF_FillVcardStruct(pPayload, PayloadSize, GEN_ADDRESS, strlen(GEN_ADDRESS), (uint8_t *)(pVcardStruct->Address)); + NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_ADDRESS, WORK_ADDRESS_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkAddress)); + NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_TEL, HOME_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeTel)); + NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_TEL, WORK_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkTel)); + NDEF_FillVcardStruct(pPayload, PayloadSize, CELL_TEL, CELL_TEL_STRING_SIZE, (uint8_t *)(pVcardStruct->CellTel)); + NDEF_FillVcardStruct(pPayload, PayloadSize, HOME_EMAIL, HOME_EMAIL_STRING_SIZE, (uint8_t *)(pVcardStruct->HomeEmail)); + NDEF_FillVcardStruct(pPayload, PayloadSize, GEN_EMAIL, strlen(GEN_EMAIL), (uint8_t *)(pVcardStruct->Email)); + NDEF_FillVcardStruct(pPayload, PayloadSize, WORK_EMAIL, WORK_EMAIL_STRING_SIZE, (uint8_t *)(pVcardStruct->WorkEmail)); + } else if (!memcmp(pVcardStruct->Version, VCARD_VERSION_3_0, VCARD_VERSION_3_0_SIZE)) { + /* need to be implemented */ + } else { + /* maybe new version but not supported in this sw */ + } } @@ -132,14 +132,14 @@ void NDEF::NDEF_ExtractVcard(sRecordInfo_t *pRecordStruct, sVcardInfo *pVcardStr */ uint16_t NDEF::NDEF_ReadVcard(sRecordInfo_t *pRecordStruct, sVcardInfo *pVcardStruct) { - uint16_t status = NDEF_ERROR; + uint16_t status = NDEF_ERROR; - if (pRecordStruct->NDEF_Type == VCARD_TYPE) { - NDEF_ExtractVcard(pRecordStruct, pVcardStruct); - status = NDEF_OK; - } + if (pRecordStruct->NDEF_Type == VCARD_TYPE) { + NDEF_ExtractVcard(pRecordStruct, pVcardStruct); + status = NDEF_OK; + } - return status; + return status; } /** @@ -154,13 +154,13 @@ uint16_t NDEF::NDEF_ReadVcard(sRecordInfo_t *pRecordStruct, sVcardInfo *pVcardSt */ uint16_t NDEF::NDEF_WriteVcard(sVcardInfo *pVcardStruct) { - uint16_t status = NDEF_ERROR, Offset = 0; + uint16_t status = NDEF_ERROR, Offset = 0; - NDEF_PrepareVcardMessage(pVcardStruct, NDEF_Buffer, &Offset); + NDEF_PrepareVcardMessage(pVcardStruct, NDEF_Buffer, &Offset); - status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); + status = NfcTag_WriteNDEF(Offset, NDEF_Buffer); - return status; + return status; } /** @@ -171,96 +171,96 @@ uint16_t NDEF::NDEF_WriteVcard(sVcardInfo *pVcardStruct) uint32_t NDEF_GetVcardLength(sVcardInfo *pVcardStruct) { - uint32_t PayloadSize = 0; + uint32_t PayloadSize = 0; - /* "BEGIN:VCARD\r\n" */ - PayloadSize += VCARD_BEGIN_STRING_SIZE; - PayloadSize += VCARD_STRING_SIZE; - PayloadSize += LIMIT_STRING_SIZE; + /* "BEGIN:VCARD\r\n" */ + PayloadSize += VCARD_BEGIN_STRING_SIZE; + PayloadSize += VCARD_STRING_SIZE; + PayloadSize += LIMIT_STRING_SIZE; - /* "VERSION:2.1\r\n" */ - PayloadSize += VERSION_STRING_SIZE; - PayloadSize += VCARD_VERSION_2_1_SIZE; - PayloadSize += LIMIT_STRING_SIZE; + /* "VERSION:2.1\r\n" */ + PayloadSize += VERSION_STRING_SIZE; + PayloadSize += VCARD_VERSION_2_1_SIZE; + PayloadSize += LIMIT_STRING_SIZE; - /* "N:\r\n" */ - if (*pVcardStruct->Name != '\0') { - PayloadSize += VCARD_NAME_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->Name); - PayloadSize += LIMIT_STRING_SIZE; - } - /* "FN:\r\n" */ - if (*pVcardStruct->FirstName != '\0') { - PayloadSize += FIRSTNAME_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->FirstName); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Title != '\0') { - /* "TITLE:\r\n" */ - PayloadSize += TITLE_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->Title); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Org != '\0') { - /* "ORG:\r\n" */ - PayloadSize += ORG_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->Org); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Url != '\0') { - /* "URL:\r\n" */ - PayloadSize += URL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->Url); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeAddress != '\0') { - /* "ADR;HOME:\r\n" */ - PayloadSize += HOME_ADDRESS_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->HomeAddress); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkAddress != '\0') { - /* "ADR;WORK:\r\n" */ - PayloadSize += WORK_ADDRESS_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->WorkAddress); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeTel != '\0') { - /* "TEL;HOME:\r\n" */ - PayloadSize += HOME_TEL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->HomeTel); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkTel != '\0') { - /* "TEL;WORK:\r\n" */ - PayloadSize += WORK_TEL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->WorkTel); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->CellTel != '\0') { - /* "TEL;CELL:\r\n" */ - PayloadSize += CELL_TEL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->CellTel); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeEmail != '\0') { - /* "EMAIL;HOME:\r\n" */ - PayloadSize += HOME_EMAIL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->HomeEmail); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkEmail != '\0') { - /* "EMAIL;WORK:\r\n" */ - PayloadSize += WORK_EMAIL_STRING_SIZE; - PayloadSize += strlen(pVcardStruct->WorkEmail); - PayloadSize += LIMIT_STRING_SIZE; - } - /* "END:VCARD\r\n" */ - PayloadSize += VCARD_END_STRING_SIZE; - PayloadSize += VCARD_STRING_SIZE; - /* PayloadSize += LIMIT_STRING_SIZE;*/ + /* "N:\r\n" */ + if (*pVcardStruct->Name != '\0') { + PayloadSize += VCARD_NAME_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->Name); + PayloadSize += LIMIT_STRING_SIZE; + } + /* "FN:\r\n" */ + if (*pVcardStruct->FirstName != '\0') { + PayloadSize += FIRSTNAME_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->FirstName); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Title != '\0') { + /* "TITLE:\r\n" */ + PayloadSize += TITLE_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->Title); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Org != '\0') { + /* "ORG:\r\n" */ + PayloadSize += ORG_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->Org); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Url != '\0') { + /* "URL:\r\n" */ + PayloadSize += URL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->Url); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->HomeAddress != '\0') { + /* "ADR;HOME:\r\n" */ + PayloadSize += HOME_ADDRESS_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->HomeAddress); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkAddress != '\0') { + /* "ADR;WORK:\r\n" */ + PayloadSize += WORK_ADDRESS_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->WorkAddress); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->HomeTel != '\0') { + /* "TEL;HOME:\r\n" */ + PayloadSize += HOME_TEL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->HomeTel); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkTel != '\0') { + /* "TEL;WORK:\r\n" */ + PayloadSize += WORK_TEL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->WorkTel); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->CellTel != '\0') { + /* "TEL;CELL:\r\n" */ + PayloadSize += CELL_TEL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->CellTel); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->HomeEmail != '\0') { + /* "EMAIL;HOME:\r\n" */ + PayloadSize += HOME_EMAIL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->HomeEmail); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkEmail != '\0') { + /* "EMAIL;WORK:\r\n" */ + PayloadSize += WORK_EMAIL_STRING_SIZE; + PayloadSize += strlen(pVcardStruct->WorkEmail); + PayloadSize += LIMIT_STRING_SIZE; + } + /* "END:VCARD\r\n" */ + PayloadSize += VCARD_END_STRING_SIZE; + PayloadSize += VCARD_STRING_SIZE; + /* PayloadSize += LIMIT_STRING_SIZE;*/ - return PayloadSize; + return PayloadSize; } @@ -273,209 +273,209 @@ uint32_t NDEF_GetVcardLength(sVcardInfo *pVcardStruct) void NDEF::NDEF_PrepareVcardMessage(sVcardInfo *pVcardStruct, uint8_t *pNDEFMessage, uint16_t *size) { - uint32_t PayloadSize = 0; - - /* Vcard Record Header */ - /************************************/ - /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ - /*----------------------------------*/ - /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=0 TNF=2 NFC Forum Media type*/ - /*----------------------------------*/ - /* TYPE LENGTH */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 3 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 2 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 1 */ - /*----------------------------------*/ - /* PAYLOAD LENGTH 0 */ - /*----------------------------------*/ - /* ID LENGTH */ /* <---- Not Used */ - /*----------------------------------*/ - /* TYPE */ - /*----------------------------------*/ - /* ID */ /* <---- Not Used */ - /************************************/ - - /* As we don't have embedded a jpeg encoder/decoder in this firmware */ - /* We have made the choice to manage only string content of the vCard */ - /* For demonstration purpose in order to fill the 8kB of the M24SR */ - /* We have embedded a NDEF vCard in the STM32 to be able to fill M24SR */ - - /* fill record header */ - uint32_t length = NDEF_GetVcardLength(pVcardStruct); - if (length >= 0xFF) { - pNDEFMessage[0] = 0xC2; /* Record Flag */ - pNDEFMessage[1] = XVCARD_TYPE_STRING_LENGTH; - pNDEFMessage[5] = length & 0xff; - pNDEFMessage[4] = (length >> 8) & 0xff; - pNDEFMessage[3] = (length >> 16) & 0xff; - pNDEFMessage[2] = length >> 24; - memcpy(&pNDEFMessage[6], XVCARD_TYPE_STRING, XVCARD_TYPE_STRING_LENGTH); - - /* Payload is positioned in the NDEF after record header */ - PayloadSize = 6 + XVCARD_TYPE_STRING_LENGTH; - } else { - pNDEFMessage[0] = 0xD2; /* Record Flag */ - pNDEFMessage[1] = XVCARD_TYPE_STRING_LENGTH; - pNDEFMessage[2] = length; - memcpy(&pNDEFMessage[3], XVCARD_TYPE_STRING, XVCARD_TYPE_STRING_LENGTH); - - /* Payload is positioned in the NDEF after record header */ - PayloadSize = 3 + XVCARD_TYPE_STRING_LENGTH; - } - - /* "BEGIN:VCARD\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], VCARD_BEGIN, VCARD_BEGIN_STRING_SIZE); - PayloadSize += VCARD_BEGIN_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], VCARD, VCARD_STRING_SIZE); - PayloadSize += VCARD_STRING_SIZE; + uint32_t PayloadSize = 0; + + /* Vcard Record Header */ + /************************************/ + /* 7 | 6 | 5 | 4 | 3 | 2 1 0 */ + /*----------------------------------*/ + /* MB ME CF SR IL TNF */ /* <---- CF=0, IL=0 and SR=0 TNF=2 NFC Forum Media type*/ + /*----------------------------------*/ + /* TYPE LENGTH */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 3 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 2 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 1 */ + /*----------------------------------*/ + /* PAYLOAD LENGTH 0 */ + /*----------------------------------*/ + /* ID LENGTH */ /* <---- Not Used */ + /*----------------------------------*/ + /* TYPE */ + /*----------------------------------*/ + /* ID */ /* <---- Not Used */ + /************************************/ + + /* As we don't have embedded a jpeg encoder/decoder in this firmware */ + /* We have made the choice to manage only string content of the vCard */ + /* For demonstration purpose in order to fill the 8kB of the M24SR */ + /* We have embedded a NDEF vCard in the STM32 to be able to fill M24SR */ + + /* fill record header */ + uint32_t length = NDEF_GetVcardLength(pVcardStruct); + if (length >= 0xFF) { + pNDEFMessage[0] = 0xC2; /* Record Flag */ + pNDEFMessage[1] = XVCARD_TYPE_STRING_LENGTH; + pNDEFMessage[5] = length & 0xff; + pNDEFMessage[4] = (length >> 8) & 0xff; + pNDEFMessage[3] = (length >> 16) & 0xff; + pNDEFMessage[2] = length >> 24; + memcpy(&pNDEFMessage[6], XVCARD_TYPE_STRING, XVCARD_TYPE_STRING_LENGTH); + + /* Payload is positioned in the NDEF after record header */ + PayloadSize = 6 + XVCARD_TYPE_STRING_LENGTH; + } else { + pNDEFMessage[0] = 0xD2; /* Record Flag */ + pNDEFMessage[1] = XVCARD_TYPE_STRING_LENGTH; + pNDEFMessage[2] = length; + memcpy(&pNDEFMessage[3], XVCARD_TYPE_STRING, XVCARD_TYPE_STRING_LENGTH); + + /* Payload is positioned in the NDEF after record header */ + PayloadSize = 3 + XVCARD_TYPE_STRING_LENGTH; + } + + /* "BEGIN:VCARD\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], VCARD_BEGIN, VCARD_BEGIN_STRING_SIZE); + PayloadSize += VCARD_BEGIN_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], VCARD, VCARD_STRING_SIZE); + PayloadSize += VCARD_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + + /* "VERSION:2.1\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], VERSION, VERSION_STRING_SIZE); + PayloadSize += VERSION_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], VCARD_VERSION_2_1, VCARD_VERSION_2_1_SIZE); + PayloadSize += VCARD_VERSION_2_1_SIZE; + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + + /* "N:\r\n" */ + if (*pVcardStruct->Name != '\0') { + memcpy(&pNDEFMessage[PayloadSize], VCARD_NAME, VCARD_NAME_STRING_SIZE); + PayloadSize += VCARD_NAME_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Name, strlen(pVcardStruct->Name)); + PayloadSize += strlen(pVcardStruct->Name); memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); PayloadSize += LIMIT_STRING_SIZE; - - /* "VERSION:2.1\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], VERSION, VERSION_STRING_SIZE); - PayloadSize += VERSION_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], VCARD_VERSION_2_1, VCARD_VERSION_2_1_SIZE); - PayloadSize += VCARD_VERSION_2_1_SIZE; + } + /* "FN:\r\n" */ + if (*pVcardStruct->FirstName != '\0') { + memcpy(&pNDEFMessage[PayloadSize], FIRSTNAME, FIRSTNAME_STRING_SIZE); + PayloadSize += FIRSTNAME_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->FirstName, strlen(pVcardStruct->FirstName)); + PayloadSize += strlen(pVcardStruct->FirstName); memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); PayloadSize += LIMIT_STRING_SIZE; - - /* "N:\r\n" */ - if (*pVcardStruct->Name != '\0') { - memcpy(&pNDEFMessage[PayloadSize], VCARD_NAME, VCARD_NAME_STRING_SIZE); - PayloadSize += VCARD_NAME_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Name, strlen(pVcardStruct->Name)); - PayloadSize += strlen(pVcardStruct->Name); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - /* "FN:\r\n" */ - if (*pVcardStruct->FirstName != '\0') { - memcpy(&pNDEFMessage[PayloadSize], FIRSTNAME, FIRSTNAME_STRING_SIZE); - PayloadSize += FIRSTNAME_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->FirstName, strlen(pVcardStruct->FirstName)); - PayloadSize += strlen(pVcardStruct->FirstName); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeTel != '\0') { - - /* "TEL;HOME:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], HOME_TEL, HOME_TEL_STRING_SIZE); - PayloadSize += HOME_TEL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeTel, strlen(pVcardStruct->HomeTel)); - PayloadSize += strlen(pVcardStruct->HomeTel); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkTel != '\0') { - - /* "TEL;WORK:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], WORK_TEL, WORK_TEL_STRING_SIZE); - PayloadSize += WORK_TEL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkTel, strlen(pVcardStruct->WorkTel)); - PayloadSize += strlen(pVcardStruct->WorkTel); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->CellTel != '\0') { - - /* "TEL;CELL:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], CELL_TEL, CELL_TEL_STRING_SIZE); - PayloadSize += CELL_TEL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->CellTel, strlen(pVcardStruct->CellTel)); - PayloadSize += strlen(pVcardStruct->CellTel); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeEmail != '\0') { - - /* "EMAIL;HOME:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], HOME_EMAIL, HOME_EMAIL_STRING_SIZE); - PayloadSize += HOME_EMAIL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeEmail, strlen(pVcardStruct->HomeEmail)); - PayloadSize += strlen(pVcardStruct->HomeEmail); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkEmail != '\0') { - - /* "EMAIL;WORK:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], WORK_EMAIL, WORK_EMAIL_STRING_SIZE); - PayloadSize += WORK_EMAIL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkEmail, strlen(pVcardStruct->WorkEmail)); - PayloadSize += strlen(pVcardStruct->WorkEmail); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->HomeAddress != '\0') { - - /* "ADR;HOME:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], HOME_ADDRESS, HOME_ADDRESS_STRING_SIZE); - PayloadSize += HOME_ADDRESS_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeAddress, strlen(pVcardStruct->HomeAddress)); - PayloadSize += strlen(pVcardStruct->HomeAddress); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->WorkAddress != '\0') { - - /* "ADR;WORK:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], WORK_ADDRESS, WORK_ADDRESS_STRING_SIZE); - PayloadSize += WORK_ADDRESS_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkAddress, strlen(pVcardStruct->WorkAddress)); - PayloadSize += strlen(pVcardStruct->WorkAddress); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Org != '\0') { - - /* "ORG:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], ORG, ORG_STRING_SIZE); - PayloadSize += ORG_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Org, strlen(pVcardStruct->Org)); - PayloadSize += strlen(pVcardStruct->Org); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Title != '\0') { - /* "TITLE:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], TITLE, TITLE_STRING_SIZE); - PayloadSize += TITLE_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Title, strlen(pVcardStruct->Title)); - PayloadSize += strlen(pVcardStruct->Title); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - if (*pVcardStruct->Url != '\0') { - /* "URL:\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], URL, URL_STRING_SIZE); - PayloadSize += URL_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Url, strlen(pVcardStruct->Url)); - PayloadSize += strlen(pVcardStruct->Url); - memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); - PayloadSize += LIMIT_STRING_SIZE; - } - - /* "END:VCARD\r\n" */ - memcpy(&pNDEFMessage[PayloadSize], VCARD_END, VCARD_END_STRING_SIZE); - PayloadSize += VCARD_END_STRING_SIZE; - memcpy(&pNDEFMessage[PayloadSize], VCARD, VCARD_STRING_SIZE); - PayloadSize += VCARD_STRING_SIZE; - // memcpy( &pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE ); - // PayloadSize += LIMIT_STRING_SIZE; - - *size = (uint16_t)(PayloadSize); /* Must not count the 2 byte that represent the NDEF size */ - /* - PayloadSize -= 6 + VCARD_TYPE_STRING_LENGTH; - - pNDEFMessage[2] = (PayloadSize & 0xFF000000) >> 24; - pNDEFMessage[3] = (PayloadSize & 0x00FF0000) >> 16; - pNDEFMessage[4] = (PayloadSize & 0x0000FF00) >> 8; - pNDEFMessage[5] = PayloadSize & 0x000000FF; - */ + } + if (*pVcardStruct->HomeTel != '\0') { + + /* "TEL;HOME:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], HOME_TEL, HOME_TEL_STRING_SIZE); + PayloadSize += HOME_TEL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeTel, strlen(pVcardStruct->HomeTel)); + PayloadSize += strlen(pVcardStruct->HomeTel); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkTel != '\0') { + + /* "TEL;WORK:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], WORK_TEL, WORK_TEL_STRING_SIZE); + PayloadSize += WORK_TEL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkTel, strlen(pVcardStruct->WorkTel)); + PayloadSize += strlen(pVcardStruct->WorkTel); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->CellTel != '\0') { + + /* "TEL;CELL:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], CELL_TEL, CELL_TEL_STRING_SIZE); + PayloadSize += CELL_TEL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->CellTel, strlen(pVcardStruct->CellTel)); + PayloadSize += strlen(pVcardStruct->CellTel); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->HomeEmail != '\0') { + + /* "EMAIL;HOME:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], HOME_EMAIL, HOME_EMAIL_STRING_SIZE); + PayloadSize += HOME_EMAIL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeEmail, strlen(pVcardStruct->HomeEmail)); + PayloadSize += strlen(pVcardStruct->HomeEmail); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkEmail != '\0') { + + /* "EMAIL;WORK:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], WORK_EMAIL, WORK_EMAIL_STRING_SIZE); + PayloadSize += WORK_EMAIL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkEmail, strlen(pVcardStruct->WorkEmail)); + PayloadSize += strlen(pVcardStruct->WorkEmail); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->HomeAddress != '\0') { + + /* "ADR;HOME:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], HOME_ADDRESS, HOME_ADDRESS_STRING_SIZE); + PayloadSize += HOME_ADDRESS_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->HomeAddress, strlen(pVcardStruct->HomeAddress)); + PayloadSize += strlen(pVcardStruct->HomeAddress); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->WorkAddress != '\0') { + + /* "ADR;WORK:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], WORK_ADDRESS, WORK_ADDRESS_STRING_SIZE); + PayloadSize += WORK_ADDRESS_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->WorkAddress, strlen(pVcardStruct->WorkAddress)); + PayloadSize += strlen(pVcardStruct->WorkAddress); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Org != '\0') { + + /* "ORG:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], ORG, ORG_STRING_SIZE); + PayloadSize += ORG_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Org, strlen(pVcardStruct->Org)); + PayloadSize += strlen(pVcardStruct->Org); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Title != '\0') { + /* "TITLE:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], TITLE, TITLE_STRING_SIZE); + PayloadSize += TITLE_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Title, strlen(pVcardStruct->Title)); + PayloadSize += strlen(pVcardStruct->Title); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + if (*pVcardStruct->Url != '\0') { + /* "URL:\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], URL, URL_STRING_SIZE); + PayloadSize += URL_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], pVcardStruct->Url, strlen(pVcardStruct->Url)); + PayloadSize += strlen(pVcardStruct->Url); + memcpy(&pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE); + PayloadSize += LIMIT_STRING_SIZE; + } + + /* "END:VCARD\r\n" */ + memcpy(&pNDEFMessage[PayloadSize], VCARD_END, VCARD_END_STRING_SIZE); + PayloadSize += VCARD_END_STRING_SIZE; + memcpy(&pNDEFMessage[PayloadSize], VCARD, VCARD_STRING_SIZE); + PayloadSize += VCARD_STRING_SIZE; + // memcpy( &pNDEFMessage[PayloadSize], LIMIT, LIMIT_STRING_SIZE ); + // PayloadSize += LIMIT_STRING_SIZE; + + *size = (uint16_t)(PayloadSize); /* Must not count the 2 byte that represent the NDEF size */ + /* + PayloadSize -= 6 + VCARD_TYPE_STRING_LENGTH; + + pNDEFMessage[2] = (PayloadSize & 0xFF000000) >> 24; + pNDEFMessage[3] = (PayloadSize & 0x00FF0000) >> 16; + pNDEFMessage[4] = (PayloadSize & 0x0000FF00) >> 8; + pNDEFMessage[5] = PayloadSize & 0x000000FF; + */ } @@ -487,37 +487,37 @@ void NDEF::NDEF_PrepareVcardMessage(sVcardInfo *pVcardStruct, uint8_t *pNDEFMess */ static uint8_t *from_base64(uint8_t *input64, uint32_t *binary) { - /* Read 4 base64 character & translate them into 3 bytes binary */ - *binary = 0; - uint8_t base64_6bits; - int i = 0; - while (i < 4) { - - if ((*input64 >= 'A') && (*input64 <= 'Z')) { - base64_6bits = *(input64++) - 'A'; - } else if ((*input64 >= 'a') && (*input64 <= 'z')) { - base64_6bits = *(input64++) - 'a' + 26; - } else if ((*input64 >= '0') && (*input64 <= '9')) { - base64_6bits = *(input64++) - '0' + 52; - } else if (*input64 == '+') { - base64_6bits = 62; - input64++; - } else if (*input64 == '/') { - base64_6bits = 63; - input64++; - } else if (*input64 == '=') { - base64_6bits = 0; - input64++; - } else { - input64++; - continue; - } - - *binary |= base64_6bits << (6 * (3 - i)); - i++; + /* Read 4 base64 character & translate them into 3 bytes binary */ + *binary = 0; + uint8_t base64_6bits; + int i = 0; + while (i < 4) { + + if ((*input64 >= 'A') && (*input64 <= 'Z')) { + base64_6bits = *(input64++) - 'A'; + } else if ((*input64 >= 'a') && (*input64 <= 'z')) { + base64_6bits = *(input64++) - 'a' + 26; + } else if ((*input64 >= '0') && (*input64 <= '9')) { + base64_6bits = *(input64++) - '0' + 52; + } else if (*input64 == '+') { + base64_6bits = 62; + input64++; + } else if (*input64 == '/') { + base64_6bits = 63; + input64++; + } else if (*input64 == '=') { + base64_6bits = 0; + input64++; + } else { + input64++; + continue; } - *binary = ((*binary & 0xFF0000) >> 16) | ((*binary & 0xFF) << 16) | (*binary & 0xFF00); - return input64; + + *binary |= base64_6bits << (6 * (3 - i)); + i++; + } + *binary = ((*binary & 0xFF0000) >> 16) | ((*binary & 0xFF) << 16) | (*binary & 0xFF00); + return input64; } @@ -529,41 +529,41 @@ static uint8_t *from_base64(uint8_t *input64, uint32_t *binary) */ int NDEF::NDEF_getVcardPicture(uint8_t *pPayload, uint32_t PayloadSize, uint8_t *pPict) { - uint8_t *pSrcPict; + uint8_t *pSrcPict; - /* Let's find the picture */ - pSrcPict = pPayload; - while (memcmp(pSrcPict, JPEG, JPEG_STRING_SIZE) && (pSrcPict < (pPayload + PayloadSize))) { - pSrcPict++; - } - while ((*pSrcPict != ':') && (pSrcPict < (pPayload + PayloadSize))) { - pSrcPict++; - } - /* Picture start at next char */ + /* Let's find the picture */ + pSrcPict = pPayload; + while (memcmp(pSrcPict, JPEG, JPEG_STRING_SIZE) && (pSrcPict < (pPayload + PayloadSize))) { pSrcPict++; - - - /* Word found */ - while (memcmp(pSrcPict, LIMIT, LIMIT_STRING_SIZE) && (pSrcPict < (pPayload + PayloadSize))) { - uint32_t binary24; - pSrcPict = from_base64(pSrcPict, &binary24); - /* copy the 3 bytes read from the base64 data */ - memcpy(pPict, &binary24, 3); - pPict += 3; - /* Ignore any line breaks */ - while (*pSrcPict == 0x0A) { - pSrcPict++; - } - } - - if (pSrcPict >= (pPayload + PayloadSize)) { - /* problem when parsing the picture */ - return 1; - } else { - /* picture found */ - return 0; - } + } + while ((*pSrcPict != ':') && (pSrcPict < (pPayload + PayloadSize))) { + pSrcPict++; + } + /* Picture start at next char */ + pSrcPict++; + + + /* Word found */ + while (memcmp(pSrcPict, LIMIT, LIMIT_STRING_SIZE) && (pSrcPict < (pPayload + PayloadSize))) { + uint32_t binary24; + pSrcPict = from_base64(pSrcPict, &binary24); + /* copy the 3 bytes read from the base64 data */ + memcpy(pPict, &binary24, 3); + pPict += 3; + /* Ignore any line breaks */ + while (*pSrcPict == 0x0A) { + pSrcPict++; + } + } + + if (pSrcPict >= (pPayload + PayloadSize)) { + /* problem when parsing the picture */ + return 1; + } else { + /* picture found */ + return 0; + } } /** diff --git a/src/libNDEF/lib_NDEF_Vcard.h b/src/libNDEF/lib_NDEF_Vcard.h index 7ee9b03..be8a40d 100755 --- a/src/libNDEF/lib_NDEF_Vcard.h +++ b/src/libNDEF/lib_NDEF_Vcard.h @@ -87,22 +87,22 @@ #define LIMIT_STRING_SIZE 2 typedef struct { - char Version [10]; - char Name[80]; - // TODO: rename FirstName into FormattedName - char FirstName[80]; - char Title[80]; - char Org[80]; - char HomeAddress[80]; - char WorkAddress[80]; - char Address[80]; - char HomeTel[40]; - char WorkTel[40]; - char CellTel[40]; - char HomeEmail[80]; - char WorkEmail[80]; - char Email[80]; - char Url[80]; + char Version [10]; + char Name[80]; + // TODO: rename FirstName into FormattedName + char FirstName[80]; + char Title[80]; + char Org[80]; + char HomeAddress[80]; + char WorkAddress[80]; + char Address[80]; + char HomeTel[40]; + char WorkTel[40]; + char CellTel[40]; + char HomeEmail[80]; + char WorkEmail[80]; + char Email[80]; + char Url[80]; } sVcardInfo; #endif /* __LIB_NDEF_VCARD_H */ diff --git a/src/libNDEF/lib_NDEF_Wifi.cpp b/src/libNDEF/lib_NDEF_Wifi.cpp index 143a6e1..c1a0ed6 100755 --- a/src/libNDEF/lib_NDEF_Wifi.cpp +++ b/src/libNDEF/lib_NDEF_Wifi.cpp @@ -105,55 +105,55 @@ */ void NDEF::NDEF_FillWifiTokenStruct(uint8_t *pPayload, uint32_t PayloadSize, sWifiTokenInfo *pWifiTokenStruct) { - uint8_t *pLastByteAdd, data1, data2, *temp, *temp_br ; - uint16_t SSIDLen, NetWorkKeyLen; - uint8_t *dbg, dbg1; - - - pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); - pPayload--; - - while (pPayload++ != pLastByteAdd) { - uint8_t attribute = *pPayload; - temp_br = pPayload; - switch (attribute) { - - case ATTRIBUTE_ID_SSID_LSB: - temp = pPayload; - dbg = temp; - dbg1 = *++dbg; - if (dbg1 == ATTRIBUTE_ID_SSID_MSB) { - data1 = *++dbg; - data2 = *++dbg; - SSIDLen = data1; - SSIDLen = SSIDLen << 8; - SSIDLen |= data2; - pPayload += 4; - memcpy(pWifiTokenStruct->NetworkSSID, pPayload, SSIDLen); - /* add end of string character */ - pWifiTokenStruct->NetworkSSID[SSIDLen] = '\0'; - pPayload += SSIDLen - 1; - } else if (dbg1 == ATTRIBUTE_ID_NETWORK_MSB) { - data1 = *++dbg; - data2 = *++dbg; - NetWorkKeyLen = data1; - NetWorkKeyLen = NetWorkKeyLen << 8; - NetWorkKeyLen |= data2; - pPayload += 4; - memcpy(pWifiTokenStruct->NetworkKey, pPayload, NetWorkKeyLen); - /* add end of string character */ - pWifiTokenStruct->NetworkKey[NetWorkKeyLen] = '\0'; - pPayload += NetWorkKeyLen - 1; - } else { - pPayload = temp_br; - } - - break; - - default : - ; + uint8_t *pLastByteAdd, data1, data2, *temp, *temp_br ; + uint16_t SSIDLen, NetWorkKeyLen; + uint8_t *dbg, dbg1; + + + pLastByteAdd = (uint8_t *)(pPayload + PayloadSize); + pPayload--; + + while (pPayload++ != pLastByteAdd) { + uint8_t attribute = *pPayload; + temp_br = pPayload; + switch (attribute) { + + case ATTRIBUTE_ID_SSID_LSB: + temp = pPayload; + dbg = temp; + dbg1 = *++dbg; + if (dbg1 == ATTRIBUTE_ID_SSID_MSB) { + data1 = *++dbg; + data2 = *++dbg; + SSIDLen = data1; + SSIDLen = SSIDLen << 8; + SSIDLen |= data2; + pPayload += 4; + memcpy(pWifiTokenStruct->NetworkSSID, pPayload, SSIDLen); + /* add end of string character */ + pWifiTokenStruct->NetworkSSID[SSIDLen] = '\0'; + pPayload += SSIDLen - 1; + } else if (dbg1 == ATTRIBUTE_ID_NETWORK_MSB) { + data1 = *++dbg; + data2 = *++dbg; + NetWorkKeyLen = data1; + NetWorkKeyLen = NetWorkKeyLen << 8; + NetWorkKeyLen |= data2; + pPayload += 4; + memcpy(pWifiTokenStruct->NetworkKey, pPayload, NetWorkKeyLen); + /* add end of string character */ + pWifiTokenStruct->NetworkKey[NetWorkKeyLen] = '\0'; + pPayload += NetWorkKeyLen - 1; + } else { + pPayload = temp_br; } + + break; + + default : + ; } + } } @@ -165,17 +165,17 @@ void NDEF::NDEF_FillWifiTokenStruct(uint8_t *pPayload, uint32_t PayloadSize, sWi */ void NDEF::NDEF_Read_WifiToken(struct sRecordInfo *pRecordStruct, sWifiTokenInfo *pWifiTokenStruct) { - uint8_t *pPayload; - uint32_t PayloadSize; + uint8_t *pPayload; + uint32_t PayloadSize; - PayloadSize = pRecordStruct->PayloadLength; + PayloadSize = pRecordStruct->PayloadLength; - /* Read record header */ - pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); + /* Read record header */ + pPayload = (uint8_t *)(pRecordStruct->PayloadBufferAdd); - if (pRecordStruct->NDEF_Type == URI_WIFITOKEN_TYPE) { - NDEF_FillWifiTokenStruct(pPayload, PayloadSize, pWifiTokenStruct); - } + if (pRecordStruct->NDEF_Type == URI_WIFITOKEN_TYPE) { + NDEF_FillWifiTokenStruct(pPayload, PayloadSize, pWifiTokenStruct); + } } @@ -189,14 +189,14 @@ void NDEF::NDEF_Read_WifiToken(struct sRecordInfo *pRecordStruct, sWifiTokenInfo */ uint16_t NDEF::NDEF_ReadWifiToken(struct sRecordInfo *pRecordStruct, sWifiTokenInfo *pWifiTokenStruct) { - uint16_t status = NDEF_ERROR; + uint16_t status = NDEF_ERROR; - if (pRecordStruct->NDEF_Type == URI_WIFITOKEN_TYPE) { - NDEF_Read_WifiToken(pRecordStruct, pWifiTokenStruct); - status = NDEF_OK; - } + if (pRecordStruct->NDEF_Type == URI_WIFITOKEN_TYPE) { + NDEF_Read_WifiToken(pRecordStruct, pWifiTokenStruct); + status = NDEF_OK; + } - return status; + return status; } @@ -208,144 +208,144 @@ uint16_t NDEF::NDEF_ReadWifiToken(struct sRecordInfo *pRecordStruct, sWifiTokenI */ uint16_t NDEF::NDEF_WriteWifiToken(sWifiTokenInfo *pWifiTokenStruct) { - uint16_t status = NDEF_ERROR; - uint8_t *pPayload, initStage = 0; - uint16_t DataSize; - uint32_t PayloadSize, SSIDSize, SSIDKeySize; - - if (pWifiTokenStruct->NetworkKey[0] == '\0') { - /* Empty network key is not supported by Phones */ - strcpy(pWifiTokenStruct->NetworkKey, NDEF_WIFI_DEFAULT_NETWORK_KEY); - } - - uint8_t configToken1[] = {0x10, 0x4A, /* Attribute ID : Version*/ - 0x00, 0x01, /* Attribute ID Length*/ - 0x10, /* Version 1.0*/ - 0x10, 0x0E, /* Attribute ID Credential*/ - 0x00, 0x48, /* Attribute ID Length*/ - 0x10, 0x26, /* Attribute ID : Network Index*/ - 0x00, 0x01, /* Attribute Length*/ - 0x01, /* Index */ - 0x10, 0x45, /* Attribute ID :SSID*/ - - }; - - /* Fill SSID length + SSID between configToken1 and configToken3*/ - - uint8_t configToken3[] = {0x10, 0x03, /* Attribute ID :Authentication Type*/ - 0x00, 0x02, /* Attribute Length*/ - 0x00, 0x01, /* Attribute Type : Open*/ - 0x10, 0x0F, /* Attribute ID : Encryption Type*/ - 0x00, 0x02, /* Attribute Length*/ - 0x00, 0x01, /* Encryption Type : None*/ - 0x10, 0x27 - }; /* Attribute ID : Network Key */ - - - /*Fill SSID KEY Length and SSID Key between configToken3 and configToken5*/ - - uint8_t configToken5[] = {0x10, 0x20, /* Attribute ID : MAC Address */ - 0x00, 0x06, /* Attribute Length*/ - 0, /*MAC-ADDRESS*/ - 0, /*MAC-ADDRESS*/ - 0, /*MAC-ADDRESS*/ - 0, /*MAC-ADDRESS*/ - 0, /*MAC-ADDRESS*/ - 0, /*MAC-ADDRESS*/ - 0x10, 0x49, /* Attribute ID : Vendor Extension */ - 0x00, 0x06, /* Attribute Length*/ - 0x00, 0x37, 0x2A, /* Vendor ID:WFA*/ - 0x02, /* Subelement ID:Network Key Shareable*/ - 0x01, /* Subelement Length*/ - 0x01, /*Network Key Shareable : TRUE*/ - 0x10, 0x49, /* Attribute ID : Vendor Extension */ - 0x00, 0x06, /* Attribute Length*/ - 0x00, 0x37, 0x2A, /* Vendor ID:WFA*/ - 0x00, /* Subelement ID:Version2*/ - 0x01, /* Subelement Length:1*/ - 0x20 /* Version2*/ - }; - - - /* Set size of the tokens */ - const uint32_t CONFIG_TOKEN_1 = sizeof(configToken1); - const uint32_t CONFIG_TOKEN_3 = sizeof(configToken3); - const uint32_t CONFIG_TOKEN_5 = sizeof(configToken5); - - /* Update Token3 for Authentication & Encryption Types, their default value is coded in token3 */ - configToken3[CONFIG_TOKEN_3_AUTHENTICATION_TYPE_INDEX] = pWifiTokenStruct->AuthenticationType & 0xFF; - configToken3[CONFIG_TOKEN_3_ENCRYPTION_TYPE_INDEX] = pWifiTokenStruct->EncryptionType & 0xFF; - - /* fill Wifi record header */ - NDEF_Buffer[FIRST_RECORD_OFFSET] = 0xD2; /* Record Flag */ - NDEF_Buffer[FIRST_RECORD_OFFSET + 1] = WIFITOKEN_TYPE_STRING_LENGTH; - NDEF_Buffer[FIRST_RECORD_OFFSET + 2] = 76; /* needs to be autocalculated - done at the end */ - - memcpy(&NDEF_Buffer[FIRST_RECORD_OFFSET + 3], WIFITOKEN_TYPE_STRING, WIFITOKEN_TYPE_STRING_LENGTH); - - pPayload = &NDEF_Buffer[FIRST_RECORD_OFFSET + 3 + WIFITOKEN_TYPE_STRING_LENGTH]; - PayloadSize = 0; - - /* Compute credential length */ - - uint16_t credential_length = 5 + // Network index - 4 + // SSID type + length - strlen(pWifiTokenStruct->NetworkSSID) + // SSID - CONFIG_TOKEN_3 + - 2 + // Network key length - strlen(pWifiTokenStruct->NetworkKey) + // Network KEY - CONFIG_TOKEN_5; - - /* update credential length */ - configToken1[CONFIG_TOKEN_1_CREDENTIAL_LENGTH_INDEX + 1] = credential_length & 0xff; - configToken1[CONFIG_TOKEN_1_CREDENTIAL_LENGTH_INDEX] = credential_length >> 8; - - - for (initStage = 0; initStage < CONFIG_TOKEN_1; initStage++) { - *pPayload = configToken1[initStage]; - pPayload++; - } - - /*Fill SSID length and SSID value*/ - SSIDSize = strlen(pWifiTokenStruct->NetworkSSID); - *pPayload = 0x00; - pPayload++; - *pPayload = SSIDSize & 0x000000FF; + uint16_t status = NDEF_ERROR; + uint8_t *pPayload, initStage = 0; + uint16_t DataSize; + uint32_t PayloadSize, SSIDSize, SSIDKeySize; + + if (pWifiTokenStruct->NetworkKey[0] == '\0') { + /* Empty network key is not supported by Phones */ + strcpy(pWifiTokenStruct->NetworkKey, NDEF_WIFI_DEFAULT_NETWORK_KEY); + } + + uint8_t configToken1[] = {0x10, 0x4A, /* Attribute ID : Version*/ + 0x00, 0x01, /* Attribute ID Length*/ + 0x10, /* Version 1.0*/ + 0x10, 0x0E, /* Attribute ID Credential*/ + 0x00, 0x48, /* Attribute ID Length*/ + 0x10, 0x26, /* Attribute ID : Network Index*/ + 0x00, 0x01, /* Attribute Length*/ + 0x01, /* Index */ + 0x10, 0x45, /* Attribute ID :SSID*/ + + }; + + /* Fill SSID length + SSID between configToken1 and configToken3*/ + + uint8_t configToken3[] = {0x10, 0x03, /* Attribute ID :Authentication Type*/ + 0x00, 0x02, /* Attribute Length*/ + 0x00, 0x01, /* Attribute Type : Open*/ + 0x10, 0x0F, /* Attribute ID : Encryption Type*/ + 0x00, 0x02, /* Attribute Length*/ + 0x00, 0x01, /* Encryption Type : None*/ + 0x10, 0x27 + }; /* Attribute ID : Network Key */ + + + /*Fill SSID KEY Length and SSID Key between configToken3 and configToken5*/ + + uint8_t configToken5[] = {0x10, 0x20, /* Attribute ID : MAC Address */ + 0x00, 0x06, /* Attribute Length*/ + 0, /*MAC-ADDRESS*/ + 0, /*MAC-ADDRESS*/ + 0, /*MAC-ADDRESS*/ + 0, /*MAC-ADDRESS*/ + 0, /*MAC-ADDRESS*/ + 0, /*MAC-ADDRESS*/ + 0x10, 0x49, /* Attribute ID : Vendor Extension */ + 0x00, 0x06, /* Attribute Length*/ + 0x00, 0x37, 0x2A, /* Vendor ID:WFA*/ + 0x02, /* Subelement ID:Network Key Shareable*/ + 0x01, /* Subelement Length*/ + 0x01, /*Network Key Shareable : TRUE*/ + 0x10, 0x49, /* Attribute ID : Vendor Extension */ + 0x00, 0x06, /* Attribute Length*/ + 0x00, 0x37, 0x2A, /* Vendor ID:WFA*/ + 0x00, /* Subelement ID:Version2*/ + 0x01, /* Subelement Length:1*/ + 0x20 /* Version2*/ + }; + + + /* Set size of the tokens */ + const uint32_t CONFIG_TOKEN_1 = sizeof(configToken1); + const uint32_t CONFIG_TOKEN_3 = sizeof(configToken3); + const uint32_t CONFIG_TOKEN_5 = sizeof(configToken5); + + /* Update Token3 for Authentication & Encryption Types, their default value is coded in token3 */ + configToken3[CONFIG_TOKEN_3_AUTHENTICATION_TYPE_INDEX] = pWifiTokenStruct->AuthenticationType & 0xFF; + configToken3[CONFIG_TOKEN_3_ENCRYPTION_TYPE_INDEX] = pWifiTokenStruct->EncryptionType & 0xFF; + + /* fill Wifi record header */ + NDEF_Buffer[FIRST_RECORD_OFFSET] = 0xD2; /* Record Flag */ + NDEF_Buffer[FIRST_RECORD_OFFSET + 1] = WIFITOKEN_TYPE_STRING_LENGTH; + NDEF_Buffer[FIRST_RECORD_OFFSET + 2] = 76; /* needs to be autocalculated - done at the end */ + + memcpy(&NDEF_Buffer[FIRST_RECORD_OFFSET + 3], WIFITOKEN_TYPE_STRING, WIFITOKEN_TYPE_STRING_LENGTH); + + pPayload = &NDEF_Buffer[FIRST_RECORD_OFFSET + 3 + WIFITOKEN_TYPE_STRING_LENGTH]; + PayloadSize = 0; + + /* Compute credential length */ + + uint16_t credential_length = 5 + // Network index + 4 + // SSID type + length + strlen(pWifiTokenStruct->NetworkSSID) + // SSID + CONFIG_TOKEN_3 + + 2 + // Network key length + strlen(pWifiTokenStruct->NetworkKey) + // Network KEY + CONFIG_TOKEN_5; + + /* update credential length */ + configToken1[CONFIG_TOKEN_1_CREDENTIAL_LENGTH_INDEX + 1] = credential_length & 0xff; + configToken1[CONFIG_TOKEN_1_CREDENTIAL_LENGTH_INDEX] = credential_length >> 8; + + + for (initStage = 0; initStage < CONFIG_TOKEN_1; initStage++) { + *pPayload = configToken1[initStage]; pPayload++; + } - strcpy((char *)pPayload, pWifiTokenStruct->NetworkSSID); - pPayload = pPayload + strlen(pWifiTokenStruct->NetworkSSID); + /*Fill SSID length and SSID value*/ + SSIDSize = strlen(pWifiTokenStruct->NetworkSSID); + *pPayload = 0x00; + pPayload++; + *pPayload = SSIDSize & 0x000000FF; + pPayload++; - for (initStage = 0; initStage < CONFIG_TOKEN_3; initStage++) { - *pPayload = configToken3[initStage]; - pPayload++; - } + strcpy((char *)pPayload, pWifiTokenStruct->NetworkSSID); + pPayload = pPayload + strlen(pWifiTokenStruct->NetworkSSID); - /* Fill the SSIDKey length and SSIDKey value */ - SSIDKeySize = strlen(pWifiTokenStruct->NetworkKey); - *pPayload = 0x00; - pPayload++; - *pPayload = SSIDKeySize & 0x000000FF; + for (initStage = 0; initStage < CONFIG_TOKEN_3; initStage++) { + *pPayload = configToken3[initStage]; pPayload++; + } - memcpy((char *)pPayload, pWifiTokenStruct->NetworkKey, SSIDKeySize); - pPayload = pPayload + SSIDKeySize; + /* Fill the SSIDKey length and SSIDKey value */ + SSIDKeySize = strlen(pWifiTokenStruct->NetworkKey); + *pPayload = 0x00; + pPayload++; + *pPayload = SSIDKeySize & 0x000000FF; + pPayload++; - for (initStage = 0; initStage < CONFIG_TOKEN_5; initStage++) { - *pPayload = configToken5[initStage]; - pPayload++; - } + memcpy((char *)pPayload, pWifiTokenStruct->NetworkKey, SSIDKeySize); + pPayload = pPayload + SSIDKeySize; + + for (initStage = 0; initStage < CONFIG_TOKEN_5; initStage++) { + *pPayload = configToken5[initStage]; + pPayload++; + } - PayloadSize += CONFIG_TOKEN_1 + CONFIG_TOKEN_3 + CONFIG_TOKEN_5 + SSIDSize + SSIDKeySize + 4 ; // +4 is for SSID & Key length fields + PayloadSize += CONFIG_TOKEN_1 + CONFIG_TOKEN_3 + CONFIG_TOKEN_5 + SSIDSize + SSIDKeySize + 4 ; // +4 is for SSID & Key length fields - NDEF_Buffer[FIRST_RECORD_OFFSET + 2] = (PayloadSize & 0x000000FF); + NDEF_Buffer[FIRST_RECORD_OFFSET + 2] = (PayloadSize & 0x000000FF); - DataSize = PayloadSize + 3 + WIFITOKEN_TYPE_STRING_LENGTH; + DataSize = PayloadSize + 3 + WIFITOKEN_TYPE_STRING_LENGTH; - /* Write NDEF */ - status = NDEF_WriteNDEF(DataSize, NDEF_Buffer); + /* Write NDEF */ + status = NDEF_WriteNDEF(DataSize, NDEF_Buffer); - return status; + return status; } diff --git a/src/libNDEF/lib_NDEF_Wifi.h b/src/libNDEF/lib_NDEF_Wifi.h index 683f99f..71f2dd6 100755 --- a/src/libNDEF/lib_NDEF_Wifi.h +++ b/src/libNDEF/lib_NDEF_Wifi.h @@ -70,29 +70,29 @@ #define NDEF_WIFI_DEFAULT_NETWORK_KEY "00000000" typedef enum { - NDEF_WIFI_ENCRYPTION_NONE = 0x0001, /**< WPS No Encryption */ - NDEF_WIFI_ENCRYPTION_WEP = 0x0002, /**< WPS Encryption based on WEP */ - NDEF_WIFI_ENCRYPTION_TKIP = 0x0004, /**< WPS Encryption based on TKIP */ - NDEF_WIFI_ENCRYPTION_AES = 0x0008 /**< WPS Encryption based on AES */ + NDEF_WIFI_ENCRYPTION_NONE = 0x0001, /**< WPS No Encryption */ + NDEF_WIFI_ENCRYPTION_WEP = 0x0002, /**< WPS Encryption based on WEP */ + NDEF_WIFI_ENCRYPTION_TKIP = 0x0004, /**< WPS Encryption based on TKIP */ + NDEF_WIFI_ENCRYPTION_AES = 0x0008 /**< WPS Encryption based on AES */ } Ndef_Wifi_Encryption_t; typedef enum { - NDEF_WIFI_AUTHENTICATION_NONE = 0x0001, /**< WPS No Authentication */ - NDEF_WIFI_AUTHENTICATION_WPAPSK = 0x0002, /**< WPS Authentication based on WPAPSK */ - NDEF_WIFI_AUTHENTICATION_SHARED = 0x0004, /**< WPS Authentication based on WEP Shared Key */ - NDEF_WIFI_AUTHENTICATION_WPA = 0x0008, /**< WPS Authentication based on WPA */ - NDEF_WIFI_AUTHENTICATION_WPA2 = 0x0010, /**< WPS Authentication based on WPA2 */ - NDEF_WIFI_AUTHENTICATION_WPA2PSK = 0x0020 /**< WPS Authentication based on WPA2PSK */ + NDEF_WIFI_AUTHENTICATION_NONE = 0x0001, /**< WPS No Authentication */ + NDEF_WIFI_AUTHENTICATION_WPAPSK = 0x0002, /**< WPS Authentication based on WPAPSK */ + NDEF_WIFI_AUTHENTICATION_SHARED = 0x0004, /**< WPS Authentication based on WEP Shared Key */ + NDEF_WIFI_AUTHENTICATION_WPA = 0x0008, /**< WPS Authentication based on WPA */ + NDEF_WIFI_AUTHENTICATION_WPA2 = 0x0010, /**< WPS Authentication based on WPA2 */ + NDEF_WIFI_AUTHENTICATION_WPA2PSK = 0x0020 /**< WPS Authentication based on WPA2PSK */ } Ndef_Wifi_Authentication_t; /** * @brief WifiToken structure, to store Network SSID, Authentication Type, Encryption Type and Network Key. */ typedef struct { - char NetworkSSID[32]; /**< Store the Network SSID. */ - Ndef_Wifi_Authentication_t AuthenticationType; /**< Store the Authentication type to be used. */ - Ndef_Wifi_Encryption_t EncryptionType; /**< Store the Encryption to be used. */ - char NetworkKey[32]; /**< Store the Network Key. */ + char NetworkSSID[32]; /**< Store the Network SSID. */ + Ndef_Wifi_Authentication_t AuthenticationType; /**< Store the Authentication type to be used. */ + Ndef_Wifi_Encryption_t EncryptionType; /**< Store the Encryption to be used. */ + char NetworkKey[32]; /**< Store the Network Key. */ } sWifiTokenInfo; diff --git a/src/libNDEF/tagtype5_wrapper.cpp b/src/libNDEF/tagtype5_wrapper.cpp index b725f06..c366ccb 100755 --- a/src/libNDEF/tagtype5_wrapper.cpp +++ b/src/libNDEF/tagtype5_wrapper.cpp @@ -80,7 +80,7 @@ */ uint16_t NDEF::NfcTag_ReadNDEF(uint8_t *pData) { - return NfcTag_ReadNDEF(pData, NDEF_MAX_SIZE); + return NfcTag_ReadNDEF(pData, NDEF_MAX_SIZE); } /** @@ -93,50 +93,50 @@ uint16_t NDEF::NfcTag_ReadNDEF(uint8_t *pData) */ uint16_t NDEF::NfcTag_ReadNDEF(uint8_t *pData, uint16_t bufferLength) { - uint16_t status = NDEF_ERROR; - TT5_TLV_t tlv; - uint8_t tlv_size = 0; - uint16_t DataLength; - - /* Detect NDEF message in memory */ - status = NfcType5_NDEFDetection(); - if (status != NDEF_OK) { - return status; + uint16_t status = NDEF_ERROR; + TT5_TLV_t tlv; + uint8_t tlv_size = 0; + uint16_t DataLength; + + /* Detect NDEF message in memory */ + status = NfcType5_NDEFDetection(); + if (status != NDEF_OK) { + return status; + } + + /* Read TL of Type 5 */ + status = mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)); + if (status != NDEF_OK) { + return status; + } + + /* Check if L is on 3 or 1 byte and update length in buffer */ + if (tlv.Length == NFCT5_3_BYTES_L_TLV) { + tlv_size = 4; + DataLength = ((tlv.Length16 >> 8) & 0xff) | ((tlv.Length16 & 0xff) << 8); + } else { + tlv_size = 2; + DataLength = tlv.Length; + } + + /* If too many data to write return error */ + if (DataLength > bufferLength) { + return NDEF_ERROR_MEMORY_INTERNAL; + } + + /* Check CC file is in the correct mode to proceed */ + if (CCFileStruct.State == TT5_INITIALIZED) { + return NDEF_ERROR; + } + + if (DataLength > 0) { + /* Read NDEF */ + if (mydev->ST25DV_i2c_ReadData((pData), CCFileStruct.NDEF_offset + tlv_size, DataLength) != NFCTAG_OK) { + return NDEF_ERROR; } + } - /* Read TL of Type 5 */ - status = mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)); - if (status != NDEF_OK) { - return status; - } - - /* Check if L is on 3 or 1 byte and update length in buffer */ - if (tlv.Length == NFCT5_3_BYTES_L_TLV) { - tlv_size = 4; - DataLength = ((tlv.Length16 >> 8) & 0xff) | ((tlv.Length16 & 0xff) << 8); - } else { - tlv_size = 2; - DataLength = tlv.Length; - } - - /* If too many data to write return error */ - if (DataLength > bufferLength) { - return NDEF_ERROR_MEMORY_INTERNAL; - } - - /* Check CC file is in the correct mode to proceed */ - if (CCFileStruct.State == TT5_INITIALIZED) { - return NDEF_ERROR; - } - - if (DataLength > 0) { - /* Read NDEF */ - if (mydev->ST25DV_i2c_ReadData((pData), CCFileStruct.NDEF_offset + tlv_size, DataLength) != NFCTAG_OK) { - return NDEF_ERROR; - } - } - - return NDEF_OK; + return NDEF_OK; } /** @@ -151,63 +151,63 @@ uint16_t NDEF::NfcTag_ReadNDEF(uint8_t *pData, uint16_t bufferLength) */ uint16_t NDEF::NfcTag_WriteData(uint8_t Type, uint16_t Length, uint8_t *pData) { - TT5_TLV_t tlv; - uint8_t tlv_size; - uint32_t offset; - uint8_t NfcT5_Terminator = NFCT5_TERMINATOR_TLV; - ST25DV_MEM_SIZE mem_size_reg; - - if (mydev->ST25DV_i2c_ReadMemSize(&mem_size_reg) != NDEF_OK) { - return NDEF_ERROR; - } - uint32_t mem_size = (mem_size_reg.BlockSize + 1) * (mem_size_reg.Mem_Size + 1); - - uint32_t max_length = mem_size /* Memory size */ - - ((Length >= 0xFF) ? 4 : 2) /* - TLV length */ - - sizeof(NfcT5_Terminator) /* - Terminator TLV */ - - CCFileStruct.NDEF_offset; /* - CCfile length */ - - /* If too many data to write return error */ - if (Length > max_length) { - return NDEF_ERROR_MEMORY_TAG; - } - - /* Detect NDEF message in memory */ - if (NfcType5_NDEFDetection() != NDEF_OK) { - return NDEF_ERROR; - } - - /* Prepare TLV */ - tlv.Type = Type; - if (Length >= 0xFF) { - tlv.Length = NFCT5_3_BYTES_L_TLV; - tlv.Length16 = ((Length & 0xff) << 8) | ((Length >> 8) & 0xff) ; - tlv_size = 4; - - } else { - tlv.Length = Length; - tlv_size = 2; - } - - offset = CCFileStruct.NDEF_offset; - /* Start write TLV to EEPROM */ - if (mydev->ST25DV_i2c_WriteData((uint8_t *)&tlv, offset, tlv_size) != NFCTAG_OK) { - return NDEF_ERROR; - } - offset += tlv_size; - - /* Continue write TLV data to EEPROM */ - if (mydev->ST25DV_i2c_WriteData(pData, offset, Length) != NFCTAG_OK) { - return NDEF_ERROR; - } - offset += Length; - - /* Write Terminator TLV */ - if (mydev->ST25DV_i2c_WriteData(&NfcT5_Terminator, offset, sizeof(NfcT5_Terminator)) != NFCTAG_OK) { - return NDEF_ERROR; - } - - return NDEF_OK; + TT5_TLV_t tlv; + uint8_t tlv_size; + uint32_t offset; + uint8_t NfcT5_Terminator = NFCT5_TERMINATOR_TLV; + ST25DV_MEM_SIZE mem_size_reg; + + if (mydev->ST25DV_i2c_ReadMemSize(&mem_size_reg) != NDEF_OK) { + return NDEF_ERROR; + } + uint32_t mem_size = (mem_size_reg.BlockSize + 1) * (mem_size_reg.Mem_Size + 1); + + uint32_t max_length = mem_size /* Memory size */ + - ((Length >= 0xFF) ? 4 : 2) /* - TLV length */ + - sizeof(NfcT5_Terminator) /* - Terminator TLV */ + - CCFileStruct.NDEF_offset; /* - CCfile length */ + + /* If too many data to write return error */ + if (Length > max_length) { + return NDEF_ERROR_MEMORY_TAG; + } + + /* Detect NDEF message in memory */ + if (NfcType5_NDEFDetection() != NDEF_OK) { + return NDEF_ERROR; + } + + /* Prepare TLV */ + tlv.Type = Type; + if (Length >= 0xFF) { + tlv.Length = NFCT5_3_BYTES_L_TLV; + tlv.Length16 = ((Length & 0xff) << 8) | ((Length >> 8) & 0xff) ; + tlv_size = 4; + + } else { + tlv.Length = Length; + tlv_size = 2; + } + + offset = CCFileStruct.NDEF_offset; + /* Start write TLV to EEPROM */ + if (mydev->ST25DV_i2c_WriteData((uint8_t *)&tlv, offset, tlv_size) != NFCTAG_OK) { + return NDEF_ERROR; + } + offset += tlv_size; + + /* Continue write TLV data to EEPROM */ + if (mydev->ST25DV_i2c_WriteData(pData, offset, Length) != NFCTAG_OK) { + return NDEF_ERROR; + } + offset += Length; + + /* Write Terminator TLV */ + if (mydev->ST25DV_i2c_WriteData(&NfcT5_Terminator, offset, sizeof(NfcT5_Terminator)) != NFCTAG_OK) { + return NDEF_ERROR; + } + + return NDEF_OK; } @@ -222,7 +222,7 @@ uint16_t NDEF::NfcTag_WriteData(uint8_t Type, uint16_t Length, uint8_t *pData) */ uint16_t NDEF::NfcTag_WriteNDEF(uint16_t Length, uint8_t *pData) { - return NfcTag_WriteData(NFCT5_NDEF_MSG_TLV, Length, pData); + return NfcTag_WriteData(NFCT5_NDEF_MSG_TLV, Length, pData); } /** @@ -236,7 +236,7 @@ uint16_t NDEF::NfcTag_WriteNDEF(uint16_t Length, uint8_t *pData) */ uint16_t NDEF::NfcTag_WriteProprietary(uint16_t Length, uint8_t *pData) { - return NfcTag_WriteData(NFCT5_PROPRIETARY_TLV, Length, pData); + return NfcTag_WriteData(NFCT5_PROPRIETARY_TLV, Length, pData); } @@ -248,21 +248,21 @@ uint16_t NDEF::NfcTag_WriteProprietary(uint16_t Length, uint8_t *pData) */ uint16_t NDEF::NfcType5_WriteCCFile(const uint8_t *const pCCBuffer) { - NFCTAG_StatusTypeDef ret_value; + NFCTAG_StatusTypeDef ret_value; - /* Write first block of CCFile */ - ret_value = mydev->ST25DV_i2c_WriteData(pCCBuffer, 0x00, 0x4); + /* Write first block of CCFile */ + ret_value = mydev->ST25DV_i2c_WriteData(pCCBuffer, 0x00, 0x4); - /* If extended memory writes the next 4 bytes */ - if ((pCCBuffer[2] == 0x00) && (ret_value == NFCTAG_OK)) { - ret_value = mydev->ST25DV_i2c_WriteData(pCCBuffer + 4, 0x04, 4); - } + /* If extended memory writes the next 4 bytes */ + if ((pCCBuffer[2] == 0x00) && (ret_value == NFCTAG_OK)) { + ret_value = mydev->ST25DV_i2c_WriteData(pCCBuffer + 4, 0x04, 4); + } - if (ret_value != NFCTAG_OK) { - return NDEF_ERROR; - } + if (ret_value != NFCTAG_OK) { + return NDEF_ERROR; + } - return NDEF_OK; + return NDEF_OK; } /** @@ -273,21 +273,21 @@ uint16_t NDEF::NfcType5_WriteCCFile(const uint8_t *const pCCBuffer) */ uint16_t NDEF::NfcType5_ReadCCFile(uint8_t *const pCCBuffer) { - NFCTAG_StatusTypeDef ret_value; + NFCTAG_StatusTypeDef ret_value; - /* Read 4 bytes of CC File */ - ret_value = mydev->ST25DV_i2c_ReadData(pCCBuffer, 0x00, 4); + /* Read 4 bytes of CC File */ + ret_value = mydev->ST25DV_i2c_ReadData(pCCBuffer, 0x00, 4); - /* If extended memory reads the next 4 bytes */ - if ((pCCBuffer[2] == 0x00) && (ret_value == NFCTAG_OK)) { - ret_value = mydev->ST25DV_i2c_ReadData(pCCBuffer + 4, 0x04, 4); - } + /* If extended memory reads the next 4 bytes */ + if ((pCCBuffer[2] == 0x00) && (ret_value == NFCTAG_OK)) { + ret_value = mydev->ST25DV_i2c_ReadData(pCCBuffer + 4, 0x04, 4); + } - if (ret_value != NFCTAG_OK) { - return NDEF_ERROR; - } + if (ret_value != NFCTAG_OK) { + return NDEF_ERROR; + } - return NDEF_OK; + return NDEF_OK; } /** @@ -298,47 +298,47 @@ uint16_t NDEF::NfcType5_ReadCCFile(uint8_t *const pCCBuffer) */ uint16_t NDEF::NfcType5_TT5Init(void) { - NFCTAG_StatusTypeDef ret_value = NFCTAG_OK; - uint16_t status; - uint8_t accbuffer[8]; - uint8_t cdata; - - /* Prepare buffer to update CCFile */ - accbuffer[0] = CCFileStruct.MagicNumber; - accbuffer[1] = CCFileStruct.Version; - accbuffer[2] = CCFileStruct.MemorySize; - accbuffer[3] = CCFileStruct.TT5Tag; - CCFileStruct.NDEF_offset = 0x04; - - /* If extended memory prepare the length bytes */ - if (CCFileStruct.MemorySize == NFCT5_EXTENDED_CCFILE) { - accbuffer[6] = (uint8_t)(CCFileStruct.ExtMemorySize >> 8); - accbuffer[7] = (uint8_t)(CCFileStruct.ExtMemorySize & 0xFF); - CCFileStruct.NDEF_offset = 0x08; - } - - /* Update CCFile */ - status = NfcType5_WriteCCFile(accbuffer); - if (status != NDEF_OK) { - return status; - } - - /* Update NDEF TLV for INITIALIZED state */ - /* Update T */ - cdata = NFCT5_NDEF_MSG_TLV; - ret_value = mydev->ST25DV_i2c_WriteData(&cdata, CCFileStruct.NDEF_offset, 1); - if (ret_value != NFCTAG_OK) { - return NDEF_ERROR; - } - - /* Update L */ - cdata = 0x00; - ret_value = mydev->ST25DV_i2c_WriteData(&cdata, (CCFileStruct.NDEF_offset + 1), 1); - if (ret_value != NFCTAG_OK) { - return NDEF_ERROR; - } - - return NDEF_OK; + NFCTAG_StatusTypeDef ret_value = NFCTAG_OK; + uint16_t status; + uint8_t accbuffer[8]; + uint8_t cdata; + + /* Prepare buffer to update CCFile */ + accbuffer[0] = CCFileStruct.MagicNumber; + accbuffer[1] = CCFileStruct.Version; + accbuffer[2] = CCFileStruct.MemorySize; + accbuffer[3] = CCFileStruct.TT5Tag; + CCFileStruct.NDEF_offset = 0x04; + + /* If extended memory prepare the length bytes */ + if (CCFileStruct.MemorySize == NFCT5_EXTENDED_CCFILE) { + accbuffer[6] = (uint8_t)(CCFileStruct.ExtMemorySize >> 8); + accbuffer[7] = (uint8_t)(CCFileStruct.ExtMemorySize & 0xFF); + CCFileStruct.NDEF_offset = 0x08; + } + + /* Update CCFile */ + status = NfcType5_WriteCCFile(accbuffer); + if (status != NDEF_OK) { + return status; + } + + /* Update NDEF TLV for INITIALIZED state */ + /* Update T */ + cdata = NFCT5_NDEF_MSG_TLV; + ret_value = mydev->ST25DV_i2c_WriteData(&cdata, CCFileStruct.NDEF_offset, 1); + if (ret_value != NFCTAG_OK) { + return NDEF_ERROR; + } + + /* Update L */ + cdata = 0x00; + ret_value = mydev->ST25DV_i2c_WriteData(&cdata, (CCFileStruct.NDEF_offset + 1), 1); + if (ret_value != NFCTAG_OK) { + return NDEF_ERROR; + } + + return NDEF_OK; } /** @@ -350,84 +350,84 @@ uint16_t NDEF::NfcType5_TT5Init(void) */ uint16_t NDEF::NfcType5_NDEFDetection(void) { - uint8_t acc_buffer[8]; - TT5_TLV_t tlv_detect; - uint16_t status; - uint32_t memory_size; + uint8_t acc_buffer[8]; + TT5_TLV_t tlv_detect; + uint16_t status; + uint32_t memory_size; - CCFileStruct.State = TT5_NO_NDEF; + CCFileStruct.State = TT5_NO_NDEF; - /* Read CCFile */ - status = NfcType5_ReadCCFile(acc_buffer); + /* Read CCFile */ + status = NfcType5_ReadCCFile(acc_buffer); - if (status != NDEF_OK) { - return status; - } - - /* Check Byte 0 is equal to magic number */ - if ((acc_buffer[0] != NFCT5_MAGICNUMBER_E1_CCFILE) && (acc_buffer[0] != NFCT5_MAGICNUMBER_E2_CCFILE)) { - return NDEF_ERROR_NOT_FORMATED; - } - /* Check Version number */ - else if (((acc_buffer[1] & 0xFC) != 0x40)) { - return NDEF_ERROR_NOT_FORMATED; - } + if (status != NDEF_OK) { + return status; + } - /* Check if CCFile is on 4 Bytes or 8 Bytes */ - if (acc_buffer[2] == 0x00) { - /* Update CCFIle structure */ - CCFileStruct.MemorySize = 0x0; - CCFileStruct.ExtMemorySize = (uint16_t)acc_buffer[6]; - CCFileStruct.ExtMemorySize = (CCFileStruct.ExtMemorySize << 8) | acc_buffer[7]; - memory_size = CCFileStruct.ExtMemorySize; - CCFileStruct.NDEF_offset = 8; - } else { - /* Update CCFIle structure */ - CCFileStruct.MemorySize = acc_buffer[2]; - CCFileStruct.ExtMemorySize = 0x0; - memory_size = CCFileStruct.MemorySize; - CCFileStruct.NDEF_offset = 4; - } + /* Check Byte 0 is equal to magic number */ + if ((acc_buffer[0] != NFCT5_MAGICNUMBER_E1_CCFILE) && (acc_buffer[0] != NFCT5_MAGICNUMBER_E2_CCFILE)) { + return NDEF_ERROR_NOT_FORMATED; + } + /* Check Version number */ + else if (((acc_buffer[1] & 0xFC) != 0x40)) { + return NDEF_ERROR_NOT_FORMATED; + } + /* Check if CCFile is on 4 Bytes or 8 Bytes */ + if (acc_buffer[2] == 0x00) { /* Update CCFIle structure */ - CCFileStruct.MagicNumber = (TT5_MagicNumber_t)acc_buffer[0]; - CCFileStruct.Version = acc_buffer[1]; - CCFileStruct.TT5Tag = acc_buffer[3]; - - /* Search for position of NDEF TLV in memory and tag status */ - while ((mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv_detect, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)) == NFCTAG_OK) && (CCFileStruct.NDEF_offset < memory_size)) { - /* Detect first NDEF Message in memory */ - if (tlv_detect.Type == NFCT5_NDEF_MSG_TLV) { - if (tlv_detect.Length == 0x00) { - CCFileStruct.State = TT5_INITIALIZED; - } else { - if (CCFileStruct.Version & 0x3) { - CCFileStruct.State = TT5_READ; - } else { - CCFileStruct.State = TT5_READ_WRITE; - } - } - return NDEF_OK; - } - /* If Proprietary NDEF jump to end of proprietary message */ - else if (tlv_detect.Type == NFCT5_PROPRIETARY_TLV) { - if (tlv_detect.Length == NFCT5_3_BYTES_L_TLV) { - CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + tlv_detect.Length16; - continue; - } else { - CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + tlv_detect.Length; - continue; - } - } - /* if Terminator no NDEF detected */ - else if (tlv_detect.Type == NFCT5_TERMINATOR_TLV) { - return NDEF_ERROR_NOT_FORMATED; + CCFileStruct.MemorySize = 0x0; + CCFileStruct.ExtMemorySize = (uint16_t)acc_buffer[6]; + CCFileStruct.ExtMemorySize = (CCFileStruct.ExtMemorySize << 8) | acc_buffer[7]; + memory_size = CCFileStruct.ExtMemorySize; + CCFileStruct.NDEF_offset = 8; + } else { + /* Update CCFIle structure */ + CCFileStruct.MemorySize = acc_buffer[2]; + CCFileStruct.ExtMemorySize = 0x0; + memory_size = CCFileStruct.MemorySize; + CCFileStruct.NDEF_offset = 4; + } + + /* Update CCFIle structure */ + CCFileStruct.MagicNumber = (TT5_MagicNumber_t)acc_buffer[0]; + CCFileStruct.Version = acc_buffer[1]; + CCFileStruct.TT5Tag = acc_buffer[3]; + + /* Search for position of NDEF TLV in memory and tag status */ + while ((mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv_detect, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)) == NFCTAG_OK) && (CCFileStruct.NDEF_offset < memory_size)) { + /* Detect first NDEF Message in memory */ + if (tlv_detect.Type == NFCT5_NDEF_MSG_TLV) { + if (tlv_detect.Length == 0x00) { + CCFileStruct.State = TT5_INITIALIZED; + } else { + if (CCFileStruct.Version & 0x3) { + CCFileStruct.State = TT5_READ; + } else { + CCFileStruct.State = TT5_READ_WRITE; } - - CCFileStruct.NDEF_offset++; + } + return NDEF_OK; + } + /* If Proprietary NDEF jump to end of proprietary message */ + else if (tlv_detect.Type == NFCT5_PROPRIETARY_TLV) { + if (tlv_detect.Length == NFCT5_3_BYTES_L_TLV) { + CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + tlv_detect.Length16; + continue; + } else { + CCFileStruct.NDEF_offset = CCFileStruct.NDEF_offset + tlv_detect.Length; + continue; + } + } + /* if Terminator no NDEF detected */ + else if (tlv_detect.Type == NFCT5_TERMINATOR_TLV) { + return NDEF_ERROR_NOT_FORMATED; } - return NDEF_ERROR_NOT_FORMATED; + CCFileStruct.NDEF_offset++; + } + + return NDEF_ERROR_NOT_FORMATED; } @@ -442,28 +442,28 @@ uint16_t NDEF::NfcType5_NDEFDetection(void) uint16_t NDEF::NfcTag_GetLength(uint16_t *Length) { - uint16_t status = NDEF_ERROR; - TT5_TLV_t tlv; + uint16_t status = NDEF_ERROR; + TT5_TLV_t tlv; - /* Detect NDEF message in memory */ - status = NfcType5_NDEFDetection(); - if (status != NDEF_OK) { - return status; - } + /* Detect NDEF message in memory */ + status = NfcType5_NDEFDetection(); + if (status != NDEF_OK) { + return status; + } - /* Read TL of Type 5 */ - status = mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)); - if (status != NFCTAG_OK) { - return NDEF_ERROR; - } + /* Read TL of Type 5 */ + status = mydev->ST25DV_i2c_ReadData((uint8_t *)&tlv, CCFileStruct.NDEF_offset, sizeof(TT5_TLV_t)); + if (status != NFCTAG_OK) { + return NDEF_ERROR; + } - if (tlv.Length != NFCT5_3_BYTES_L_TLV) { - *Length = tlv.Length; - } else { - *Length = ((tlv.Length16 >> 8) & 0xff) | ((tlv.Length16 & 0xff) << 8); - } + if (tlv.Length != NFCT5_3_BYTES_L_TLV) { + *Length = tlv.Length; + } else { + *Length = ((tlv.Length16 >> 8) & 0xff) | ((tlv.Length16 & 0xff) << 8); + } - return NDEF_OK; + return NDEF_OK; } diff --git a/src/libNDEF/tagtype5_wrapper.h b/src/libNDEF/tagtype5_wrapper.h index 075cdd5..5cb86af 100755 --- a/src/libNDEF/tagtype5_wrapper.h +++ b/src/libNDEF/tagtype5_wrapper.h @@ -44,9 +44,9 @@ /** @brief Type5 Tag Type-Length-Value structure as defined by the NFC Forum */ typedef struct { - uint8_t Type; /**< NFC Forum message Type */ - uint8_t Length; /**< Message length if lesser than 255 bytes */ - uint16_t Length16; /**< Message length if greater than or equal to 255 bytes */ + uint8_t Type; /**< NFC Forum message Type */ + uint8_t Length; /**< Message length if lesser than 255 bytes */ + uint16_t Length16; /**< Message length if greater than or equal to 255 bytes */ } TT5_TLV_t; /* Exported types ------------------------------------------------------------*/