BA / SerialCom

Fork of OmniWheels by Gustav Atmel

Committer:
gustavatmel
Date:
Tue May 01 15:47:08 2018 +0000
Revision:
1:9c5af431a1f1
sdf

Who changed what in which revision?

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