The prosthetic control(MIT)

Committer:
ganlikun
Date:
Thu Jun 23 05:23:34 2022 +0000
Revision:
0:20e0c61e0684
01

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ganlikun 0:20e0c61e0684 1 /* mbed Microcontroller Library
ganlikun 0:20e0c61e0684 2 * Copyright (c) 2006-2013 ARM Limited
ganlikun 0:20e0c61e0684 3 *
ganlikun 0:20e0c61e0684 4 * Licensed under the Apache License, Version 2.0 (the "License");
ganlikun 0:20e0c61e0684 5 * you may not use this file except in compliance with the License.
ganlikun 0:20e0c61e0684 6 * You may obtain a copy of the License at
ganlikun 0:20e0c61e0684 7 *
ganlikun 0:20e0c61e0684 8 * http://www.apache.org/licenses/LICENSE-2.0
ganlikun 0:20e0c61e0684 9 *
ganlikun 0:20e0c61e0684 10 * Unless required by applicable law or agreed to in writing, software
ganlikun 0:20e0c61e0684 11 * distributed under the License is distributed on an "AS IS" BASIS,
ganlikun 0:20e0c61e0684 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
ganlikun 0:20e0c61e0684 13 * See the License for the specific language governing permissions and
ganlikun 0:20e0c61e0684 14 * limitations under the License.
ganlikun 0:20e0c61e0684 15 */
ganlikun 0:20e0c61e0684 16 #include "drivers/BusIn.h"
ganlikun 0:20e0c61e0684 17 #include "platform/mbed_assert.h"
ganlikun 0:20e0c61e0684 18
ganlikun 0:20e0c61e0684 19 namespace mbed {
ganlikun 0:20e0c61e0684 20
ganlikun 0:20e0c61e0684 21 BusIn::BusIn(PinName p0, PinName p1, PinName p2, PinName p3, PinName p4, PinName p5, PinName p6, PinName p7, PinName p8, PinName p9, PinName p10, PinName p11, PinName p12, PinName p13, PinName p14, PinName p15) {
ganlikun 0:20e0c61e0684 22 PinName pins[16] = {p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15};
ganlikun 0:20e0c61e0684 23
ganlikun 0:20e0c61e0684 24 // No lock needed in the constructor
ganlikun 0:20e0c61e0684 25 _nc_mask = 0;
ganlikun 0:20e0c61e0684 26 for (int i=0; i<16; i++) {
ganlikun 0:20e0c61e0684 27 _pin[i] = (pins[i] != NC) ? new DigitalIn(pins[i]) : 0;
ganlikun 0:20e0c61e0684 28 if (pins[i] != NC) {
ganlikun 0:20e0c61e0684 29 _nc_mask |= (1 << i);
ganlikun 0:20e0c61e0684 30 }
ganlikun 0:20e0c61e0684 31 }
ganlikun 0:20e0c61e0684 32 }
ganlikun 0:20e0c61e0684 33
ganlikun 0:20e0c61e0684 34 BusIn::BusIn(PinName pins[16]) {
ganlikun 0:20e0c61e0684 35 // No lock needed in the constructor
ganlikun 0:20e0c61e0684 36 _nc_mask = 0;
ganlikun 0:20e0c61e0684 37 for (int i=0; i<16; i++) {
ganlikun 0:20e0c61e0684 38 _pin[i] = (pins[i] != NC) ? new DigitalIn(pins[i]) : 0;
ganlikun 0:20e0c61e0684 39 if (pins[i] != NC) {
ganlikun 0:20e0c61e0684 40 _nc_mask |= (1 << i);
ganlikun 0:20e0c61e0684 41 }
ganlikun 0:20e0c61e0684 42 }
ganlikun 0:20e0c61e0684 43 }
ganlikun 0:20e0c61e0684 44
ganlikun 0:20e0c61e0684 45 BusIn::~BusIn() {
ganlikun 0:20e0c61e0684 46 // No lock needed in the destructor
ganlikun 0:20e0c61e0684 47 for (int i=0; i<16; i++) {
ganlikun 0:20e0c61e0684 48 if (_pin[i] != 0) {
ganlikun 0:20e0c61e0684 49 delete _pin[i];
ganlikun 0:20e0c61e0684 50 }
ganlikun 0:20e0c61e0684 51 }
ganlikun 0:20e0c61e0684 52 }
ganlikun 0:20e0c61e0684 53
ganlikun 0:20e0c61e0684 54 int BusIn::read() {
ganlikun 0:20e0c61e0684 55 int v = 0;
ganlikun 0:20e0c61e0684 56 lock();
ganlikun 0:20e0c61e0684 57 for (int i=0; i<16; i++) {
ganlikun 0:20e0c61e0684 58 if (_pin[i] != 0) {
ganlikun 0:20e0c61e0684 59 v |= _pin[i]->read() << i;
ganlikun 0:20e0c61e0684 60 }
ganlikun 0:20e0c61e0684 61 }
ganlikun 0:20e0c61e0684 62 unlock();
ganlikun 0:20e0c61e0684 63 return v;
ganlikun 0:20e0c61e0684 64 }
ganlikun 0:20e0c61e0684 65
ganlikun 0:20e0c61e0684 66 void BusIn::mode(PinMode pull) {
ganlikun 0:20e0c61e0684 67 lock();
ganlikun 0:20e0c61e0684 68 for (int i=0; i<16; i++) {
ganlikun 0:20e0c61e0684 69 if (_pin[i] != 0) {
ganlikun 0:20e0c61e0684 70 _pin[i]->mode(pull);
ganlikun 0:20e0c61e0684 71 }
ganlikun 0:20e0c61e0684 72 }
ganlikun 0:20e0c61e0684 73 unlock();
ganlikun 0:20e0c61e0684 74 }
ganlikun 0:20e0c61e0684 75
ganlikun 0:20e0c61e0684 76 void BusIn::lock() {
ganlikun 0:20e0c61e0684 77 _mutex.lock();
ganlikun 0:20e0c61e0684 78 }
ganlikun 0:20e0c61e0684 79
ganlikun 0:20e0c61e0684 80 void BusIn::unlock() {
ganlikun 0:20e0c61e0684 81 _mutex.unlock();
ganlikun 0:20e0c61e0684 82 }
ganlikun 0:20e0c61e0684 83
ganlikun 0:20e0c61e0684 84 BusIn::operator int() {
ganlikun 0:20e0c61e0684 85 // Underlying read is thread safe
ganlikun 0:20e0c61e0684 86 return read();
ganlikun 0:20e0c61e0684 87 }
ganlikun 0:20e0c61e0684 88
ganlikun 0:20e0c61e0684 89 DigitalIn& BusIn::operator[] (int index) {
ganlikun 0:20e0c61e0684 90 // No lock needed since _pin is not modified outside the constructor
ganlikun 0:20e0c61e0684 91 MBED_ASSERT(index >= 0 && index <= 16);
ganlikun 0:20e0c61e0684 92 MBED_ASSERT(_pin[index]);
ganlikun 0:20e0c61e0684 93 return *_pin[index];
ganlikun 0:20e0c61e0684 94 }
ganlikun 0:20e0c61e0684 95
ganlikun 0:20e0c61e0684 96 } // namespace mbed
ganlikun 0:20e0c61e0684 97