mbed client
Fork of simple-mbed-client by
simple-mbed-client.h@7:8a05fbad93d1, 2016-07-21 (annotated)
- Committer:
- Jan Jongboom
- Date:
- Thu Jul 21 16:11:51 2016 +0100
- Revision:
- 7:8a05fbad93d1
- Parent:
- 6:a1a766d45957
- Child:
- 9:cfd5d2a7d77d
SimpleMbedClient no known conversion on int, need to not set default value on onUpdate call
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
janjongboom | 0:9fa3f3028773 | 1 | /* |
janjongboom | 0:9fa3f3028773 | 2 | * Copyright (c) 2015 ARM Limited. All rights reserved. |
janjongboom | 0:9fa3f3028773 | 3 | * SPDX-License-Identifier: Apache-2.0 |
janjongboom | 0:9fa3f3028773 | 4 | * Licensed under the Apache License, Version 2.0 (the License); you may |
janjongboom | 0:9fa3f3028773 | 5 | * not use this file except in compliance with the License. |
janjongboom | 0:9fa3f3028773 | 6 | * You may obtain a copy of the License at |
janjongboom | 0:9fa3f3028773 | 7 | * |
janjongboom | 0:9fa3f3028773 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
janjongboom | 0:9fa3f3028773 | 9 | * |
janjongboom | 0:9fa3f3028773 | 10 | * Unless required by applicable law or agreed to in writing, software |
janjongboom | 0:9fa3f3028773 | 11 | * distributed under the License is distributed on an AS IS BASIS, WITHOUT |
janjongboom | 0:9fa3f3028773 | 12 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
janjongboom | 0:9fa3f3028773 | 13 | * See the License for the specific language governing permissions and |
janjongboom | 0:9fa3f3028773 | 14 | * limitations under the License. |
janjongboom | 0:9fa3f3028773 | 15 | */ |
janjongboom | 0:9fa3f3028773 | 16 | |
janjongboom | 0:9fa3f3028773 | 17 | #ifndef __SIMPLE_MBED_CLIENT_H__ |
janjongboom | 0:9fa3f3028773 | 18 | #define __SIMPLE_MBED_CLIENT_H__ |
janjongboom | 0:9fa3f3028773 | 19 | |
Jan Jongboom |
3:ce2322965a27 | 20 | #define debug_msg(...) if (debug) output.printf(__VA_ARGS__) |
Jan Jongboom |
3:ce2322965a27 | 21 | |
janjongboom | 0:9fa3f3028773 | 22 | #include <map> |
janjongboom | 0:9fa3f3028773 | 23 | #include <string> |
janjongboom | 0:9fa3f3028773 | 24 | #include <sstream> |
janjongboom | 0:9fa3f3028773 | 25 | #include <vector> |
janjongboom | 0:9fa3f3028773 | 26 | #include "mbed-client-wrapper.h" |
janjongboom | 0:9fa3f3028773 | 27 | |
janjongboom | 0:9fa3f3028773 | 28 | using namespace std; |
janjongboom | 0:9fa3f3028773 | 29 | |
Jan Jongboom |
3:ce2322965a27 | 30 | class SimpleResourceBase { |
Jan Jongboom |
3:ce2322965a27 | 31 | public: |
Jan Jongboom |
3:ce2322965a27 | 32 | virtual void update(string v); |
Jan Jongboom |
3:ce2322965a27 | 33 | }; |
Jan Jongboom |
3:ce2322965a27 | 34 | |
janjongboom | 0:9fa3f3028773 | 35 | class SimpleMbedClientBase { |
janjongboom | 0:9fa3f3028773 | 36 | public: |
Jan Jongboom |
3:ce2322965a27 | 37 | SimpleMbedClientBase(bool aDebug = true) |
Jan Jongboom |
3:ce2322965a27 | 38 | : output(USBTX, USBRX), debug(aDebug) |
Jan Jongboom |
3:ce2322965a27 | 39 | { |
Jan Jongboom |
3:ce2322965a27 | 40 | |
janjongboom | 0:9fa3f3028773 | 41 | } |
Jan Jongboom |
3:ce2322965a27 | 42 | |
janjongboom | 0:9fa3f3028773 | 43 | ~SimpleMbedClientBase() {} |
janjongboom | 0:9fa3f3028773 | 44 | |
janjongboom | 0:9fa3f3028773 | 45 | struct MbedClientOptions get_default_options() { |
janjongboom | 0:9fa3f3028773 | 46 | struct MbedClientOptions options; |
janjongboom | 0:9fa3f3028773 | 47 | options.Manufacturer = "Manufacturer_String"; |
janjongboom | 0:9fa3f3028773 | 48 | options.Type = "Type_String"; |
janjongboom | 0:9fa3f3028773 | 49 | options.ModelNumber = "ModelNumber_String"; |
janjongboom | 0:9fa3f3028773 | 50 | options.SerialNumber = "SerialNumber_String"; |
janjongboom | 0:9fa3f3028773 | 51 | options.DeviceType = "test"; |
janjongboom | 0:9fa3f3028773 | 52 | options.SocketMode = M2MInterface::UDP; |
janjongboom | 0:9fa3f3028773 | 53 | options.ServerAddress = "coap://api.connector.mbed.com:5684"; |
Jan Jongboom |
3:ce2322965a27 | 54 | |
janjongboom | 0:9fa3f3028773 | 55 | return options; |
janjongboom | 0:9fa3f3028773 | 56 | } |
janjongboom | 0:9fa3f3028773 | 57 | |
Jan Jongboom |
4:0f9eae5739dd | 58 | bool init(NetworkInterface* iface) { |
Jan Jongboom |
3:ce2322965a27 | 59 | debug_msg("[SMC] Device name %s\r\n", MBED_ENDPOINT_NAME); |
Jan Jongboom |
3:ce2322965a27 | 60 | |
janjongboom | 0:9fa3f3028773 | 61 | // Create endpoint interface to manage register and unregister |
Jan Jongboom |
3:ce2322965a27 | 62 | client->create_interface(iface); |
Jan Jongboom |
3:ce2322965a27 | 63 | |
janjongboom | 0:9fa3f3028773 | 64 | // Create Objects of varying types, see simpleclient.h for more details on implementation. |
janjongboom | 0:9fa3f3028773 | 65 | M2MSecurity* register_object = client->create_register_object(); // server object specifying connector info |
janjongboom | 0:9fa3f3028773 | 66 | M2MDevice* device_object = client->create_device_object(); // device resources object |
Jan Jongboom |
3:ce2322965a27 | 67 | |
janjongboom | 0:9fa3f3028773 | 68 | // Create list of Objects to register |
janjongboom | 0:9fa3f3028773 | 69 | M2MObjectList object_list; |
Jan Jongboom |
3:ce2322965a27 | 70 | |
janjongboom | 0:9fa3f3028773 | 71 | // Add objects to list |
janjongboom | 0:9fa3f3028773 | 72 | object_list.push_back(device_object); |
Jan Jongboom |
3:ce2322965a27 | 73 | |
janjongboom | 0:9fa3f3028773 | 74 | map<string, M2MObject*>::iterator it; |
janjongboom | 0:9fa3f3028773 | 75 | for (it = objects.begin(); it != objects.end(); it++) |
janjongboom | 0:9fa3f3028773 | 76 | { |
janjongboom | 0:9fa3f3028773 | 77 | object_list.push_back(it->second); |
janjongboom | 0:9fa3f3028773 | 78 | } |
Jan Jongboom |
3:ce2322965a27 | 79 | |
janjongboom | 0:9fa3f3028773 | 80 | // Set endpoint registration object |
janjongboom | 0:9fa3f3028773 | 81 | client->set_register_object(register_object); |
Jan Jongboom |
3:ce2322965a27 | 82 | |
janjongboom | 0:9fa3f3028773 | 83 | // Issue register command. |
janjongboom | 0:9fa3f3028773 | 84 | client->test_register(register_object, object_list); |
Jan Jongboom |
3:ce2322965a27 | 85 | |
janjongboom | 0:9fa3f3028773 | 86 | // @todo: no idea if this works |
janjongboom | 0:9fa3f3028773 | 87 | Ticker updateRegister; |
janjongboom | 0:9fa3f3028773 | 88 | updateRegister.attach(client, &MbedClient::test_update_register, 25.0f); |
Jan Jongboom |
3:ce2322965a27 | 89 | |
janjongboom | 0:9fa3f3028773 | 90 | return true; |
janjongboom | 0:9fa3f3028773 | 91 | } |
janjongboom | 0:9fa3f3028773 | 92 | |
Jan Jongboom |
4:0f9eae5739dd | 93 | bool setup(NetworkInterface* iface) { |
Jan Jongboom |
3:ce2322965a27 | 94 | debug_msg("[SMC] In mbed_client_setup\r\n"); |
janjongboom | 0:9fa3f3028773 | 95 | if (client) { |
Jan Jongboom |
3:ce2322965a27 | 96 | debug_msg("[SMC] [ERROR] mbed_client_setup called, but mbed_client is already instantiated\r\n"); |
janjongboom | 0:9fa3f3028773 | 97 | return false; |
janjongboom | 0:9fa3f3028773 | 98 | } |
Jan Jongboom |
3:ce2322965a27 | 99 | |
janjongboom | 0:9fa3f3028773 | 100 | struct MbedClientOptions options = get_default_options(); |
Jan Jongboom |
3:ce2322965a27 | 101 | |
Jan Jongboom |
3:ce2322965a27 | 102 | FP1<void, string> updateFp(this, &SimpleMbedClientBase::resource_updated); |
Jan Jongboom |
3:ce2322965a27 | 103 | client = new MbedClient(options, updateFp, debug); |
Jan Jongboom |
3:ce2322965a27 | 104 | |
janjongboom | 0:9fa3f3028773 | 105 | return init(iface); |
janjongboom | 0:9fa3f3028773 | 106 | } |
janjongboom | 0:9fa3f3028773 | 107 | |
Jan Jongboom |
4:0f9eae5739dd | 108 | bool setup(MbedClientOptions options, NetworkInterface* iface) { |
janjongboom | 0:9fa3f3028773 | 109 | if (client) { |
Jan Jongboom |
3:ce2322965a27 | 110 | debug_msg("[SMC] [ERROR] mbed_client_setup called, but mbed_client is already instantiated\r\n"); |
janjongboom | 0:9fa3f3028773 | 111 | return false; |
janjongboom | 0:9fa3f3028773 | 112 | } |
Jan Jongboom |
3:ce2322965a27 | 113 | |
Jan Jongboom |
3:ce2322965a27 | 114 | FP1<void, string> updateFp(this, &SimpleMbedClientBase::resource_updated); |
Jan Jongboom |
3:ce2322965a27 | 115 | client = new MbedClient(options, updateFp, debug); |
Jan Jongboom |
3:ce2322965a27 | 116 | |
janjongboom | 0:9fa3f3028773 | 117 | return init(iface); |
janjongboom | 0:9fa3f3028773 | 118 | } |
janjongboom | 0:9fa3f3028773 | 119 | |
janjongboom | 0:9fa3f3028773 | 120 | void on_registered(void(*fn)(void)) { |
janjongboom | 0:9fa3f3028773 | 121 | FunctionPointer fp(fn); |
janjongboom | 0:9fa3f3028773 | 122 | client->set_registered_function(fp); |
janjongboom | 0:9fa3f3028773 | 123 | } |
janjongboom | 0:9fa3f3028773 | 124 | |
janjongboom | 0:9fa3f3028773 | 125 | template<typename T> |
Jan Jongboom |
3:ce2322965a27 | 126 | void on_registered(T *object, void (T::*member)(void)) { |
janjongboom | 0:9fa3f3028773 | 127 | FunctionPointer fp(object, member); |
janjongboom | 0:9fa3f3028773 | 128 | client->set_registered_function(fp); |
janjongboom | 0:9fa3f3028773 | 129 | } |
janjongboom | 0:9fa3f3028773 | 130 | |
janjongboom | 0:9fa3f3028773 | 131 | void on_unregistered(void(*fn)(void)) { |
janjongboom | 0:9fa3f3028773 | 132 | FunctionPointer fp(fn); |
janjongboom | 0:9fa3f3028773 | 133 | client->set_unregistered_function(fp); |
janjongboom | 0:9fa3f3028773 | 134 | } |
janjongboom | 0:9fa3f3028773 | 135 | |
janjongboom | 0:9fa3f3028773 | 136 | template<typename T> |
Jan Jongboom |
3:ce2322965a27 | 137 | void on_unregistered(T *object, void (T::*member)(void)) { |
janjongboom | 0:9fa3f3028773 | 138 | FunctionPointer fp(object, member); |
janjongboom | 0:9fa3f3028773 | 139 | client->set_unregistered_function(fp); |
janjongboom | 0:9fa3f3028773 | 140 | } |
janjongboom | 0:9fa3f3028773 | 141 | |
janjongboom | 0:9fa3f3028773 | 142 | bool define_function(const char* route, void(*fn)(void*)) { |
janjongboom | 0:9fa3f3028773 | 143 | if (!define_resource_internal(route, string(), M2MBase::POST_ALLOWED, false)) { |
janjongboom | 0:9fa3f3028773 | 144 | return false; |
janjongboom | 0:9fa3f3028773 | 145 | } |
Jan Jongboom |
3:ce2322965a27 | 146 | |
janjongboom | 0:9fa3f3028773 | 147 | string route_str(route); |
janjongboom | 0:9fa3f3028773 | 148 | if (!resources.count(route_str)) { |
Jan Jongboom |
3:ce2322965a27 | 149 | debug_msg("[SMC] [ERROR] Should be created, but no such route (%s)\r\n", route); |
janjongboom | 0:9fa3f3028773 | 150 | return false; |
janjongboom | 0:9fa3f3028773 | 151 | } |
Jan Jongboom |
3:ce2322965a27 | 152 | |
Jan Jongboom |
3:ce2322965a27 | 153 | resources[route_str]->set_execute_function(execute_callback_2(fn)); |
janjongboom | 0:9fa3f3028773 | 154 | return true; |
janjongboom | 0:9fa3f3028773 | 155 | } |
janjongboom | 0:9fa3f3028773 | 156 | |
janjongboom | 0:9fa3f3028773 | 157 | bool define_function(const char* route, execute_callback fn) { |
janjongboom | 0:9fa3f3028773 | 158 | if (!define_resource_internal(route, string(), M2MBase::POST_ALLOWED, false)) { |
janjongboom | 0:9fa3f3028773 | 159 | return false; |
janjongboom | 0:9fa3f3028773 | 160 | } |
Jan Jongboom |
3:ce2322965a27 | 161 | |
janjongboom | 0:9fa3f3028773 | 162 | string route_str(route); |
janjongboom | 0:9fa3f3028773 | 163 | if (!resources.count(route_str)) { |
Jan Jongboom |
3:ce2322965a27 | 164 | debug_msg("[SMC] [ERROR] Should be created, but no such route (%s)\r\n", route); |
janjongboom | 0:9fa3f3028773 | 165 | return false; |
janjongboom | 0:9fa3f3028773 | 166 | } |
janjongboom | 0:9fa3f3028773 | 167 | // No clue why this is not working?! It works with class member, but not with static function... |
janjongboom | 0:9fa3f3028773 | 168 | resources[route_str]->set_execute_function(fn); |
janjongboom | 0:9fa3f3028773 | 169 | return true; |
janjongboom | 0:9fa3f3028773 | 170 | } |
Jan Jongboom |
3:ce2322965a27 | 171 | |
janjongboom | 0:9fa3f3028773 | 172 | string get(string route_str) { |
janjongboom | 0:9fa3f3028773 | 173 | if (!resources.count(route_str)) { |
Jan Jongboom |
3:ce2322965a27 | 174 | debug_msg("[SMC] [ERROR] No such route (%s)\r\n", route_str.c_str()); |
janjongboom | 0:9fa3f3028773 | 175 | return string(); |
janjongboom | 0:9fa3f3028773 | 176 | } |
Jan Jongboom |
3:ce2322965a27 | 177 | |
janjongboom | 2:0a015df677a4 | 178 | // otherwise ask mbed Client... |
janjongboom | 2:0a015df677a4 | 179 | uint8_t* buffIn = NULL; |
janjongboom | 0:9fa3f3028773 | 180 | uint32_t sizeIn; |
janjongboom | 0:9fa3f3028773 | 181 | resources[route_str]->get_value(buffIn, sizeIn); |
Jan Jongboom |
3:ce2322965a27 | 182 | |
janjongboom | 2:0a015df677a4 | 183 | string s((char*)buffIn, sizeIn); |
janjongboom | 0:9fa3f3028773 | 184 | return s; |
janjongboom | 0:9fa3f3028773 | 185 | } |
janjongboom | 0:9fa3f3028773 | 186 | |
janjongboom | 0:9fa3f3028773 | 187 | bool set(string route_str, string v) { |
janjongboom | 2:0a015df677a4 | 188 | // Potentially set() happens in InterruptContext. That's not good. |
janjongboom | 0:9fa3f3028773 | 189 | if (!resources.count(route_str)) { |
Jan Jongboom |
3:ce2322965a27 | 190 | debug_msg("[SMC] [ERROR] No such route (%s)\r\n", route_str.c_str()); |
janjongboom | 0:9fa3f3028773 | 191 | return false; |
janjongboom | 0:9fa3f3028773 | 192 | } |
Jan Jongboom |
3:ce2322965a27 | 193 | |
Jan Jongboom |
4:0f9eae5739dd | 194 | if (v.length() == 0) { |
Jan Jongboom |
4:0f9eae5739dd | 195 | resources[route_str]->clear_value(); |
Jan Jongboom |
4:0f9eae5739dd | 196 | } |
Jan Jongboom |
4:0f9eae5739dd | 197 | else { |
Jan Jongboom |
4:0f9eae5739dd | 198 | resources[route_str]->set_value((uint8_t*)v.c_str(), v.length()); |
Jan Jongboom |
4:0f9eae5739dd | 199 | } |
janjongboom | 2:0a015df677a4 | 200 | |
janjongboom | 0:9fa3f3028773 | 201 | return true; |
janjongboom | 0:9fa3f3028773 | 202 | } |
janjongboom | 0:9fa3f3028773 | 203 | |
janjongboom | 0:9fa3f3028773 | 204 | bool set(string route, const int& v) { |
janjongboom | 0:9fa3f3028773 | 205 | stringstream ss; |
janjongboom | 0:9fa3f3028773 | 206 | ss << v; |
janjongboom | 0:9fa3f3028773 | 207 | std::string stringified = ss.str(); |
Jan Jongboom |
3:ce2322965a27 | 208 | |
janjongboom | 0:9fa3f3028773 | 209 | return set(route, stringified); |
janjongboom | 0:9fa3f3028773 | 210 | } |
janjongboom | 0:9fa3f3028773 | 211 | |
janjongboom | 0:9fa3f3028773 | 212 | bool define_resource_internal(const char* route, std::string v, M2MBase::Operation opr, bool observable) { |
janjongboom | 0:9fa3f3028773 | 213 | if (client) { |
Jan Jongboom |
3:ce2322965a27 | 214 | debug_msg("[SMC] [ERROR] mbed_client_define_resource, Can only define resources before mbed_client_setup is called!\r\n"); |
janjongboom | 0:9fa3f3028773 | 215 | return false; |
janjongboom | 0:9fa3f3028773 | 216 | } |
Jan Jongboom |
3:ce2322965a27 | 217 | |
janjongboom | 0:9fa3f3028773 | 218 | vector<string> segments = parse_route(route); |
janjongboom | 0:9fa3f3028773 | 219 | if (segments.size() != 3) { |
Jan Jongboom |
3:ce2322965a27 | 220 | debug_msg("[SMC] [ERROR] mbed_client_define_resource, Route needs to have three segments, split by '/' (%s)\r\n", route); |
janjongboom | 0:9fa3f3028773 | 221 | return false; |
janjongboom | 0:9fa3f3028773 | 222 | } |
janjongboom | 0:9fa3f3028773 | 223 | |
Jan Jongboom |
3:ce2322965a27 | 224 | // segments[1] should be one digit and numeric |
Jan Jongboom |
3:ce2322965a27 | 225 | if (!isdigit(segments.at(1).c_str()[0])) { |
Jan Jongboom |
3:ce2322965a27 | 226 | debug_msg("[SMC] [ERROR] mbed_client_define_resource, second route segment should be numeric, but was not (%s)\r\n", route); |
Jan Jongboom |
3:ce2322965a27 | 227 | return false; |
Jan Jongboom |
3:ce2322965a27 | 228 | } |
Jan Jongboom |
3:ce2322965a27 | 229 | |
Jan Jongboom |
3:ce2322965a27 | 230 | int inst_id = atoi(segments.at(1).c_str()); |
Jan Jongboom |
3:ce2322965a27 | 231 | |
janjongboom | 0:9fa3f3028773 | 232 | M2MObjectInstance* inst; |
janjongboom | 0:9fa3f3028773 | 233 | if (objectInstances.count(segments.at(0))) { |
Jan Jongboom |
3:ce2322965a27 | 234 | debug_msg("Found object... %s\r\n", segments.at(0).c_str()); |
janjongboom | 0:9fa3f3028773 | 235 | inst = objectInstances[segments.at(0)]; |
janjongboom | 0:9fa3f3028773 | 236 | } |
janjongboom | 0:9fa3f3028773 | 237 | else { |
Jan Jongboom |
3:ce2322965a27 | 238 | debug_msg("Create new object... %s\r\n", segments.at(0).c_str()); |
janjongboom | 0:9fa3f3028773 | 239 | M2MObject* obj = M2MInterfaceFactory::create_object(segments.at(0).c_str()); |
janjongboom | 0:9fa3f3028773 | 240 | inst = obj->create_object_instance(inst_id); |
janjongboom | 0:9fa3f3028773 | 241 | objects.insert(std::pair<string, M2MObject*>(segments.at(0), obj)); |
janjongboom | 0:9fa3f3028773 | 242 | objectInstances.insert(std::pair<string, M2MObjectInstance*>(segments.at(0), inst)); |
janjongboom | 0:9fa3f3028773 | 243 | } |
Jan Jongboom |
3:ce2322965a27 | 244 | |
janjongboom | 0:9fa3f3028773 | 245 | // @todo check if the resource exists yet |
janjongboom | 0:9fa3f3028773 | 246 | M2MResource* res = inst->create_dynamic_resource(segments.at(2).c_str(), "", |
janjongboom | 0:9fa3f3028773 | 247 | M2MResourceInstance::STRING, observable); |
janjongboom | 0:9fa3f3028773 | 248 | res->set_operation(opr); |
janjongboom | 0:9fa3f3028773 | 249 | res->set_value((uint8_t*)v.c_str(), v.length()); |
Jan Jongboom |
3:ce2322965a27 | 250 | |
janjongboom | 0:9fa3f3028773 | 251 | string route_str(route); |
janjongboom | 2:0a015df677a4 | 252 | resources.insert(pair<string, M2MResource*>(route_str, res)); |
Jan Jongboom |
3:ce2322965a27 | 253 | |
janjongboom | 0:9fa3f3028773 | 254 | return true; |
janjongboom | 0:9fa3f3028773 | 255 | } |
Jan Jongboom |
3:ce2322965a27 | 256 | |
janjongboom | 2:0a015df677a4 | 257 | void keep_alive() { |
janjongboom | 2:0a015df677a4 | 258 | client->test_update_register(); |
janjongboom | 2:0a015df677a4 | 259 | } |
Jan Jongboom |
3:ce2322965a27 | 260 | |
Jan Jongboom |
3:ce2322965a27 | 261 | void register_update_callback(string route, SimpleResourceBase* simpleResource) { |
Jan Jongboom |
3:ce2322965a27 | 262 | updateValues[route] = simpleResource; |
Jan Jongboom |
3:ce2322965a27 | 263 | } |
Jan Jongboom |
3:ce2322965a27 | 264 | |
Jan Jongboom |
6:a1a766d45957 | 265 | M2MResource* get_resource(string route) { |
Jan Jongboom |
6:a1a766d45957 | 266 | if (!resources.count(route)) { |
Jan Jongboom |
6:a1a766d45957 | 267 | debug_msg("[SMC] [ERROR] No such route (%s)\r\n", route.c_str()); |
Jan Jongboom |
6:a1a766d45957 | 268 | return NULL; |
Jan Jongboom |
6:a1a766d45957 | 269 | } |
Jan Jongboom |
6:a1a766d45957 | 270 | |
Jan Jongboom |
6:a1a766d45957 | 271 | return resources[route]; |
Jan Jongboom |
6:a1a766d45957 | 272 | } |
Jan Jongboom |
6:a1a766d45957 | 273 | |
janjongboom | 0:9fa3f3028773 | 274 | private: |
janjongboom | 0:9fa3f3028773 | 275 | vector<string> parse_route(const char* route) { |
janjongboom | 0:9fa3f3028773 | 276 | string s(route); |
janjongboom | 0:9fa3f3028773 | 277 | vector<string> v; |
janjongboom | 0:9fa3f3028773 | 278 | stringstream ss(s); |
janjongboom | 0:9fa3f3028773 | 279 | string item; |
janjongboom | 0:9fa3f3028773 | 280 | while (getline(ss, item, '/')) { |
janjongboom | 0:9fa3f3028773 | 281 | v.push_back(item); |
janjongboom | 0:9fa3f3028773 | 282 | } |
janjongboom | 0:9fa3f3028773 | 283 | return v; |
janjongboom | 0:9fa3f3028773 | 284 | } |
janjongboom | 0:9fa3f3028773 | 285 | |
Jan Jongboom |
3:ce2322965a27 | 286 | void resource_updated(string uri) { |
Jan Jongboom |
3:ce2322965a27 | 287 | if (updateValues.count(uri) == 0) return; |
Jan Jongboom |
3:ce2322965a27 | 288 | |
Jan Jongboom |
3:ce2322965a27 | 289 | string v = get(uri); |
Jan Jongboom |
3:ce2322965a27 | 290 | if (v.empty()) return; |
Jan Jongboom |
3:ce2322965a27 | 291 | |
Jan Jongboom |
3:ce2322965a27 | 292 | updateValues[uri]->update(v); |
Jan Jongboom |
3:ce2322965a27 | 293 | } |
Jan Jongboom |
3:ce2322965a27 | 294 | |
janjongboom | 0:9fa3f3028773 | 295 | Serial output; |
Jan Jongboom |
3:ce2322965a27 | 296 | |
janjongboom | 0:9fa3f3028773 | 297 | MbedClient* client; |
janjongboom | 0:9fa3f3028773 | 298 | map<string, M2MObject*> objects; |
janjongboom | 0:9fa3f3028773 | 299 | map<string, M2MObjectInstance*> objectInstances; |
janjongboom | 0:9fa3f3028773 | 300 | map<string, M2MResource*> resources; |
janjongboom | 2:0a015df677a4 | 301 | |
Jan Jongboom |
3:ce2322965a27 | 302 | bool debug; |
Jan Jongboom |
3:ce2322965a27 | 303 | |
Jan Jongboom |
3:ce2322965a27 | 304 | map<string, SimpleResourceBase*> updateValues; |
janjongboom | 0:9fa3f3028773 | 305 | }; |
janjongboom | 0:9fa3f3028773 | 306 | |
Jan Jongboom |
3:ce2322965a27 | 307 | class SimpleResourceString : public SimpleResourceBase { |
janjongboom | 0:9fa3f3028773 | 308 | public: |
Jan Jongboom |
3:ce2322965a27 | 309 | SimpleResourceString(SimpleMbedClientBase* aSimpleClient, string aRoute, FunctionPointerArg1<void, string> aOnUpdate) : |
Jan Jongboom |
3:ce2322965a27 | 310 | simpleClient(aSimpleClient), route(aRoute), onUpdate(aOnUpdate) {} |
janjongboom | 0:9fa3f3028773 | 311 | |
janjongboom | 0:9fa3f3028773 | 312 | string operator=(const string& newValue) { |
janjongboom | 0:9fa3f3028773 | 313 | simpleClient->set(route, newValue); |
janjongboom | 0:9fa3f3028773 | 314 | return newValue; |
janjongboom | 0:9fa3f3028773 | 315 | }; |
janjongboom | 0:9fa3f3028773 | 316 | operator string() const { |
janjongboom | 0:9fa3f3028773 | 317 | return simpleClient->get(route); |
janjongboom | 0:9fa3f3028773 | 318 | }; |
janjongboom | 0:9fa3f3028773 | 319 | |
Jan Jongboom |
3:ce2322965a27 | 320 | virtual void update(string v) { |
Jan Jongboom |
3:ce2322965a27 | 321 | if (onUpdate) onUpdate(v); |
Jan Jongboom |
3:ce2322965a27 | 322 | } |
Jan Jongboom |
3:ce2322965a27 | 323 | |
Jan Jongboom |
6:a1a766d45957 | 324 | M2MResource* get_resource() { |
Jan Jongboom |
6:a1a766d45957 | 325 | return simpleClient->get_resource(route); |
Jan Jongboom |
6:a1a766d45957 | 326 | } |
Jan Jongboom |
6:a1a766d45957 | 327 | |
janjongboom | 0:9fa3f3028773 | 328 | private: |
janjongboom | 0:9fa3f3028773 | 329 | SimpleMbedClientBase* simpleClient; |
janjongboom | 0:9fa3f3028773 | 330 | string route; |
Jan Jongboom |
3:ce2322965a27 | 331 | FunctionPointerArg1<void, string> onUpdate; |
janjongboom | 0:9fa3f3028773 | 332 | }; |
janjongboom | 0:9fa3f3028773 | 333 | |
Jan Jongboom |
3:ce2322965a27 | 334 | class SimpleResourceInt : public SimpleResourceBase { |
janjongboom | 0:9fa3f3028773 | 335 | public: |
Jan Jongboom |
3:ce2322965a27 | 336 | SimpleResourceInt(SimpleMbedClientBase* aSimpleClient, string aRoute, FunctionPointerArg1<void, int> aOnUpdate) : |
Jan Jongboom |
3:ce2322965a27 | 337 | simpleClient(aSimpleClient), route(aRoute), onUpdate(aOnUpdate) {} |
janjongboom | 0:9fa3f3028773 | 338 | |
janjongboom | 0:9fa3f3028773 | 339 | int operator=(int newValue) { |
janjongboom | 0:9fa3f3028773 | 340 | simpleClient->set(route, newValue); |
janjongboom | 0:9fa3f3028773 | 341 | return newValue; |
janjongboom | 0:9fa3f3028773 | 342 | }; |
janjongboom | 0:9fa3f3028773 | 343 | operator int() const { |
janjongboom | 0:9fa3f3028773 | 344 | string v = simpleClient->get(route); |
janjongboom | 0:9fa3f3028773 | 345 | if (v.empty()) return 0; |
Jan Jongboom |
3:ce2322965a27 | 346 | |
janjongboom | 0:9fa3f3028773 | 347 | return atoi((const char*)v.c_str()); |
janjongboom | 0:9fa3f3028773 | 348 | }; |
janjongboom | 0:9fa3f3028773 | 349 | |
Jan Jongboom |
3:ce2322965a27 | 350 | virtual void update(string v) { |
Jan Jongboom |
3:ce2322965a27 | 351 | if (!onUpdate) return; |
Jan Jongboom |
3:ce2322965a27 | 352 | |
Jan Jongboom |
3:ce2322965a27 | 353 | onUpdate(atoi((const char*)v.c_str())); |
Jan Jongboom |
3:ce2322965a27 | 354 | } |
Jan Jongboom |
3:ce2322965a27 | 355 | |
Jan Jongboom |
6:a1a766d45957 | 356 | M2MResource* get_resource() { |
Jan Jongboom |
6:a1a766d45957 | 357 | return simpleClient->get_resource(route); |
Jan Jongboom |
6:a1a766d45957 | 358 | } |
Jan Jongboom |
6:a1a766d45957 | 359 | |
janjongboom | 0:9fa3f3028773 | 360 | private: |
janjongboom | 0:9fa3f3028773 | 361 | SimpleMbedClientBase* simpleClient; |
janjongboom | 0:9fa3f3028773 | 362 | string route; |
Jan Jongboom |
3:ce2322965a27 | 363 | FunctionPointerArg1<void, int> onUpdate; |
janjongboom | 0:9fa3f3028773 | 364 | }; |
janjongboom | 0:9fa3f3028773 | 365 | |
janjongboom | 0:9fa3f3028773 | 366 | class SimpleMbedClient : public SimpleMbedClientBase { |
janjongboom | 0:9fa3f3028773 | 367 | public: |
janjongboom | 1:75015f627e89 | 368 | |
janjongboom | 1:75015f627e89 | 369 | // @todo: macro this up |
janjongboom | 1:75015f627e89 | 370 | |
janjongboom | 1:75015f627e89 | 371 | SimpleResourceString define_resource( |
Jan Jongboom |
3:ce2322965a27 | 372 | const char* route, |
Jan Jongboom |
3:ce2322965a27 | 373 | string v, |
Jan Jongboom |
3:ce2322965a27 | 374 | M2MBase::Operation opr = M2MBase::GET_PUT_ALLOWED, |
janjongboom | 1:75015f627e89 | 375 | bool observable = true, |
janjongboom | 1:75015f627e89 | 376 | FunctionPointerArg1<void, string> onUpdate = NULL) |
janjongboom | 1:75015f627e89 | 377 | { |
Jan Jongboom |
3:ce2322965a27 | 378 | SimpleResourceString* simpleResource = new SimpleResourceString(this, route, onUpdate); |
janjongboom | 0:9fa3f3028773 | 379 | bool res = define_resource_internal(route, v, opr, observable); |
Jan Jongboom |
3:ce2322965a27 | 380 | if (!res) { |
Jan Jongboom |
3:ce2322965a27 | 381 | printf("Error while creating %s\n", route); |
Jan Jongboom |
3:ce2322965a27 | 382 | } |
Jan Jongboom |
3:ce2322965a27 | 383 | else { |
Jan Jongboom |
3:ce2322965a27 | 384 | register_update_callback(route, simpleResource); |
Jan Jongboom |
3:ce2322965a27 | 385 | } |
Jan Jongboom |
3:ce2322965a27 | 386 | return *simpleResource; |
janjongboom | 0:9fa3f3028773 | 387 | } |
janjongboom | 1:75015f627e89 | 388 | |
janjongboom | 1:75015f627e89 | 389 | SimpleResourceString define_resource( |
Jan Jongboom |
3:ce2322965a27 | 390 | const char* route, |
Jan Jongboom |
3:ce2322965a27 | 391 | string v, |
Jan Jongboom |
3:ce2322965a27 | 392 | M2MBase::Operation opr, |
janjongboom | 1:75015f627e89 | 393 | bool observable, |
Jan Jongboom |
3:ce2322965a27 | 394 | void(*onUpdate)(string)) |
janjongboom | 1:75015f627e89 | 395 | { |
janjongboom | 1:75015f627e89 | 396 | FunctionPointerArg1<void, string> fp; |
janjongboom | 1:75015f627e89 | 397 | fp.attach(onUpdate); |
janjongboom | 1:75015f627e89 | 398 | return define_resource(route, v, opr, observable, fp); |
janjongboom | 1:75015f627e89 | 399 | } |
Jan Jongboom |
3:ce2322965a27 | 400 | |
janjongboom | 1:75015f627e89 | 401 | SimpleResourceString define_resource( |
Jan Jongboom |
3:ce2322965a27 | 402 | const char* route, |
janjongboom | 1:75015f627e89 | 403 | string v, |
Jan Jongboom |
3:ce2322965a27 | 404 | FunctionPointerArg1<void, string> onUpdate = NULL) |
janjongboom | 1:75015f627e89 | 405 | { |
janjongboom | 1:75015f627e89 | 406 | return define_resource(route, v, M2MBase::GET_PUT_ALLOWED, true, onUpdate); |
janjongboom | 1:75015f627e89 | 407 | } |
janjongboom | 1:75015f627e89 | 408 | |
janjongboom | 1:75015f627e89 | 409 | SimpleResourceString define_resource( |
Jan Jongboom |
3:ce2322965a27 | 410 | const char* route, |
janjongboom | 1:75015f627e89 | 411 | string v, |
Jan Jongboom |
3:ce2322965a27 | 412 | void(*onUpdate)(string)) |
janjongboom | 1:75015f627e89 | 413 | { |
janjongboom | 1:75015f627e89 | 414 | FunctionPointerArg1<void, string> fp; |
janjongboom | 1:75015f627e89 | 415 | fp.attach(onUpdate); |
janjongboom | 1:75015f627e89 | 416 | return define_resource(route, v, M2MBase::GET_PUT_ALLOWED, true, fp); |
janjongboom | 1:75015f627e89 | 417 | } |
Jan Jongboom |
3:ce2322965a27 | 418 | |
janjongboom | 1:75015f627e89 | 419 | SimpleResourceInt define_resource( |
Jan Jongboom |
3:ce2322965a27 | 420 | const char* route, |
Jan Jongboom |
3:ce2322965a27 | 421 | int v, |
Jan Jongboom |
3:ce2322965a27 | 422 | M2MBase::Operation opr = M2MBase::GET_PUT_ALLOWED, |
janjongboom | 1:75015f627e89 | 423 | bool observable = true, |
Jan Jongboom |
3:ce2322965a27 | 424 | FunctionPointerArg1<void, int> onUpdate = NULL) |
janjongboom | 1:75015f627e89 | 425 | { |
Jan Jongboom |
3:ce2322965a27 | 426 | SimpleResourceInt* simpleResource = new SimpleResourceInt(this, route, onUpdate); |
Jan Jongboom |
3:ce2322965a27 | 427 | |
janjongboom | 0:9fa3f3028773 | 428 | stringstream ss; |
janjongboom | 0:9fa3f3028773 | 429 | ss << v; |
janjongboom | 0:9fa3f3028773 | 430 | std::string stringified = ss.str(); |
janjongboom | 0:9fa3f3028773 | 431 | bool res = define_resource_internal(route, stringified, opr, observable); |
Jan Jongboom |
3:ce2322965a27 | 432 | if (!res) { |
Jan Jongboom |
3:ce2322965a27 | 433 | printf("Error while creating %s\n", route); |
Jan Jongboom |
3:ce2322965a27 | 434 | } |
Jan Jongboom |
3:ce2322965a27 | 435 | else { |
Jan Jongboom |
3:ce2322965a27 | 436 | register_update_callback(route, simpleResource); |
Jan Jongboom |
3:ce2322965a27 | 437 | } |
Jan Jongboom |
3:ce2322965a27 | 438 | return *simpleResource; |
janjongboom | 0:9fa3f3028773 | 439 | } |
Jan Jongboom |
3:ce2322965a27 | 440 | |
janjongboom | 1:75015f627e89 | 441 | SimpleResourceInt define_resource( |
Jan Jongboom |
3:ce2322965a27 | 442 | const char* route, |
Jan Jongboom |
3:ce2322965a27 | 443 | int v, |
Jan Jongboom |
3:ce2322965a27 | 444 | M2MBase::Operation opr, |
janjongboom | 1:75015f627e89 | 445 | bool observable, |
Jan Jongboom |
3:ce2322965a27 | 446 | void(*onUpdate)(int)) |
janjongboom | 1:75015f627e89 | 447 | { |
janjongboom | 1:75015f627e89 | 448 | FunctionPointerArg1<void, int> fp; |
janjongboom | 1:75015f627e89 | 449 | fp.attach(onUpdate); |
janjongboom | 1:75015f627e89 | 450 | return define_resource(route, v, opr, observable, fp); |
janjongboom | 1:75015f627e89 | 451 | } |
Jan Jongboom |
3:ce2322965a27 | 452 | |
janjongboom | 1:75015f627e89 | 453 | SimpleResourceInt define_resource( |
Jan Jongboom |
3:ce2322965a27 | 454 | const char* route, |
janjongboom | 1:75015f627e89 | 455 | int v, |
Jan Jongboom |
7:8a05fbad93d1 | 456 | FunctionPointerArg1<void, int> onUpdate) |
janjongboom | 1:75015f627e89 | 457 | { |
janjongboom | 1:75015f627e89 | 458 | return define_resource(route, v, M2MBase::GET_PUT_ALLOWED, true, onUpdate); |
janjongboom | 1:75015f627e89 | 459 | } |
janjongboom | 1:75015f627e89 | 460 | |
janjongboom | 1:75015f627e89 | 461 | SimpleResourceInt define_resource( |
Jan Jongboom |
3:ce2322965a27 | 462 | const char* route, |
janjongboom | 1:75015f627e89 | 463 | int v, |
Jan Jongboom |
3:ce2322965a27 | 464 | void(*onUpdate)(int)) |
janjongboom | 1:75015f627e89 | 465 | { |
janjongboom | 1:75015f627e89 | 466 | FunctionPointerArg1<void, int> fp; |
janjongboom | 1:75015f627e89 | 467 | fp.attach(onUpdate); |
janjongboom | 1:75015f627e89 | 468 | return define_resource(route, v, M2MBase::GET_PUT_ALLOWED, true, fp); |
janjongboom | 1:75015f627e89 | 469 | } |
janjongboom | 0:9fa3f3028773 | 470 | }; |
janjongboom | 0:9fa3f3028773 | 471 | |
Jan Jongboom |
3:ce2322965a27 | 472 | #endif // __SIMPLE_MBED_CLIENT_H__ |