Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of XBeeLib by
IO/IOSample802.cpp@4:629712865107, 2015-06-01 (annotated)
- Committer:
- spastor
- Date:
- Mon Jun 01 18:59:43 2015 +0200
- Revision:
- 4:629712865107
- Parent:
- 3:8662ebe83570
Automatic upload
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
spastor | 3:8662ebe83570 | 1 | /** |
spastor | 3:8662ebe83570 | 2 | * Copyright (c) 2015 Digi International Inc., |
spastor | 3:8662ebe83570 | 3 | * All rights not expressly granted are reserved. |
spastor | 3:8662ebe83570 | 4 | * |
spastor | 3:8662ebe83570 | 5 | * This Source Code Form is subject to the terms of the Mozilla Public |
spastor | 3:8662ebe83570 | 6 | * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
spastor | 3:8662ebe83570 | 7 | * You can obtain one at http://mozilla.org/MPL/2.0/. |
spastor | 3:8662ebe83570 | 8 | * |
spastor | 3:8662ebe83570 | 9 | * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343 |
spastor | 3:8662ebe83570 | 10 | * ======================================================================= |
spastor | 3:8662ebe83570 | 11 | */ |
spastor | 3:8662ebe83570 | 12 | |
spastor | 0:fcaad0dfa051 | 13 | #include "XBeeLib.h" |
spastor | 0:fcaad0dfa051 | 14 | #include "IO/IOSample802.h" |
spastor | 0:fcaad0dfa051 | 15 | #include "Utils/Debug.h" |
spastor | 0:fcaad0dfa051 | 16 | |
spastor | 0:fcaad0dfa051 | 17 | #define IO_SAMPLE_802_DIGITAL_INPUTS_MASK 0x01FF |
spastor | 0:fcaad0dfa051 | 18 | #define IO_SAMPLE_802_DIGITAL_INPUTS_COUNT 9 |
spastor | 0:fcaad0dfa051 | 19 | #define IO_SAMPLE_802_MIN_SIZE (2 + 2) |
spastor | 0:fcaad0dfa051 | 20 | |
spastor | 0:fcaad0dfa051 | 21 | using namespace XBeeLib; |
spastor | 0:fcaad0dfa051 | 22 | |
spastor | 0:fcaad0dfa051 | 23 | IOSample802::IOSample802(const uint8_t* const raw_data, size_t size) |
spastor | 0:fcaad0dfa051 | 24 | { |
spastor | 3:8662ebe83570 | 25 | if (raw_data == NULL || size == 0) { |
spastor | 3:8662ebe83570 | 26 | _channel_mask = 0; |
spastor | 3:8662ebe83570 | 27 | return; |
spastor | 3:8662ebe83570 | 28 | } |
spastor | 0:fcaad0dfa051 | 29 | assert(size >= IO_SAMPLE_802_MIN_SIZE); |
spastor | 0:fcaad0dfa051 | 30 | assert(size <= sizeof _sampled_data); |
spastor | 0:fcaad0dfa051 | 31 | |
spastor | 0:fcaad0dfa051 | 32 | _channel_mask = UINT16(raw_data[1], raw_data[2]); |
spastor | 0:fcaad0dfa051 | 33 | _sampled_data_size = size - 3; |
spastor | 0:fcaad0dfa051 | 34 | memcpy(&_sampled_data[0], &raw_data[3], _sampled_data_size); |
spastor | 0:fcaad0dfa051 | 35 | } |
spastor | 0:fcaad0dfa051 | 36 | |
spastor | 0:fcaad0dfa051 | 37 | IOSample802::~IOSample802() |
spastor | 0:fcaad0dfa051 | 38 | { |
spastor | 0:fcaad0dfa051 | 39 | |
spastor | 0:fcaad0dfa051 | 40 | } |
spastor | 0:fcaad0dfa051 | 41 | |
spastor | 0:fcaad0dfa051 | 42 | RadioStatus IOSample802::get_dio(XBee802::IoLine line, DioVal* const dio_value) const |
spastor | 0:fcaad0dfa051 | 43 | { |
spastor | 0:fcaad0dfa051 | 44 | if (line > XBee802::DI8) { |
spastor | 0:fcaad0dfa051 | 45 | digi_log(LogLevelError, "get_dio: Pin %d not supported as IO\r\n", line); |
spastor | 0:fcaad0dfa051 | 46 | return Failure; |
spastor | 0:fcaad0dfa051 | 47 | } |
spastor | 0:fcaad0dfa051 | 48 | |
spastor | 0:fcaad0dfa051 | 49 | const uint16_t mask = 1 << line; |
spastor | 0:fcaad0dfa051 | 50 | if (mask & _channel_mask) { |
spastor | 0:fcaad0dfa051 | 51 | const uint8_t digital_channels = get_dio_channels(); |
spastor | 0:fcaad0dfa051 | 52 | |
spastor | 0:fcaad0dfa051 | 53 | *dio_value = digital_channels & mask ? High : Low; |
spastor | 0:fcaad0dfa051 | 54 | return Success; |
spastor | 0:fcaad0dfa051 | 55 | } |
spastor | 0:fcaad0dfa051 | 56 | return Failure; |
spastor | 0:fcaad0dfa051 | 57 | } |
spastor | 0:fcaad0dfa051 | 58 | |
spastor | 0:fcaad0dfa051 | 59 | RadioStatus IOSample802::get_adc(XBee802::IoLine line, uint16_t* const val) const |
spastor | 0:fcaad0dfa051 | 60 | { |
spastor | 0:fcaad0dfa051 | 61 | if (line > XBee802::DIO5_AD5) { |
spastor | 0:fcaad0dfa051 | 62 | digi_log(LogLevelError, "get_adc: Pin %d not supported as ADC\r\n", line); |
spastor | 0:fcaad0dfa051 | 63 | return Failure; |
spastor | 0:fcaad0dfa051 | 64 | } |
spastor | 0:fcaad0dfa051 | 65 | const uint8_t analog_mask = _channel_mask >> IO_SAMPLE_802_DIGITAL_INPUTS_COUNT; |
spastor | 0:fcaad0dfa051 | 66 | const uint8_t line_mask = 1 << line; |
spastor | 0:fcaad0dfa051 | 67 | const bool adc_present = line_mask & analog_mask; |
spastor | 0:fcaad0dfa051 | 68 | if (!adc_present) { |
spastor | 0:fcaad0dfa051 | 69 | return Failure; |
spastor | 0:fcaad0dfa051 | 70 | } |
spastor | 0:fcaad0dfa051 | 71 | |
spastor | 0:fcaad0dfa051 | 72 | uint8_t analog_data_idx = dio_channels_present() == 0 ? 0 : 2; |
spastor | 0:fcaad0dfa051 | 73 | uint8_t line_sample = 0; |
spastor | 0:fcaad0dfa051 | 74 | |
spastor | 0:fcaad0dfa051 | 75 | while (analog_data_idx < _sampled_data_size) { |
spastor | 0:fcaad0dfa051 | 76 | if (analog_mask & (1 << line_sample)) { |
spastor | 0:fcaad0dfa051 | 77 | if (line_sample == line) { |
spastor | 0:fcaad0dfa051 | 78 | /* Write the analog value */ |
spastor | 0:fcaad0dfa051 | 79 | *val = UINT16(_sampled_data[analog_data_idx], _sampled_data[analog_data_idx + 1]); |
spastor | 0:fcaad0dfa051 | 80 | break; |
spastor | 0:fcaad0dfa051 | 81 | } |
spastor | 0:fcaad0dfa051 | 82 | analog_data_idx += 2; |
spastor | 0:fcaad0dfa051 | 83 | } |
spastor | 0:fcaad0dfa051 | 84 | line_sample++; |
spastor | 0:fcaad0dfa051 | 85 | } |
spastor | 0:fcaad0dfa051 | 86 | |
spastor | 0:fcaad0dfa051 | 87 | return Success; |
spastor | 0:fcaad0dfa051 | 88 | } |
spastor | 0:fcaad0dfa051 | 89 | |
spastor | 0:fcaad0dfa051 | 90 | inline bool IOSample802::dio_channels_present(void) const |
spastor | 0:fcaad0dfa051 | 91 | { |
spastor | 0:fcaad0dfa051 | 92 | return _channel_mask & IO_SAMPLE_802_DIGITAL_INPUTS_MASK; |
spastor | 0:fcaad0dfa051 | 93 | } |
spastor | 0:fcaad0dfa051 | 94 | |
spastor | 0:fcaad0dfa051 | 95 | inline uint8_t IOSample802::get_dio_channels(void) const |
spastor | 0:fcaad0dfa051 | 96 | { |
spastor | 0:fcaad0dfa051 | 97 | if (dio_channels_present()) { |
spastor | 0:fcaad0dfa051 | 98 | return UINT16(_sampled_data[0], _sampled_data[1]); |
spastor | 4:629712865107 | 99 | } else { |
spastor | 0:fcaad0dfa051 | 100 | return 0; |
spastor | 0:fcaad0dfa051 | 101 | } |
spastor | 0:fcaad0dfa051 | 102 | } |