mbed client

Fork of simple-mbed-client by sandbox

Committer:
Jan Jongboom
Date:
Tue May 24 14:59:28 2016 -0500
Revision:
3:ce2322965a27
Parent:
2:0a015df677a4
Child:
4:0f9eae5739dd
Move from mbed.bld to mbed-os.lib, and implement updates

Who changed what in which revision?

UserRevisionLine numberNew 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 3:ce2322965a27 58 bool init(NetworkStack* 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 3:ce2322965a27 93 bool setup(NetworkStack* 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 3:ce2322965a27 108 bool setup(MbedClientOptions options, NetworkStack* 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
janjongboom 0:9fa3f3028773 194 resources[route_str]->set_value((uint8_t*)v.c_str(), v.length());
janjongboom 2:0a015df677a4 195
janjongboom 0:9fa3f3028773 196 return true;
janjongboom 0:9fa3f3028773 197 }
janjongboom 0:9fa3f3028773 198
janjongboom 0:9fa3f3028773 199 bool set(string route, const int& v) {
janjongboom 0:9fa3f3028773 200 stringstream ss;
janjongboom 0:9fa3f3028773 201 ss << v;
janjongboom 0:9fa3f3028773 202 std::string stringified = ss.str();
Jan Jongboom 3:ce2322965a27 203
janjongboom 0:9fa3f3028773 204 return set(route, stringified);
janjongboom 0:9fa3f3028773 205 }
janjongboom 0:9fa3f3028773 206
janjongboom 0:9fa3f3028773 207 bool define_resource_internal(const char* route, std::string v, M2MBase::Operation opr, bool observable) {
janjongboom 0:9fa3f3028773 208 if (client) {
Jan Jongboom 3:ce2322965a27 209 debug_msg("[SMC] [ERROR] mbed_client_define_resource, Can only define resources before mbed_client_setup is called!\r\n");
janjongboom 0:9fa3f3028773 210 return false;
janjongboom 0:9fa3f3028773 211 }
Jan Jongboom 3:ce2322965a27 212
janjongboom 0:9fa3f3028773 213 vector<string> segments = parse_route(route);
janjongboom 0:9fa3f3028773 214 if (segments.size() != 3) {
Jan Jongboom 3:ce2322965a27 215 debug_msg("[SMC] [ERROR] mbed_client_define_resource, Route needs to have three segments, split by '/' (%s)\r\n", route);
janjongboom 0:9fa3f3028773 216 return false;
janjongboom 0:9fa3f3028773 217 }
janjongboom 0:9fa3f3028773 218
Jan Jongboom 3:ce2322965a27 219 // segments[1] should be one digit and numeric
Jan Jongboom 3:ce2322965a27 220 if (!isdigit(segments.at(1).c_str()[0])) {
Jan Jongboom 3:ce2322965a27 221 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 222 return false;
Jan Jongboom 3:ce2322965a27 223 }
Jan Jongboom 3:ce2322965a27 224
Jan Jongboom 3:ce2322965a27 225 int inst_id = atoi(segments.at(1).c_str());
Jan Jongboom 3:ce2322965a27 226
janjongboom 0:9fa3f3028773 227 M2MObjectInstance* inst;
janjongboom 0:9fa3f3028773 228 if (objectInstances.count(segments.at(0))) {
Jan Jongboom 3:ce2322965a27 229 debug_msg("Found object... %s\r\n", segments.at(0).c_str());
janjongboom 0:9fa3f3028773 230 inst = objectInstances[segments.at(0)];
janjongboom 0:9fa3f3028773 231 }
janjongboom 0:9fa3f3028773 232 else {
Jan Jongboom 3:ce2322965a27 233 debug_msg("Create new object... %s\r\n", segments.at(0).c_str());
janjongboom 0:9fa3f3028773 234 M2MObject* obj = M2MInterfaceFactory::create_object(segments.at(0).c_str());
janjongboom 0:9fa3f3028773 235 inst = obj->create_object_instance(inst_id);
janjongboom 0:9fa3f3028773 236 objects.insert(std::pair<string, M2MObject*>(segments.at(0), obj));
janjongboom 0:9fa3f3028773 237 objectInstances.insert(std::pair<string, M2MObjectInstance*>(segments.at(0), inst));
janjongboom 0:9fa3f3028773 238 }
Jan Jongboom 3:ce2322965a27 239
janjongboom 0:9fa3f3028773 240 // @todo check if the resource exists yet
janjongboom 0:9fa3f3028773 241 M2MResource* res = inst->create_dynamic_resource(segments.at(2).c_str(), "",
janjongboom 0:9fa3f3028773 242 M2MResourceInstance::STRING, observable);
janjongboom 0:9fa3f3028773 243 res->set_operation(opr);
janjongboom 0:9fa3f3028773 244 res->set_value((uint8_t*)v.c_str(), v.length());
Jan Jongboom 3:ce2322965a27 245
janjongboom 0:9fa3f3028773 246 string route_str(route);
janjongboom 2:0a015df677a4 247 resources.insert(pair<string, M2MResource*>(route_str, res));
Jan Jongboom 3:ce2322965a27 248
janjongboom 0:9fa3f3028773 249 return true;
janjongboom 0:9fa3f3028773 250 }
Jan Jongboom 3:ce2322965a27 251
janjongboom 2:0a015df677a4 252 void keep_alive() {
janjongboom 2:0a015df677a4 253 client->test_update_register();
janjongboom 2:0a015df677a4 254 }
Jan Jongboom 3:ce2322965a27 255
Jan Jongboom 3:ce2322965a27 256 void register_update_callback(string route, SimpleResourceBase* simpleResource) {
Jan Jongboom 3:ce2322965a27 257 updateValues[route] = simpleResource;
Jan Jongboom 3:ce2322965a27 258 }
Jan Jongboom 3:ce2322965a27 259
janjongboom 0:9fa3f3028773 260 private:
janjongboom 0:9fa3f3028773 261 vector<string> parse_route(const char* route) {
janjongboom 0:9fa3f3028773 262 string s(route);
janjongboom 0:9fa3f3028773 263 vector<string> v;
janjongboom 0:9fa3f3028773 264 stringstream ss(s);
janjongboom 0:9fa3f3028773 265 string item;
janjongboom 0:9fa3f3028773 266 while (getline(ss, item, '/')) {
janjongboom 0:9fa3f3028773 267 v.push_back(item);
janjongboom 0:9fa3f3028773 268 }
janjongboom 0:9fa3f3028773 269 return v;
janjongboom 0:9fa3f3028773 270 }
janjongboom 0:9fa3f3028773 271
Jan Jongboom 3:ce2322965a27 272 void resource_updated(string uri) {
Jan Jongboom 3:ce2322965a27 273 if (updateValues.count(uri) == 0) return;
Jan Jongboom 3:ce2322965a27 274
Jan Jongboom 3:ce2322965a27 275 string v = get(uri);
Jan Jongboom 3:ce2322965a27 276 if (v.empty()) return;
Jan Jongboom 3:ce2322965a27 277
Jan Jongboom 3:ce2322965a27 278 updateValues[uri]->update(v);
Jan Jongboom 3:ce2322965a27 279 }
Jan Jongboom 3:ce2322965a27 280
janjongboom 0:9fa3f3028773 281 Serial output;
Jan Jongboom 3:ce2322965a27 282
janjongboom 0:9fa3f3028773 283 MbedClient* client;
janjongboom 0:9fa3f3028773 284 map<string, M2MObject*> objects;
janjongboom 0:9fa3f3028773 285 map<string, M2MObjectInstance*> objectInstances;
janjongboom 0:9fa3f3028773 286 map<string, M2MResource*> resources;
janjongboom 2:0a015df677a4 287
Jan Jongboom 3:ce2322965a27 288 bool debug;
Jan Jongboom 3:ce2322965a27 289
Jan Jongboom 3:ce2322965a27 290 map<string, SimpleResourceBase*> updateValues;
janjongboom 0:9fa3f3028773 291 };
janjongboom 0:9fa3f3028773 292
Jan Jongboom 3:ce2322965a27 293 class SimpleResourceString : public SimpleResourceBase {
janjongboom 0:9fa3f3028773 294 public:
Jan Jongboom 3:ce2322965a27 295 SimpleResourceString(SimpleMbedClientBase* aSimpleClient, string aRoute, FunctionPointerArg1<void, string> aOnUpdate) :
Jan Jongboom 3:ce2322965a27 296 simpleClient(aSimpleClient), route(aRoute), onUpdate(aOnUpdate) {}
janjongboom 0:9fa3f3028773 297
janjongboom 0:9fa3f3028773 298 string operator=(const string& newValue) {
janjongboom 0:9fa3f3028773 299 simpleClient->set(route, newValue);
janjongboom 0:9fa3f3028773 300 return newValue;
janjongboom 0:9fa3f3028773 301 };
janjongboom 0:9fa3f3028773 302 operator string() const {
janjongboom 0:9fa3f3028773 303 return simpleClient->get(route);
janjongboom 0:9fa3f3028773 304 };
janjongboom 0:9fa3f3028773 305
Jan Jongboom 3:ce2322965a27 306 virtual void update(string v) {
Jan Jongboom 3:ce2322965a27 307 if (onUpdate) onUpdate(v);
Jan Jongboom 3:ce2322965a27 308 }
Jan Jongboom 3:ce2322965a27 309
janjongboom 0:9fa3f3028773 310 private:
janjongboom 0:9fa3f3028773 311 SimpleMbedClientBase* simpleClient;
janjongboom 0:9fa3f3028773 312 string route;
Jan Jongboom 3:ce2322965a27 313 FunctionPointerArg1<void, string> onUpdate;
janjongboom 0:9fa3f3028773 314 };
janjongboom 0:9fa3f3028773 315
Jan Jongboom 3:ce2322965a27 316 class SimpleResourceInt : public SimpleResourceBase {
janjongboom 0:9fa3f3028773 317 public:
Jan Jongboom 3:ce2322965a27 318 SimpleResourceInt(SimpleMbedClientBase* aSimpleClient, string aRoute, FunctionPointerArg1<void, int> aOnUpdate) :
Jan Jongboom 3:ce2322965a27 319 simpleClient(aSimpleClient), route(aRoute), onUpdate(aOnUpdate) {}
janjongboom 0:9fa3f3028773 320
janjongboom 0:9fa3f3028773 321 int operator=(int newValue) {
janjongboom 0:9fa3f3028773 322 simpleClient->set(route, newValue);
janjongboom 0:9fa3f3028773 323 return newValue;
janjongboom 0:9fa3f3028773 324 };
janjongboom 0:9fa3f3028773 325 operator int() const {
janjongboom 0:9fa3f3028773 326 string v = simpleClient->get(route);
janjongboom 0:9fa3f3028773 327 if (v.empty()) return 0;
Jan Jongboom 3:ce2322965a27 328
janjongboom 0:9fa3f3028773 329 return atoi((const char*)v.c_str());
janjongboom 0:9fa3f3028773 330 };
janjongboom 0:9fa3f3028773 331
Jan Jongboom 3:ce2322965a27 332 virtual void update(string v) {
Jan Jongboom 3:ce2322965a27 333 if (!onUpdate) return;
Jan Jongboom 3:ce2322965a27 334
Jan Jongboom 3:ce2322965a27 335 onUpdate(atoi((const char*)v.c_str()));
Jan Jongboom 3:ce2322965a27 336 }
Jan Jongboom 3:ce2322965a27 337
janjongboom 0:9fa3f3028773 338 private:
janjongboom 0:9fa3f3028773 339 SimpleMbedClientBase* simpleClient;
janjongboom 0:9fa3f3028773 340 string route;
Jan Jongboom 3:ce2322965a27 341 FunctionPointerArg1<void, int> onUpdate;
janjongboom 0:9fa3f3028773 342 };
janjongboom 0:9fa3f3028773 343
janjongboom 0:9fa3f3028773 344 class SimpleMbedClient : public SimpleMbedClientBase {
janjongboom 0:9fa3f3028773 345 public:
janjongboom 1:75015f627e89 346
janjongboom 1:75015f627e89 347 // @todo: macro this up
janjongboom 1:75015f627e89 348
janjongboom 1:75015f627e89 349 SimpleResourceString define_resource(
Jan Jongboom 3:ce2322965a27 350 const char* route,
Jan Jongboom 3:ce2322965a27 351 string v,
Jan Jongboom 3:ce2322965a27 352 M2MBase::Operation opr = M2MBase::GET_PUT_ALLOWED,
janjongboom 1:75015f627e89 353 bool observable = true,
janjongboom 1:75015f627e89 354 FunctionPointerArg1<void, string> onUpdate = NULL)
janjongboom 1:75015f627e89 355 {
Jan Jongboom 3:ce2322965a27 356 SimpleResourceString* simpleResource = new SimpleResourceString(this, route, onUpdate);
janjongboom 0:9fa3f3028773 357 bool res = define_resource_internal(route, v, opr, observable);
Jan Jongboom 3:ce2322965a27 358 if (!res) {
Jan Jongboom 3:ce2322965a27 359 printf("Error while creating %s\n", route);
Jan Jongboom 3:ce2322965a27 360 }
Jan Jongboom 3:ce2322965a27 361 else {
Jan Jongboom 3:ce2322965a27 362 register_update_callback(route, simpleResource);
Jan Jongboom 3:ce2322965a27 363 }
Jan Jongboom 3:ce2322965a27 364 return *simpleResource;
janjongboom 0:9fa3f3028773 365 }
janjongboom 1:75015f627e89 366
janjongboom 1:75015f627e89 367 SimpleResourceString define_resource(
Jan Jongboom 3:ce2322965a27 368 const char* route,
Jan Jongboom 3:ce2322965a27 369 string v,
Jan Jongboom 3:ce2322965a27 370 M2MBase::Operation opr,
janjongboom 1:75015f627e89 371 bool observable,
Jan Jongboom 3:ce2322965a27 372 void(*onUpdate)(string))
janjongboom 1:75015f627e89 373 {
janjongboom 1:75015f627e89 374 FunctionPointerArg1<void, string> fp;
janjongboom 1:75015f627e89 375 fp.attach(onUpdate);
janjongboom 1:75015f627e89 376 return define_resource(route, v, opr, observable, fp);
janjongboom 1:75015f627e89 377 }
Jan Jongboom 3:ce2322965a27 378
janjongboom 1:75015f627e89 379 SimpleResourceString define_resource(
Jan Jongboom 3:ce2322965a27 380 const char* route,
janjongboom 1:75015f627e89 381 string v,
Jan Jongboom 3:ce2322965a27 382 FunctionPointerArg1<void, string> onUpdate = NULL)
janjongboom 1:75015f627e89 383 {
janjongboom 1:75015f627e89 384 return define_resource(route, v, M2MBase::GET_PUT_ALLOWED, true, onUpdate);
janjongboom 1:75015f627e89 385 }
janjongboom 1:75015f627e89 386
janjongboom 1:75015f627e89 387 SimpleResourceString define_resource(
Jan Jongboom 3:ce2322965a27 388 const char* route,
janjongboom 1:75015f627e89 389 string v,
Jan Jongboom 3:ce2322965a27 390 void(*onUpdate)(string))
janjongboom 1:75015f627e89 391 {
janjongboom 1:75015f627e89 392 FunctionPointerArg1<void, string> fp;
janjongboom 1:75015f627e89 393 fp.attach(onUpdate);
janjongboom 1:75015f627e89 394 return define_resource(route, v, M2MBase::GET_PUT_ALLOWED, true, fp);
janjongboom 1:75015f627e89 395 }
Jan Jongboom 3:ce2322965a27 396
janjongboom 1:75015f627e89 397 SimpleResourceInt define_resource(
Jan Jongboom 3:ce2322965a27 398 const char* route,
Jan Jongboom 3:ce2322965a27 399 int v,
Jan Jongboom 3:ce2322965a27 400 M2MBase::Operation opr = M2MBase::GET_PUT_ALLOWED,
janjongboom 1:75015f627e89 401 bool observable = true,
Jan Jongboom 3:ce2322965a27 402 FunctionPointerArg1<void, int> onUpdate = NULL)
janjongboom 1:75015f627e89 403 {
Jan Jongboom 3:ce2322965a27 404 SimpleResourceInt* simpleResource = new SimpleResourceInt(this, route, onUpdate);
Jan Jongboom 3:ce2322965a27 405
janjongboom 0:9fa3f3028773 406 stringstream ss;
janjongboom 0:9fa3f3028773 407 ss << v;
janjongboom 0:9fa3f3028773 408 std::string stringified = ss.str();
janjongboom 0:9fa3f3028773 409 bool res = define_resource_internal(route, stringified, opr, observable);
Jan Jongboom 3:ce2322965a27 410 if (!res) {
Jan Jongboom 3:ce2322965a27 411 printf("Error while creating %s\n", route);
Jan Jongboom 3:ce2322965a27 412 }
Jan Jongboom 3:ce2322965a27 413 else {
Jan Jongboom 3:ce2322965a27 414 register_update_callback(route, simpleResource);
Jan Jongboom 3:ce2322965a27 415 }
Jan Jongboom 3:ce2322965a27 416 return *simpleResource;
janjongboom 0:9fa3f3028773 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,
janjongboom 1:75015f627e89 423 bool observable,
Jan Jongboom 3:ce2322965a27 424 void(*onUpdate)(int))
janjongboom 1:75015f627e89 425 {
janjongboom 1:75015f627e89 426 FunctionPointerArg1<void, int> fp;
janjongboom 1:75015f627e89 427 fp.attach(onUpdate);
janjongboom 1:75015f627e89 428 return define_resource(route, v, opr, observable, fp);
janjongboom 1:75015f627e89 429 }
Jan Jongboom 3:ce2322965a27 430
janjongboom 1:75015f627e89 431 SimpleResourceInt define_resource(
Jan Jongboom 3:ce2322965a27 432 const char* route,
janjongboom 1:75015f627e89 433 int v,
Jan Jongboom 3:ce2322965a27 434 FunctionPointerArg1<void, int> onUpdate = NULL)
janjongboom 1:75015f627e89 435 {
janjongboom 1:75015f627e89 436 return define_resource(route, v, M2MBase::GET_PUT_ALLOWED, true, onUpdate);
janjongboom 1:75015f627e89 437 }
janjongboom 1:75015f627e89 438
janjongboom 1:75015f627e89 439 SimpleResourceInt define_resource(
Jan Jongboom 3:ce2322965a27 440 const char* route,
janjongboom 1:75015f627e89 441 int v,
Jan Jongboom 3:ce2322965a27 442 void(*onUpdate)(int))
janjongboom 1:75015f627e89 443 {
janjongboom 1:75015f627e89 444 FunctionPointerArg1<void, int> fp;
janjongboom 1:75015f627e89 445 fp.attach(onUpdate);
janjongboom 1:75015f627e89 446 return define_resource(route, v, M2MBase::GET_PUT_ALLOWED, true, fp);
janjongboom 1:75015f627e89 447 }
janjongboom 0:9fa3f3028773 448 };
janjongboom 0:9fa3f3028773 449
Jan Jongboom 3:ce2322965a27 450 #endif // __SIMPLE_MBED_CLIENT_H__