Demonstration of possible usage of the NFC EEPROM class (including support for ST25DV NFC chip)

Dependencies:   eeprom_driver

Committer:
apalmieri
Date:
Tue Jan 28 16:08:05 2020 +0000
Revision:
6:462737ad2938
Parent:
0:86f202e07059
Add ST25DV driver support

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 0:86f202e07059 1 /* mbed Microcontroller Library
mbed_official 0:86f202e07059 2 * Copyright (c) 2018-2018 ARM Limited
mbed_official 0:86f202e07059 3 *
mbed_official 0:86f202e07059 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbed_official 0:86f202e07059 5 * you may not use this file except in compliance with the License.
mbed_official 0:86f202e07059 6 * You may obtain a copy of the License at
mbed_official 0:86f202e07059 7 *
mbed_official 0:86f202e07059 8 * http://www.apache.org/licenses/LICENSE-2.0
mbed_official 0:86f202e07059 9 *
mbed_official 0:86f202e07059 10 * Unless required by applicable law or agreed to in writing, software
mbed_official 0:86f202e07059 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbed_official 0:86f202e07059 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbed_official 0:86f202e07059 13 * See the License for the specific language governing permissions and
mbed_official 0:86f202e07059 14 * limitations under the License.
mbed_official 0:86f202e07059 15 */
mbed_official 0:86f202e07059 16
mbed_official 0:86f202e07059 17 #include "NfcControllerToEEPROMAdapter.h"
mbed_official 0:86f202e07059 18
mbed_official 0:86f202e07059 19 #include <algorithm>
mbed_official 0:86f202e07059 20
mbed_official 0:86f202e07059 21 #include "nfc/NFCController.h"
mbed_official 0:86f202e07059 22 #include "nfc/NFCEEPROMDriver.h"
mbed_official 0:86f202e07059 23 #include "nfc/NFCRemoteInitiator.h"
mbed_official 0:86f202e07059 24
mbed_official 0:86f202e07059 25 namespace mbed {
mbed_official 0:86f202e07059 26 namespace nfc {
mbed_official 0:86f202e07059 27
mbed_official 0:86f202e07059 28 ControllerToEEPROMDriverAdapter::ControllerToEEPROMDriverAdapter(
mbed_official 0:86f202e07059 29 NFCController &controller,
mbed_official 0:86f202e07059 30 const Span<uint8_t> &buffer
mbed_official 0:86f202e07059 31 ) :
mbed_official 0:86f202e07059 32 _nfc_controller(controller),
mbed_official 0:86f202e07059 33 _eeprom_buffer(buffer),
mbed_official 0:86f202e07059 34 _current_eeprom_size(buffer.size()),
mbed_official 0:86f202e07059 35 _session_opened(false)
mbed_official 0:86f202e07059 36 {
mbed_official 0:86f202e07059 37 }
mbed_official 0:86f202e07059 38
mbed_official 0:86f202e07059 39 ControllerToEEPROMDriverAdapter::~ControllerToEEPROMDriverAdapter()
mbed_official 0:86f202e07059 40 {
mbed_official 0:86f202e07059 41 if (_nfc_remote_initiator.get()) {
mbed_official 0:86f202e07059 42 _nfc_remote_initiator->set_delegate(NULL);
mbed_official 0:86f202e07059 43 }
mbed_official 0:86f202e07059 44 _nfc_controller.set_delegate(NULL);
mbed_official 0:86f202e07059 45 _nfc_controller.cancel_discovery();
mbed_official 0:86f202e07059 46 }
mbed_official 0:86f202e07059 47
mbed_official 0:86f202e07059 48 void ControllerToEEPROMDriverAdapter::reset()
mbed_official 0:86f202e07059 49 {
mbed_official 0:86f202e07059 50 _current_eeprom_size = _eeprom_buffer.size();
mbed_official 0:86f202e07059 51 memset(_eeprom_buffer.data(), 0, _eeprom_buffer.size());
mbed_official 0:86f202e07059 52
mbed_official 0:86f202e07059 53 if (_nfc_remote_initiator.get()) {
mbed_official 0:86f202e07059 54 _nfc_remote_initiator->set_delegate(NULL);
mbed_official 0:86f202e07059 55 _nfc_remote_initiator.reset();
mbed_official 0:86f202e07059 56 }
mbed_official 0:86f202e07059 57
mbed_official 0:86f202e07059 58 _nfc_controller.initialize();
mbed_official 0:86f202e07059 59 _nfc_controller.set_delegate(this);
mbed_official 0:86f202e07059 60
mbed_official 0:86f202e07059 61 nfc_rf_protocols_bitmask_t protocols = { 0 };
mbed_official 0:86f202e07059 62 protocols.target_iso_dep = 1;
mbed_official 0:86f202e07059 63 _nfc_controller.configure_rf_protocols(protocols);
mbed_official 0:86f202e07059 64
mbed_official 0:86f202e07059 65 _nfc_controller.start_discovery();
mbed_official 0:86f202e07059 66 }
mbed_official 0:86f202e07059 67
mbed_official 0:86f202e07059 68 size_t ControllerToEEPROMDriverAdapter::read_max_size()
mbed_official 0:86f202e07059 69 {
mbed_official 0:86f202e07059 70 return _eeprom_buffer.size();
mbed_official 0:86f202e07059 71 }
mbed_official 0:86f202e07059 72
mbed_official 0:86f202e07059 73 void ControllerToEEPROMDriverAdapter::start_session(bool force)
mbed_official 0:86f202e07059 74 {
mbed_official 0:86f202e07059 75 _session_opened = true;
mbed_official 0:86f202e07059 76 delegate()->on_session_started(true);
mbed_official 0:86f202e07059 77 }
mbed_official 0:86f202e07059 78
mbed_official 0:86f202e07059 79 void ControllerToEEPROMDriverAdapter::end_session()
mbed_official 0:86f202e07059 80 {
mbed_official 0:86f202e07059 81 _session_opened = false;
mbed_official 0:86f202e07059 82 delegate()->on_session_ended(true);
mbed_official 0:86f202e07059 83 }
mbed_official 0:86f202e07059 84
mbed_official 0:86f202e07059 85 void ControllerToEEPROMDriverAdapter::read_bytes(
mbed_official 0:86f202e07059 86 uint32_t address, uint8_t *bytes, size_t count
mbed_official 0:86f202e07059 87 ) {
mbed_official 0:86f202e07059 88 if (address >= _current_eeprom_size) {
mbed_official 0:86f202e07059 89 delegate()->on_bytes_read(0);
mbed_official 0:86f202e07059 90 return;
mbed_official 0:86f202e07059 91 }
mbed_official 0:86f202e07059 92
mbed_official 0:86f202e07059 93 size_t size = std::min(count, (size_t) (_current_eeprom_size - address));
mbed_official 0:86f202e07059 94 memcpy(bytes, _eeprom_buffer.data() + address, size);
mbed_official 0:86f202e07059 95 delegate()->on_bytes_read(size);
mbed_official 0:86f202e07059 96 }
mbed_official 0:86f202e07059 97
mbed_official 0:86f202e07059 98 void ControllerToEEPROMDriverAdapter::write_bytes(
mbed_official 0:86f202e07059 99 uint32_t address, const uint8_t *bytes, size_t count
mbed_official 0:86f202e07059 100 ) {
mbed_official 0:86f202e07059 101 if (address >= _current_eeprom_size) {
mbed_official 0:86f202e07059 102 delegate()->on_bytes_written(0);
mbed_official 0:86f202e07059 103 return;
mbed_official 0:86f202e07059 104 }
mbed_official 0:86f202e07059 105
mbed_official 0:86f202e07059 106 size_t size = std::min(count, (size_t) (_current_eeprom_size - address));
mbed_official 0:86f202e07059 107 memcpy(_eeprom_buffer.data() + address, bytes, size);
mbed_official 0:86f202e07059 108 delegate()->on_bytes_written(size);
mbed_official 0:86f202e07059 109 }
mbed_official 0:86f202e07059 110
mbed_official 0:86f202e07059 111 void ControllerToEEPROMDriverAdapter::read_size()
mbed_official 0:86f202e07059 112 {
mbed_official 0:86f202e07059 113 delegate()->on_size_read(true, _current_eeprom_size);
mbed_official 0:86f202e07059 114 }
mbed_official 0:86f202e07059 115
mbed_official 0:86f202e07059 116 void ControllerToEEPROMDriverAdapter::write_size(size_t count)
mbed_official 0:86f202e07059 117 {
mbed_official 0:86f202e07059 118 if (count > (size_t) _eeprom_buffer.size()) {
mbed_official 0:86f202e07059 119 delegate()->on_size_written(false);
mbed_official 0:86f202e07059 120 } else {
mbed_official 0:86f202e07059 121 _current_eeprom_size = count;
mbed_official 0:86f202e07059 122 delegate()->on_size_written(true);
mbed_official 0:86f202e07059 123 }
mbed_official 0:86f202e07059 124 }
mbed_official 0:86f202e07059 125
mbed_official 0:86f202e07059 126 void ControllerToEEPROMDriverAdapter::erase_bytes(uint32_t address, size_t count)
mbed_official 0:86f202e07059 127 {
mbed_official 0:86f202e07059 128 if (address >= _current_eeprom_size) {
mbed_official 0:86f202e07059 129 delegate()->on_bytes_erased(0);
mbed_official 0:86f202e07059 130 return;
mbed_official 0:86f202e07059 131 }
mbed_official 0:86f202e07059 132
mbed_official 0:86f202e07059 133 size_t size = std::min(count, (size_t) (_current_eeprom_size - address));
mbed_official 0:86f202e07059 134 memset(_eeprom_buffer.data() + address, 0, size);
mbed_official 0:86f202e07059 135 delegate()->on_bytes_erased(size);
mbed_official 0:86f202e07059 136 }
mbed_official 0:86f202e07059 137
mbed_official 0:86f202e07059 138 /* ------------------------------------------------------------------------
mbed_official 0:86f202e07059 139 * Implementation of NFCRemoteInitiator::Delegate
mbed_official 0:86f202e07059 140 */
mbed_official 0:86f202e07059 141 void ControllerToEEPROMDriverAdapter::on_connected() { }
mbed_official 0:86f202e07059 142
mbed_official 0:86f202e07059 143 void ControllerToEEPROMDriverAdapter::on_disconnected()
mbed_official 0:86f202e07059 144 {
mbed_official 0:86f202e07059 145 // reset the state of the remote initiator
mbed_official 0:86f202e07059 146 _nfc_remote_initiator->set_delegate(NULL);
mbed_official 0:86f202e07059 147 _nfc_remote_initiator.reset();
mbed_official 0:86f202e07059 148
mbed_official 0:86f202e07059 149 // restart peer discovery
mbed_official 0:86f202e07059 150 _nfc_controller.start_discovery();
mbed_official 0:86f202e07059 151 }
mbed_official 0:86f202e07059 152
mbed_official 0:86f202e07059 153 void ControllerToEEPROMDriverAdapter::parse_ndef_message(const Span<const uint8_t> &buffer)
mbed_official 0:86f202e07059 154 {
mbed_official 0:86f202e07059 155 if (_session_opened) {
mbed_official 0:86f202e07059 156 return;
mbed_official 0:86f202e07059 157 }
mbed_official 0:86f202e07059 158
mbed_official 0:86f202e07059 159 if (buffer.size() > _eeprom_buffer.size()) {
mbed_official 0:86f202e07059 160 return;
mbed_official 0:86f202e07059 161 }
mbed_official 0:86f202e07059 162
mbed_official 0:86f202e07059 163 _current_eeprom_size = buffer.size();
mbed_official 0:86f202e07059 164 memcpy(_eeprom_buffer.data(), buffer.data(), _current_eeprom_size);
mbed_official 0:86f202e07059 165 }
mbed_official 0:86f202e07059 166
mbed_official 0:86f202e07059 167 size_t ControllerToEEPROMDriverAdapter::build_ndef_message(const Span<uint8_t> &buffer)
mbed_official 0:86f202e07059 168 {
mbed_official 0:86f202e07059 169 if (_session_opened) {
mbed_official 0:86f202e07059 170 return 0;
mbed_official 0:86f202e07059 171 }
mbed_official 0:86f202e07059 172
mbed_official 0:86f202e07059 173 if ((size_t) buffer.size() < _current_eeprom_size) {
mbed_official 0:86f202e07059 174 return 0;
mbed_official 0:86f202e07059 175 }
mbed_official 0:86f202e07059 176
mbed_official 0:86f202e07059 177 memcpy(buffer.data(), _eeprom_buffer.data(), _current_eeprom_size);
mbed_official 0:86f202e07059 178 return _current_eeprom_size;
mbed_official 0:86f202e07059 179 }
mbed_official 0:86f202e07059 180
mbed_official 0:86f202e07059 181 /* ------------------------------------------------------------------------
mbed_official 0:86f202e07059 182 * Implementation of NFCController::Delegate
mbed_official 0:86f202e07059 183 */
mbed_official 0:86f202e07059 184 void ControllerToEEPROMDriverAdapter::on_discovery_terminated(
mbed_official 0:86f202e07059 185 nfc_discovery_terminated_reason_t reason
mbed_official 0:86f202e07059 186 ) {
mbed_official 0:86f202e07059 187 if(reason != nfc_discovery_terminated_completed) {
mbed_official 0:86f202e07059 188 _nfc_controller.start_discovery();
mbed_official 0:86f202e07059 189 }
mbed_official 0:86f202e07059 190 }
mbed_official 0:86f202e07059 191
mbed_official 0:86f202e07059 192 void ControllerToEEPROMDriverAdapter::on_nfc_initiator_discovered(
mbed_official 0:86f202e07059 193 const SharedPtr<NFCRemoteInitiator> &nfc_initiator
mbed_official 0:86f202e07059 194 ) {
mbed_official 0:86f202e07059 195 // setup the local remote initiator
mbed_official 0:86f202e07059 196 _nfc_remote_initiator = nfc_initiator;
mbed_official 0:86f202e07059 197 _nfc_remote_initiator->set_delegate(this);
mbed_official 0:86f202e07059 198 _nfc_remote_initiator->connect();
mbed_official 0:86f202e07059 199 }
mbed_official 0:86f202e07059 200
mbed_official 0:86f202e07059 201 } // namespace nfc
mbed_official 0:86f202e07059 202 } // namespace mbed
mbed_official 0:86f202e07059 203