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
thinger/thinger_message.hpp@4:de51256455f7, 2015-12-26 (annotated)
- 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?
User | Revision | Line number | New 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 |