Thinger.io Client Library for ARM mbed platform. This is a generic library that provides a base class that can be used to other develop hardware specific libraries.

Fork of ThingerClient by Alvaro Luis Bustamante

Committer:
alvarolb
Date:
Sat Dec 26 13:18:01 2015 +0000
Revision:
4:de51256455f7
Parent:
0:b75d784c7c1a
Adapter pson to properly work in ARM Mbed old compiler

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alvarolb 0:b75d784c7c1a 1 // The MIT License (MIT)
alvarolb 0:b75d784c7c1a 2 //
alvarolb 0:b75d784c7c1a 3 // Copyright (c) 2015 THINGER LTD
alvarolb 0:b75d784c7c1a 4 // Author: alvarolb@gmail.com (Alvaro Luis Bustamante)
alvarolb 0:b75d784c7c1a 5 //
alvarolb 0:b75d784c7c1a 6 // Permission is hereby granted, free of charge, to any person obtaining a copy
alvarolb 0:b75d784c7c1a 7 // of this software and associated documentation files (the "Software"), to deal
alvarolb 0:b75d784c7c1a 8 // in the Software without restriction, including without limitation the rights
alvarolb 0:b75d784c7c1a 9 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
alvarolb 0:b75d784c7c1a 10 // copies of the Software, and to permit persons to whom the Software is
alvarolb 0:b75d784c7c1a 11 // furnished to do so, subject to the following conditions:
alvarolb 0:b75d784c7c1a 12 //
alvarolb 0:b75d784c7c1a 13 // The above copyright notice and this permission notice shall be included in
alvarolb 0:b75d784c7c1a 14 // all copies or substantial portions of the Software.
alvarolb 0:b75d784c7c1a 15 //
alvarolb 0:b75d784c7c1a 16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
alvarolb 0:b75d784c7c1a 17 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
alvarolb 0:b75d784c7c1a 18 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
alvarolb 0:b75d784c7c1a 19 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
alvarolb 0:b75d784c7c1a 20 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
alvarolb 0:b75d784c7c1a 21 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
alvarolb 0:b75d784c7c1a 22 // THE SOFTWARE.
alvarolb 0:b75d784c7c1a 23
alvarolb 0:b75d784c7c1a 24 #ifndef THINGER_MESSAGE_HPP
alvarolb 0:b75d784c7c1a 25 #define THINGER_MESSAGE_HPP
alvarolb 0:b75d784c7c1a 26
alvarolb 0:b75d784c7c1a 27 #include "pson.h"
alvarolb 0:b75d784c7c1a 28
alvarolb 0:b75d784c7c1a 29 namespace thinger{
alvarolb 0:b75d784c7c1a 30
alvarolb 0:b75d784c7c1a 31 enum message_type{
alvarolb 0:b75d784c7c1a 32 MESSAGE = 1,
alvarolb 0:b75d784c7c1a 33 KEEP_ALIVE = 2
alvarolb 0:b75d784c7c1a 34 };
alvarolb 0:b75d784c7c1a 35
alvarolb 0:b75d784c7c1a 36 class thinger_message{
alvarolb 0:b75d784c7c1a 37
alvarolb 0:b75d784c7c1a 38 public:
alvarolb 0:b75d784c7c1a 39
alvarolb 0:b75d784c7c1a 40 // fields for a thinger message (encoded as in protocol buffers)
alvarolb 0:b75d784c7c1a 41 enum fields{
alvarolb 0:b75d784c7c1a 42 STREAM_ID = 1,
alvarolb 0:b75d784c7c1a 43 SIGNAL_FLAG = 2,
alvarolb 0:b75d784c7c1a 44 UNUSED = 3,
alvarolb 0:b75d784c7c1a 45 RESOURCE = 4,
alvarolb 0:b75d784c7c1a 46 UNUSED2 = 5,
alvarolb 0:b75d784c7c1a 47 PSON_PAYLOAD = 6
alvarolb 0:b75d784c7c1a 48 };
alvarolb 0:b75d784c7c1a 49
alvarolb 0:b75d784c7c1a 50 // flags for describing a thinger message
alvarolb 0:b75d784c7c1a 51 enum signal_flag {
alvarolb 0:b75d784c7c1a 52 // GENERAL USED FLAGS
alvarolb 0:b75d784c7c1a 53 REQUEST_OK = 1, // the request with the given stream id was successful
alvarolb 0:b75d784c7c1a 54 REQUEST_ERROR = 2, // the request with the given stream id failed
alvarolb 0:b75d784c7c1a 55
alvarolb 0:b75d784c7c1a 56 // SENT BY THE SERVER
alvarolb 0:b75d784c7c1a 57 NONE = 0, // default resource action: just execute the given resource
alvarolb 0:b75d784c7c1a 58 START_STREAM = 3, // enable a streaming resource (with stream_id, and resource filled, sample interval (in payload) is optional)
alvarolb 0:b75d784c7c1a 59 STOP_STREAM = 4, // stop the streaming resource (with stream_id, and resource filled)
alvarolb 0:b75d784c7c1a 60
alvarolb 0:b75d784c7c1a 61 // SENT BY DEVICE
alvarolb 0:b75d784c7c1a 62 AUTH = 5,
alvarolb 0:b75d784c7c1a 63 STREAM_EVENT = 6, // means that the message data is related to a stream event
alvarolb 0:b75d784c7c1a 64 STREAM_SAMPLE = 7, // means that the message is related to a periodical streaming sample
alvarolb 0:b75d784c7c1a 65 CALL_ENDPOINT = 8 // call the endpoint with the provided name (endpoint in resource, value passed in payload)
alvarolb 0:b75d784c7c1a 66 };
alvarolb 0:b75d784c7c1a 67
alvarolb 0:b75d784c7c1a 68 public:
alvarolb 0:b75d784c7c1a 69
alvarolb 0:b75d784c7c1a 70 /**
alvarolb 0:b75d784c7c1a 71 * Initialize a default response message setting the same stream id of the source message,
alvarolb 0:b75d784c7c1a 72 * and initializing the signal flag to ok. All remaining data or fields are empty
alvarolb 0:b75d784c7c1a 73 */
alvarolb 0:b75d784c7c1a 74 thinger_message(thinger_message& other) :
alvarolb 0:b75d784c7c1a 75 stream_id(other.stream_id),
alvarolb 0:b75d784c7c1a 76 flag(REQUEST_OK),
alvarolb 0:b75d784c7c1a 77 resource(NULL),
alvarolb 0:b75d784c7c1a 78 data(NULL),
alvarolb 0:b75d784c7c1a 79 data_allocated(false)
alvarolb 0:b75d784c7c1a 80 {}
alvarolb 0:b75d784c7c1a 81
alvarolb 0:b75d784c7c1a 82 /**
alvarolb 0:b75d784c7c1a 83 * Initialize a default empty message
alvarolb 0:b75d784c7c1a 84 */
alvarolb 0:b75d784c7c1a 85 thinger_message() :
alvarolb 0:b75d784c7c1a 86 stream_id(0),
alvarolb 0:b75d784c7c1a 87 flag(NONE),
alvarolb 0:b75d784c7c1a 88 resource(NULL),
alvarolb 0:b75d784c7c1a 89 data(NULL),
alvarolb 0:b75d784c7c1a 90 data_allocated(false)
alvarolb 0:b75d784c7c1a 91 {}
alvarolb 0:b75d784c7c1a 92
alvarolb 0:b75d784c7c1a 93 ~thinger_message(){
alvarolb 0:b75d784c7c1a 94 // deallocate resource
alvarolb 0:b75d784c7c1a 95 destroy(resource, protoson::pool);
alvarolb 0:b75d784c7c1a 96 // deallocate paylaod if was allocated here
alvarolb 0:b75d784c7c1a 97 if(data_allocated){
alvarolb 0:b75d784c7c1a 98 destroy(data, protoson::pool);
alvarolb 0:b75d784c7c1a 99 }
alvarolb 0:b75d784c7c1a 100 }
alvarolb 0:b75d784c7c1a 101
alvarolb 0:b75d784c7c1a 102 private:
alvarolb 0:b75d784c7c1a 103 /// used for identifying a unique stream
alvarolb 0:b75d784c7c1a 104 uint16_t stream_id;
alvarolb 0:b75d784c7c1a 105 /// used for setting a stream signal
alvarolb 0:b75d784c7c1a 106 signal_flag flag;
alvarolb 0:b75d784c7c1a 107 /// used to identify a device resource
alvarolb 0:b75d784c7c1a 108 protoson::pson* resource;
alvarolb 0:b75d784c7c1a 109 /// used to fill a data payload in the message
alvarolb 0:b75d784c7c1a 110 protoson::pson* data;
alvarolb 0:b75d784c7c1a 111 /// flag to determine when the payload has been reserved
alvarolb 0:b75d784c7c1a 112 bool data_allocated;
alvarolb 0:b75d784c7c1a 113
alvarolb 0:b75d784c7c1a 114 public:
alvarolb 0:b75d784c7c1a 115
alvarolb 0:b75d784c7c1a 116 uint16_t get_stream_id(){
alvarolb 0:b75d784c7c1a 117 return stream_id;
alvarolb 0:b75d784c7c1a 118 }
alvarolb 0:b75d784c7c1a 119
alvarolb 0:b75d784c7c1a 120 signal_flag get_signal_flag(){
alvarolb 0:b75d784c7c1a 121 return flag;
alvarolb 0:b75d784c7c1a 122 }
alvarolb 0:b75d784c7c1a 123
alvarolb 0:b75d784c7c1a 124 bool has_data(){
alvarolb 0:b75d784c7c1a 125 return data!=NULL;
alvarolb 0:b75d784c7c1a 126 }
alvarolb 0:b75d784c7c1a 127
alvarolb 0:b75d784c7c1a 128 bool has_resource(){
alvarolb 0:b75d784c7c1a 129 return resource!=NULL;
alvarolb 0:b75d784c7c1a 130 }
alvarolb 0:b75d784c7c1a 131
alvarolb 0:b75d784c7c1a 132 public:
alvarolb 0:b75d784c7c1a 133 void set_stream_id(uint16_t stream_id) {
alvarolb 0:b75d784c7c1a 134 thinger_message::stream_id = stream_id;
alvarolb 0:b75d784c7c1a 135 }
alvarolb 0:b75d784c7c1a 136
alvarolb 0:b75d784c7c1a 137 void set_signal_flag(signal_flag const &flag) {
alvarolb 0:b75d784c7c1a 138 thinger_message::flag = flag;
alvarolb 0:b75d784c7c1a 139 }
alvarolb 0:b75d784c7c1a 140
alvarolb 0:b75d784c7c1a 141 public:
alvarolb 0:b75d784c7c1a 142
alvarolb 0:b75d784c7c1a 143 void operator=(const char* str){
alvarolb 0:b75d784c7c1a 144 ((protoson::pson &) * this) = str;
alvarolb 0:b75d784c7c1a 145 }
alvarolb 0:b75d784c7c1a 146
alvarolb 0:b75d784c7c1a 147 operator protoson::pson&(){
alvarolb 0:b75d784c7c1a 148 if(data==NULL){
alvarolb 0:b75d784c7c1a 149 data = new (protoson::pool) protoson::pson;
alvarolb 0:b75d784c7c1a 150 data_allocated = true;
alvarolb 0:b75d784c7c1a 151 }
alvarolb 0:b75d784c7c1a 152 return *data;
alvarolb 0:b75d784c7c1a 153 }
alvarolb 0:b75d784c7c1a 154
alvarolb 0:b75d784c7c1a 155 protoson::pson_array& resources(){
alvarolb 0:b75d784c7c1a 156 return (protoson::pson_array&)get_resources();
alvarolb 0:b75d784c7c1a 157 }
alvarolb 0:b75d784c7c1a 158
alvarolb 0:b75d784c7c1a 159 protoson::pson& get_resources(){
alvarolb 0:b75d784c7c1a 160 if(resource==NULL){
alvarolb 0:b75d784c7c1a 161 resource = new (protoson::pool) protoson::pson;
alvarolb 0:b75d784c7c1a 162 }
alvarolb 0:b75d784c7c1a 163 return *resource;
alvarolb 0:b75d784c7c1a 164 }
alvarolb 0:b75d784c7c1a 165
alvarolb 0:b75d784c7c1a 166 protoson::pson& get_data(){
alvarolb 0:b75d784c7c1a 167 return *this;
alvarolb 0:b75d784c7c1a 168 }
alvarolb 0:b75d784c7c1a 169
alvarolb 0:b75d784c7c1a 170 void set_data(protoson::pson& pson_data){
alvarolb 0:b75d784c7c1a 171 if(data==NULL){
alvarolb 0:b75d784c7c1a 172 data = &pson_data;
alvarolb 0:b75d784c7c1a 173 data_allocated = false;
alvarolb 0:b75d784c7c1a 174 }
alvarolb 0:b75d784c7c1a 175 }
alvarolb 0:b75d784c7c1a 176
alvarolb 0:b75d784c7c1a 177 };
alvarolb 0:b75d784c7c1a 178 }
alvarolb 0:b75d784c7c1a 179
alvarolb 0:b75d784c7c1a 180 #endif