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/BusOut.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 BusOut::BusOut(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 DigitalOut(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 BusOut::BusOut(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 DigitalOut(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 BusOut::~BusOut() {
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 void BusOut::write(int value) {
ganlikun 0:20e0c61e0684 55 lock();
ganlikun 0:20e0c61e0684 56 for (int i=0; i<16; i++) {
ganlikun 0:20e0c61e0684 57 if (_pin[i] != 0) {
ganlikun 0:20e0c61e0684 58 _pin[i]->write((value >> i) & 1);
ganlikun 0:20e0c61e0684 59 }
ganlikun 0:20e0c61e0684 60 }
ganlikun 0:20e0c61e0684 61 unlock();
ganlikun 0:20e0c61e0684 62 }
ganlikun 0:20e0c61e0684 63
ganlikun 0:20e0c61e0684 64 int BusOut::read() {
ganlikun 0:20e0c61e0684 65 lock();
ganlikun 0:20e0c61e0684 66 int v = 0;
ganlikun 0:20e0c61e0684 67 for (int i=0; i<16; i++) {
ganlikun 0:20e0c61e0684 68 if (_pin[i] != 0) {
ganlikun 0:20e0c61e0684 69 v |= _pin[i]->read() << i;
ganlikun 0:20e0c61e0684 70 }
ganlikun 0:20e0c61e0684 71 }
ganlikun 0:20e0c61e0684 72 unlock();
ganlikun 0:20e0c61e0684 73 return v;
ganlikun 0:20e0c61e0684 74 }
ganlikun 0:20e0c61e0684 75
ganlikun 0:20e0c61e0684 76 BusOut& BusOut::operator= (int v) {
ganlikun 0:20e0c61e0684 77 // Underlying write is thread safe
ganlikun 0:20e0c61e0684 78 write(v);
ganlikun 0:20e0c61e0684 79 return *this;
ganlikun 0:20e0c61e0684 80 }
ganlikun 0:20e0c61e0684 81
ganlikun 0:20e0c61e0684 82 BusOut& BusOut::operator= (BusOut& rhs) {
ganlikun 0:20e0c61e0684 83 // Underlying write is thread safe
ganlikun 0:20e0c61e0684 84 write(rhs.read());
ganlikun 0:20e0c61e0684 85 return *this;
ganlikun 0:20e0c61e0684 86 }
ganlikun 0:20e0c61e0684 87
ganlikun 0:20e0c61e0684 88 DigitalOut& BusOut::operator[] (int index) {
ganlikun 0:20e0c61e0684 89 // No lock needed since _pin is not modified outside the constructor
ganlikun 0:20e0c61e0684 90 MBED_ASSERT(index >= 0 && index <= 16);
ganlikun 0:20e0c61e0684 91 MBED_ASSERT(_pin[index]);
ganlikun 0:20e0c61e0684 92 return *_pin[index];
ganlikun 0:20e0c61e0684 93 }
ganlikun 0:20e0c61e0684 94
ganlikun 0:20e0c61e0684 95 BusOut::operator int() {
ganlikun 0:20e0c61e0684 96 // Underlying read is thread safe
ganlikun 0:20e0c61e0684 97 return read();
ganlikun 0:20e0c61e0684 98 }
ganlikun 0:20e0c61e0684 99
ganlikun 0:20e0c61e0684 100 void BusOut::lock() {
ganlikun 0:20e0c61e0684 101 _mutex.lock();
ganlikun 0:20e0c61e0684 102 }
ganlikun 0:20e0c61e0684 103
ganlikun 0:20e0c61e0684 104 void BusOut::unlock() {
ganlikun 0:20e0c61e0684 105 _mutex.unlock();
ganlikun 0:20e0c61e0684 106 }
ganlikun 0:20e0c61e0684 107
ganlikun 0:20e0c61e0684 108 } // namespace mbed