Library to easily communicate with XBee modules.

Fork of XBeeLib by Digi International Inc.

Committer:
spastor
Date:
Fri May 08 11:50:56 2015 +0200
Revision:
0:fcaad0dfa051
Child:
3:8662ebe83570
Automatic upload

Who changed what in which revision?

UserRevisionLine numberNew contents of line
spastor 0:fcaad0dfa051 1 #include "XBeeLib.h"
spastor 0:fcaad0dfa051 2 #include "IO/IOSample802.h"
spastor 0:fcaad0dfa051 3 #include "Utils/Debug.h"
spastor 0:fcaad0dfa051 4
spastor 0:fcaad0dfa051 5 #define IO_SAMPLE_802_DIGITAL_INPUTS_MASK 0x01FF
spastor 0:fcaad0dfa051 6 #define IO_SAMPLE_802_DIGITAL_INPUTS_COUNT 9
spastor 0:fcaad0dfa051 7 #define IO_SAMPLE_802_MIN_SIZE (2 + 2)
spastor 0:fcaad0dfa051 8
spastor 0:fcaad0dfa051 9 using namespace XBeeLib;
spastor 0:fcaad0dfa051 10
spastor 0:fcaad0dfa051 11 IOSample802::IOSample802(const uint8_t* const raw_data, size_t size)
spastor 0:fcaad0dfa051 12 {
spastor 0:fcaad0dfa051 13 assert(size >= IO_SAMPLE_802_MIN_SIZE);
spastor 0:fcaad0dfa051 14 assert(size <= sizeof _sampled_data);
spastor 0:fcaad0dfa051 15
spastor 0:fcaad0dfa051 16 _channel_mask = UINT16(raw_data[1], raw_data[2]);
spastor 0:fcaad0dfa051 17 _sampled_data_size = size - 3;
spastor 0:fcaad0dfa051 18 memcpy(&_sampled_data[0], &raw_data[3], _sampled_data_size);
spastor 0:fcaad0dfa051 19 }
spastor 0:fcaad0dfa051 20
spastor 0:fcaad0dfa051 21 IOSample802::~IOSample802()
spastor 0:fcaad0dfa051 22 {
spastor 0:fcaad0dfa051 23
spastor 0:fcaad0dfa051 24 }
spastor 0:fcaad0dfa051 25
spastor 0:fcaad0dfa051 26 RadioStatus IOSample802::get_dio(XBee802::IoLine line, DioVal* const dio_value) const
spastor 0:fcaad0dfa051 27 {
spastor 0:fcaad0dfa051 28 if (line > XBee802::DI8) {
spastor 0:fcaad0dfa051 29 digi_log(LogLevelError, "get_dio: Pin %d not supported as IO\r\n", line);
spastor 0:fcaad0dfa051 30 return Failure;
spastor 0:fcaad0dfa051 31 }
spastor 0:fcaad0dfa051 32
spastor 0:fcaad0dfa051 33 const uint16_t mask = 1 << line;
spastor 0:fcaad0dfa051 34 if (mask & _channel_mask) {
spastor 0:fcaad0dfa051 35 const uint8_t digital_channels = get_dio_channels();
spastor 0:fcaad0dfa051 36
spastor 0:fcaad0dfa051 37 *dio_value = digital_channels & mask ? High : Low;
spastor 0:fcaad0dfa051 38 return Success;
spastor 0:fcaad0dfa051 39 }
spastor 0:fcaad0dfa051 40 return Failure;
spastor 0:fcaad0dfa051 41 }
spastor 0:fcaad0dfa051 42
spastor 0:fcaad0dfa051 43 RadioStatus IOSample802::get_adc(XBee802::IoLine line, uint16_t* const val) const
spastor 0:fcaad0dfa051 44 {
spastor 0:fcaad0dfa051 45 if (line > XBee802::DIO5_AD5) {
spastor 0:fcaad0dfa051 46 digi_log(LogLevelError, "get_adc: Pin %d not supported as ADC\r\n", line);
spastor 0:fcaad0dfa051 47 return Failure;
spastor 0:fcaad0dfa051 48 }
spastor 0:fcaad0dfa051 49 const uint8_t analog_mask = _channel_mask >> IO_SAMPLE_802_DIGITAL_INPUTS_COUNT;
spastor 0:fcaad0dfa051 50 const uint8_t line_mask = 1 << line;
spastor 0:fcaad0dfa051 51 const bool adc_present = line_mask & analog_mask;
spastor 0:fcaad0dfa051 52 if (!adc_present) {
spastor 0:fcaad0dfa051 53 return Failure;
spastor 0:fcaad0dfa051 54 }
spastor 0:fcaad0dfa051 55
spastor 0:fcaad0dfa051 56 uint8_t analog_data_idx = dio_channels_present() == 0 ? 0 : 2;
spastor 0:fcaad0dfa051 57 uint8_t line_sample = 0;
spastor 0:fcaad0dfa051 58
spastor 0:fcaad0dfa051 59 while (analog_data_idx < _sampled_data_size) {
spastor 0:fcaad0dfa051 60 if (analog_mask & (1 << line_sample)) {
spastor 0:fcaad0dfa051 61 if (line_sample == line) {
spastor 0:fcaad0dfa051 62 /* Write the analog value */
spastor 0:fcaad0dfa051 63 *val = UINT16(_sampled_data[analog_data_idx], _sampled_data[analog_data_idx + 1]);
spastor 0:fcaad0dfa051 64 break;
spastor 0:fcaad0dfa051 65 }
spastor 0:fcaad0dfa051 66 analog_data_idx += 2;
spastor 0:fcaad0dfa051 67 }
spastor 0:fcaad0dfa051 68 line_sample++;
spastor 0:fcaad0dfa051 69 }
spastor 0:fcaad0dfa051 70
spastor 0:fcaad0dfa051 71 return Success;
spastor 0:fcaad0dfa051 72 }
spastor 0:fcaad0dfa051 73
spastor 0:fcaad0dfa051 74 inline bool IOSample802::dio_channels_present(void) const
spastor 0:fcaad0dfa051 75 {
spastor 0:fcaad0dfa051 76 return _channel_mask & IO_SAMPLE_802_DIGITAL_INPUTS_MASK;
spastor 0:fcaad0dfa051 77 }
spastor 0:fcaad0dfa051 78
spastor 0:fcaad0dfa051 79 inline uint8_t IOSample802::get_dio_channels(void) const
spastor 0:fcaad0dfa051 80 {
spastor 0:fcaad0dfa051 81 if (dio_channels_present()) {
spastor 0:fcaad0dfa051 82 return UINT16(_sampled_data[0], _sampled_data[1]);
spastor 0:fcaad0dfa051 83 }
spastor 0:fcaad0dfa051 84 else {
spastor 0:fcaad0dfa051 85 return 0;
spastor 0:fcaad0dfa051 86 }
spastor 0:fcaad0dfa051 87 }