XBee modules

Dependencies:   DigiLogger

Fork of XBeeLib by Digi International Inc.

Committer:
Javier117
Date:
Tue Oct 18 20:47:11 2016 +0000
Revision:
10:6b922add27d7
Parent:
6:06522f3a6642
No DebugLogger

Who changed what in which revision?

UserRevisionLine numberNew 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