123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 |
- /*
- * The MySensors Arduino library handles the wireless radio link and protocol
- * between your home built sensors/actuators and HA controller of choice.
- * The sensors forms a self healing radio network with optional repeaters. Each
- * repeater and gateway builds a routing tables in EEPROM which keeps track of the
- * network topology allowing messages to be routed to nodes.
- *
- * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
- * Copyright (C) 2013-2018 Sensnology AB
- * Full contributor list: https://github.com/mysensors/MySensors/graphs/contributors
- *
- * Documentation: http://www.mysensors.org
- * Support Forum: http://forum.mysensors.org
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * version 2 as published by the Free Software Foundation.
- */
-
-
- #include "MyMessage.h"
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-
- MyMessage::MyMessage(void)
- {
- clear();
- }
-
- MyMessage::MyMessage(const uint8_t _sensor, const uint8_t _type)
- {
- clear();
- sensor = _sensor;
- type = _type;
- }
-
- void MyMessage::clear(void)
- {
- last = 0u;
- sender = 0u;
- destination = 0u; // Gateway is default destination
- version_length = 0u;
- command_ack_payload = 0u;
- type = 0u;
- sensor = 0u;
- (void)memset(data, 0u, sizeof(data));
-
- // set message protocol version
- miSetVersion(PROTOCOL_VERSION);
- }
-
- bool MyMessage::isAck(void) const
- {
- return miGetAck();
- }
-
- uint8_t MyMessage::getCommand(void) const
- {
- return miGetCommand();
- }
-
- /* Getters for payload converted to desired form */
- void* MyMessage::getCustom(void) const
- {
- return (void *)data;
- }
-
- const char* MyMessage::getString(void) const
- {
- uint8_t payloadType = miGetPayloadType();
- if (payloadType == P_STRING) {
- return data;
- } else {
- return NULL;
- }
- }
-
- char MyMessage::i2h(const uint8_t i) const
- {
- uint8_t k = i & 0x0F;
- if (k <= 9) {
- return '0' + k;
- } else {
- return 'A' + k - 10;
- }
- }
-
- char* MyMessage::getCustomString(char *buffer) const
- {
- for (uint8_t i = 0; i < miGetLength(); i++) {
- buffer[i * 2] = i2h(data[i] >> 4);
- buffer[(i * 2) + 1] = i2h(data[i]);
- }
- buffer[miGetLength() * 2] = '\0';
- return buffer;
- }
-
- char* MyMessage::getStream(char *buffer) const
- {
- uint8_t cmd = miGetCommand();
- if ((cmd == C_STREAM) && (buffer != NULL)) {
- return getCustomString(buffer);
- } else {
- return NULL;
- }
- }
-
- char* MyMessage::getString(char *buffer) const
- {
- uint8_t payloadType = miGetPayloadType();
- if (buffer != NULL) {
- if (payloadType == P_STRING) {
- (void)strncpy(buffer, data, miGetLength());
- buffer[miGetLength()] = 0;
- } else if (payloadType == P_BYTE) {
- (void)itoa(bValue, buffer, 10);
- } else if (payloadType == P_INT16) {
- (void)itoa(iValue, buffer, 10);
- } else if (payloadType == P_UINT16) {
- (void)utoa(uiValue, buffer, 10);
- } else if (payloadType == P_LONG32) {
- (void)ltoa(lValue, buffer, 10);
- } else if (payloadType == P_ULONG32) {
- (void)ultoa(ulValue, buffer, 10);
- } else if (payloadType == P_FLOAT32) {
- (void)dtostrf(fValue, 2, min(fPrecision, (uint8_t)8), buffer);
- } else if (payloadType == P_CUSTOM) {
- return getCustomString(buffer);
- }
- return buffer;
- } else {
- return NULL;
- }
- }
-
- bool MyMessage::getBool(void) const
- {
- return getByte();
- }
-
- uint8_t MyMessage::getByte(void) const
- {
- if (miGetPayloadType() == P_BYTE) {
- return data[0];
- } else if (miGetPayloadType() == P_STRING) {
- return atoi(data);
- } else {
- return 0;
- }
- }
-
-
- float MyMessage::getFloat(void) const
- {
- if (miGetPayloadType() == P_FLOAT32) {
- return fValue;
- } else if (miGetPayloadType() == P_STRING) {
- return atof(data);
- } else {
- return 0;
- }
- }
-
- int32_t MyMessage::getLong(void) const
- {
- if (miGetPayloadType() == P_LONG32) {
- return lValue;
- } else if (miGetPayloadType() == P_STRING) {
- return atol(data);
- } else {
- return 0;
- }
- }
-
- uint32_t MyMessage::getULong(void) const
- {
- if (miGetPayloadType() == P_ULONG32) {
- return ulValue;
- } else if (miGetPayloadType() == P_STRING) {
- return atol(data);
- } else {
- return 0;
- }
- }
-
- int16_t MyMessage::getInt(void) const
- {
- if (miGetPayloadType() == P_INT16) {
- return iValue;
- } else if (miGetPayloadType() == P_STRING) {
- return atoi(data);
- } else {
- return 0;
- }
- }
-
- uint16_t MyMessage::getUInt(void) const
- {
- if (miGetPayloadType() == P_UINT16) {
- return uiValue;
- } else if (miGetPayloadType() == P_STRING) {
- return atoi(data);
- } else {
- return 0;
- }
-
- }
-
- MyMessage& MyMessage::setType(const uint8_t _type)
- {
- type = _type;
- return *this;
- }
-
- MyMessage& MyMessage::setSensor(const uint8_t _sensor)
- {
- sensor = _sensor;
- return *this;
- }
-
- MyMessage& MyMessage::setDestination(const uint8_t _destination)
- {
- destination = _destination;
- return *this;
- }
-
- // Set payload
- MyMessage& MyMessage::set(const void* value, const uint8_t length)
- {
- uint8_t payloadLength = value == NULL ? 0 : min(length, (uint8_t)MAX_PAYLOAD);
- miSetLength(payloadLength);
- miSetPayloadType(P_CUSTOM);
- memcpy(data, value, payloadLength);
- return *this;
- }
-
- MyMessage& MyMessage::set(const char* value)
- {
- uint8_t length = value == NULL ? 0 : min(strlen(value), (size_t)MAX_PAYLOAD);
- miSetLength(length);
- miSetPayloadType(P_STRING);
- if (length) {
- strncpy(data, value, length);
- }
- // null terminate string
- data[length] = 0;
- return *this;
- }
-
- #if !defined(__linux__)
- MyMessage& MyMessage::set(const __FlashStringHelper* value)
- {
- uint8_t length = value == NULL ? 0
- : min(strlen_P(reinterpret_cast<const char *>(value)), (size_t)MAX_PAYLOAD);
- miSetLength(length);
- miSetPayloadType(P_STRING);
- if (length) {
- strncpy_P(data, reinterpret_cast<const char *>(value), length);
- }
- // null terminate string
- data[length] = 0;
- return *this;
- }
- #endif
-
-
- MyMessage& MyMessage::set(const bool value)
- {
- miSetLength(1);
- miSetPayloadType(P_BYTE);
- data[0] = value;
- return *this;
- }
-
- MyMessage& MyMessage::set(const uint8_t value)
- {
- miSetLength(1);
- miSetPayloadType(P_BYTE);
- data[0] = value;
- return *this;
- }
-
- MyMessage& MyMessage::set(const float value, const uint8_t decimals)
- {
- miSetLength(5); // 32 bit float + persi
- miSetPayloadType(P_FLOAT32);
- fValue=value;
- fPrecision = decimals;
- return *this;
- }
-
- MyMessage& MyMessage::set(const uint32_t value)
- {
- miSetPayloadType(P_ULONG32);
- miSetLength(4);
- ulValue = value;
- return *this;
- }
-
- MyMessage& MyMessage::set(const int32_t value)
- {
- miSetPayloadType(P_LONG32);
- miSetLength(4);
- lValue = value;
- return *this;
- }
-
- MyMessage& MyMessage::set(const uint16_t value)
- {
- miSetPayloadType(P_UINT16);
- miSetLength(2);
- uiValue = value;
- return *this;
- }
-
- MyMessage& MyMessage::set(const int16_t value)
- {
- miSetPayloadType(P_INT16);
- miSetLength(2);
- iValue = value;
- return *this;
- }
|