Library to easily communicate with XBee modules.

Fork of XBeeLib by Digi International Inc.

Committer:
basvuyk
Date:
Tue Mar 27 14:13:12 2018 +0000
Revision:
10:273032d9299a
Parent:
3:8662ebe83570
Slave V1.0

Who changed what in which revision?

UserRevisionLine numberNew 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/IOSampleZB.h"
spastor 0:fcaad0dfa051 15
spastor 0:fcaad0dfa051 16 #define IO_SAMPLE_ZB_MIN_SIZE (2 + 1 + 2)
spastor 0:fcaad0dfa051 17
spastor 0:fcaad0dfa051 18 using namespace XBeeLib;
spastor 0:fcaad0dfa051 19
spastor 0:fcaad0dfa051 20 IOSampleZB::IOSampleZB(const uint8_t* const raw_data, size_t size)
spastor 0:fcaad0dfa051 21 {
spastor 3:8662ebe83570 22 if (raw_data == NULL || size == 0) {
spastor 3:8662ebe83570 23 _digital_mask = 0;
spastor 3:8662ebe83570 24 _analog_mask = 0;
spastor 3:8662ebe83570 25 return;
spastor 3:8662ebe83570 26 }
spastor 0:fcaad0dfa051 27 assert(size >= IO_SAMPLE_ZB_MIN_SIZE);
spastor 0:fcaad0dfa051 28 assert(size <= sizeof _sampled_data);
spastor 0:fcaad0dfa051 29
spastor 0:fcaad0dfa051 30 _digital_mask = UINT16(raw_data[1], raw_data[2]);
spastor 0:fcaad0dfa051 31 _analog_mask = raw_data[3];
spastor 0:fcaad0dfa051 32 _sampled_data_size = size - 4;
spastor 0:fcaad0dfa051 33 memcpy(&_sampled_data[0], &raw_data[4], _sampled_data_size);
spastor 0:fcaad0dfa051 34 }
spastor 0:fcaad0dfa051 35
spastor 0:fcaad0dfa051 36 IOSampleZB::~IOSampleZB()
spastor 0:fcaad0dfa051 37 {
spastor 0:fcaad0dfa051 38
spastor 0:fcaad0dfa051 39 }
spastor 0:fcaad0dfa051 40
spastor 0:fcaad0dfa051 41 RadioStatus IOSampleZB::get_dio(XBeeZB::IoLine line, DioVal* const dio_value) const
spastor 0:fcaad0dfa051 42 {
spastor 0:fcaad0dfa051 43 const uint16_t mask = 1 << line;
spastor 0:fcaad0dfa051 44 if (mask & _digital_mask) {
spastor 0:fcaad0dfa051 45 const uint16_t digital_channels = get_digital_channels();
spastor 0:fcaad0dfa051 46
spastor 0:fcaad0dfa051 47 *dio_value = digital_channels & mask ? High : Low;
spastor 0:fcaad0dfa051 48 return Success;
spastor 0:fcaad0dfa051 49 }
spastor 0:fcaad0dfa051 50 return Failure;
spastor 0:fcaad0dfa051 51 }
spastor 0:fcaad0dfa051 52
spastor 0:fcaad0dfa051 53 RadioStatus IOSampleZB::get_adc(XBeeZB::IoLine line, uint16_t* const val) const
spastor 0:fcaad0dfa051 54 {
spastor 0:fcaad0dfa051 55 const uint8_t line_mask = 1 << line;
spastor 0:fcaad0dfa051 56 const bool adc_present = line_mask & _analog_mask;
spastor 0:fcaad0dfa051 57 if (!adc_present) {
spastor 0:fcaad0dfa051 58 return Failure;
spastor 0:fcaad0dfa051 59 }
spastor 0:fcaad0dfa051 60
spastor 0:fcaad0dfa051 61 uint8_t analog_data_idx = _digital_mask == 0 ? 0 : 2;
spastor 0:fcaad0dfa051 62 uint8_t line_sample = 0;
spastor 0:fcaad0dfa051 63
spastor 0:fcaad0dfa051 64 while (analog_data_idx < _sampled_data_size) {
spastor 0:fcaad0dfa051 65 if (_analog_mask & (1 << line_sample)) {
spastor 0:fcaad0dfa051 66 if (line_sample == line) {
spastor 0:fcaad0dfa051 67 /* Write the analog value */
spastor 0:fcaad0dfa051 68 *val = UINT16(_sampled_data[analog_data_idx], _sampled_data[analog_data_idx + 1]);
spastor 0:fcaad0dfa051 69 break;
spastor 0:fcaad0dfa051 70 }
spastor 0:fcaad0dfa051 71 analog_data_idx += 2;
spastor 0:fcaad0dfa051 72 }
spastor 0:fcaad0dfa051 73 line_sample++;
spastor 0:fcaad0dfa051 74 }
spastor 0:fcaad0dfa051 75
spastor 0:fcaad0dfa051 76 return Success;
spastor 0:fcaad0dfa051 77 }
spastor 0:fcaad0dfa051 78
spastor 0:fcaad0dfa051 79 inline uint16_t IOSampleZB::get_digital_channels(void) const
spastor 0:fcaad0dfa051 80 {
spastor 0:fcaad0dfa051 81 if (_digital_mask == 0) {
spastor 0:fcaad0dfa051 82 return 0;
spastor 0:fcaad0dfa051 83 }
spastor 0:fcaad0dfa051 84 return UINT16(_sampled_data[0], _sampled_data[1]);
spastor 0:fcaad0dfa051 85 }
spastor 0:fcaad0dfa051 86