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/IOSampleDM.cpp@10:b04b7e0672a9, 2016-12-16 (annotated)
- Committer:
- kingkingyyk
- Date:
- Fri Dec 16 02:59:15 2016 +0000
- Revision:
- 10:b04b7e0672a9
- Parent:
- 6:06522f3a6642
first commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hbujanda | 6:06522f3a6642 | 1 | /** |
hbujanda | 6:06522f3a6642 | 2 | * Copyright (c) 2015 Digi International Inc., |
hbujanda | 6:06522f3a6642 | 3 | * All rights not expressly granted are reserved. |
hbujanda | 6:06522f3a6642 | 4 | * |
hbujanda | 6:06522f3a6642 | 5 | * This Source Code Form is subject to the terms of the Mozilla Public |
hbujanda | 6:06522f3a6642 | 6 | * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
hbujanda | 6:06522f3a6642 | 7 | * You can obtain one at http://mozilla.org/MPL/2.0/. |
hbujanda | 6:06522f3a6642 | 8 | * |
hbujanda | 6:06522f3a6642 | 9 | * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343 |
hbujanda | 6:06522f3a6642 | 10 | * ======================================================================= |
hbujanda | 6:06522f3a6642 | 11 | */ |
hbujanda | 6:06522f3a6642 | 12 | |
hbujanda | 6:06522f3a6642 | 13 | #include "XBeeLib.h" |
hbujanda | 6:06522f3a6642 | 14 | #include "IO/IOSampleDM.h" |
hbujanda | 6:06522f3a6642 | 15 | |
hbujanda | 6:06522f3a6642 | 16 | #define IO_SAMPLE_DM_MIN_SIZE (2 + 1 + 2) |
hbujanda | 6:06522f3a6642 | 17 | |
hbujanda | 6:06522f3a6642 | 18 | using namespace XBeeLib; |
hbujanda | 6:06522f3a6642 | 19 | |
hbujanda | 6:06522f3a6642 | 20 | IOSampleDM::IOSampleDM(const uint8_t* const raw_data, size_t size) |
hbujanda | 6:06522f3a6642 | 21 | { |
hbujanda | 6:06522f3a6642 | 22 | if (raw_data == NULL || size == 0) { |
hbujanda | 6:06522f3a6642 | 23 | _digital_mask = 0; |
hbujanda | 6:06522f3a6642 | 24 | _analog_mask = 0; |
hbujanda | 6:06522f3a6642 | 25 | return; |
hbujanda | 6:06522f3a6642 | 26 | } |
hbujanda | 6:06522f3a6642 | 27 | assert(size >= IO_SAMPLE_DM_MIN_SIZE); |
hbujanda | 6:06522f3a6642 | 28 | assert(size <= sizeof _sampled_data); |
hbujanda | 6:06522f3a6642 | 29 | |
hbujanda | 6:06522f3a6642 | 30 | _digital_mask = UINT16(raw_data[1], raw_data[2]); |
hbujanda | 6:06522f3a6642 | 31 | _analog_mask = raw_data[3]; |
hbujanda | 6:06522f3a6642 | 32 | _sampled_data_size = size - 4; |
hbujanda | 6:06522f3a6642 | 33 | memcpy(&_sampled_data[0], &raw_data[4], _sampled_data_size); |
hbujanda | 6:06522f3a6642 | 34 | } |
hbujanda | 6:06522f3a6642 | 35 | |
hbujanda | 6:06522f3a6642 | 36 | IOSampleDM::~IOSampleDM() |
hbujanda | 6:06522f3a6642 | 37 | { |
hbujanda | 6:06522f3a6642 | 38 | |
hbujanda | 6:06522f3a6642 | 39 | } |
hbujanda | 6:06522f3a6642 | 40 | |
hbujanda | 6:06522f3a6642 | 41 | RadioStatus IOSampleDM::get_dio(XBeeDM::IoLine line, DioVal* const dio_value) const |
hbujanda | 6:06522f3a6642 | 42 | { |
hbujanda | 6:06522f3a6642 | 43 | const uint16_t mask = 1 << line; |
hbujanda | 6:06522f3a6642 | 44 | if (mask & _digital_mask) { |
hbujanda | 6:06522f3a6642 | 45 | const uint16_t digital_channels = get_digital_channels(); |
hbujanda | 6:06522f3a6642 | 46 | |
hbujanda | 6:06522f3a6642 | 47 | *dio_value = digital_channels & mask ? High : Low; |
hbujanda | 6:06522f3a6642 | 48 | return Success; |
hbujanda | 6:06522f3a6642 | 49 | } |
hbujanda | 6:06522f3a6642 | 50 | return Failure; |
hbujanda | 6:06522f3a6642 | 51 | } |
hbujanda | 6:06522f3a6642 | 52 | |
hbujanda | 6:06522f3a6642 | 53 | RadioStatus IOSampleDM::get_adc(XBeeDM::IoLine line, uint16_t* const val) const |
hbujanda | 6:06522f3a6642 | 54 | { |
hbujanda | 6:06522f3a6642 | 55 | const uint8_t line_mask = 1 << line; |
hbujanda | 6:06522f3a6642 | 56 | const bool adc_present = line_mask & _analog_mask; |
hbujanda | 6:06522f3a6642 | 57 | if (!adc_present) { |
hbujanda | 6:06522f3a6642 | 58 | return Failure; |
hbujanda | 6:06522f3a6642 | 59 | } |
hbujanda | 6:06522f3a6642 | 60 | |
hbujanda | 6:06522f3a6642 | 61 | uint8_t analog_data_idx = _digital_mask == 0 ? 0 : 2; |
hbujanda | 6:06522f3a6642 | 62 | uint8_t line_sample = 0; |
hbujanda | 6:06522f3a6642 | 63 | |
hbujanda | 6:06522f3a6642 | 64 | while (analog_data_idx < _sampled_data_size) { |
hbujanda | 6:06522f3a6642 | 65 | if (_analog_mask & (1 << line_sample)) { |
hbujanda | 6:06522f3a6642 | 66 | if (line_sample == line) { |
hbujanda | 6:06522f3a6642 | 67 | /* Write the analog value */ |
hbujanda | 6:06522f3a6642 | 68 | *val = UINT16(_sampled_data[analog_data_idx], _sampled_data[analog_data_idx + 1]); |
hbujanda | 6:06522f3a6642 | 69 | break; |
hbujanda | 6:06522f3a6642 | 70 | } |
hbujanda | 6:06522f3a6642 | 71 | analog_data_idx += 2; |
hbujanda | 6:06522f3a6642 | 72 | } |
hbujanda | 6:06522f3a6642 | 73 | line_sample++; |
hbujanda | 6:06522f3a6642 | 74 | } |
hbujanda | 6:06522f3a6642 | 75 | |
hbujanda | 6:06522f3a6642 | 76 | return Success; |
hbujanda | 6:06522f3a6642 | 77 | } |
hbujanda | 6:06522f3a6642 | 78 | |
hbujanda | 6:06522f3a6642 | 79 | inline uint16_t IOSampleDM::get_digital_channels(void) const |
hbujanda | 6:06522f3a6642 | 80 | { |
hbujanda | 6:06522f3a6642 | 81 | if (_digital_mask == 0) { |
hbujanda | 6:06522f3a6642 | 82 | return 0; |
hbujanda | 6:06522f3a6642 | 83 | } |
hbujanda | 6:06522f3a6642 | 84 | return UINT16(_sampled_data[0], _sampled_data[1]); |
hbujanda | 6:06522f3a6642 | 85 | } |
hbujanda | 6:06522f3a6642 | 86 |