Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of simple-mbed-client by
simple-mbed-client.h@2:0a015df677a4, 2016-05-17 (annotated)
- Committer:
- janjongboom
- Date:
- Tue May 17 00:15:11 2016 +0000
- Revision:
- 2:0a015df677a4
- Parent:
- 1:75015f627e89
- Child:
- 3:ce2322965a27
Fix getting variables, and add keep_alive function.
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 | |
| janjongboom | 0:9fa3f3028773 | 20 | #include <map> |
| janjongboom | 0:9fa3f3028773 | 21 | #include <string> |
| janjongboom | 0:9fa3f3028773 | 22 | #include <sstream> |
| janjongboom | 0:9fa3f3028773 | 23 | #include <vector> |
| janjongboom | 0:9fa3f3028773 | 24 | #include "mbed-client-classic/m2mnetwork.h" |
| janjongboom | 0:9fa3f3028773 | 25 | #include "mbed-client-wrapper.h" |
| janjongboom | 0:9fa3f3028773 | 26 | |
| janjongboom | 0:9fa3f3028773 | 27 | using namespace std; |
| janjongboom | 0:9fa3f3028773 | 28 | |
| janjongboom | 0:9fa3f3028773 | 29 | class SimpleMbedClientBase { |
| janjongboom | 0:9fa3f3028773 | 30 | public: |
| janjongboom | 0:9fa3f3028773 | 31 | SimpleMbedClientBase() : output(USBTX, USBRX) { |
| janjongboom | 0:9fa3f3028773 | 32 | |
| janjongboom | 0:9fa3f3028773 | 33 | } |
| janjongboom | 0:9fa3f3028773 | 34 | ~SimpleMbedClientBase() {} |
| janjongboom | 0:9fa3f3028773 | 35 | |
| janjongboom | 0:9fa3f3028773 | 36 | struct MbedClientOptions get_default_options() { |
| janjongboom | 0:9fa3f3028773 | 37 | struct MbedClientOptions options; |
| janjongboom | 0:9fa3f3028773 | 38 | options.Manufacturer = "Manufacturer_String"; |
| janjongboom | 0:9fa3f3028773 | 39 | options.Type = "Type_String"; |
| janjongboom | 0:9fa3f3028773 | 40 | options.ModelNumber = "ModelNumber_String"; |
| janjongboom | 0:9fa3f3028773 | 41 | options.SerialNumber = "SerialNumber_String"; |
| janjongboom | 0:9fa3f3028773 | 42 | options.DeviceType = "test"; |
| janjongboom | 0:9fa3f3028773 | 43 | options.SocketMode = M2MInterface::UDP; |
| janjongboom | 0:9fa3f3028773 | 44 | options.ServerAddress = "coap://api.connector.mbed.com:5684"; |
| janjongboom | 0:9fa3f3028773 | 45 | |
| janjongboom | 0:9fa3f3028773 | 46 | return options; |
| janjongboom | 0:9fa3f3028773 | 47 | } |
| janjongboom | 0:9fa3f3028773 | 48 | |
| janjongboom | 0:9fa3f3028773 | 49 | bool init(NetworkInterface* iface) { |
| janjongboom | 0:9fa3f3028773 | 50 | // does this automatically handle everything? weird yo. |
| janjongboom | 0:9fa3f3028773 | 51 | M2MNetwork network(iface); |
| janjongboom | 0:9fa3f3028773 | 52 | |
| janjongboom | 0:9fa3f3028773 | 53 | output.printf("[SMC] Device name %s\r\n", MBED_ENDPOINT_NAME); |
| janjongboom | 0:9fa3f3028773 | 54 | |
| janjongboom | 0:9fa3f3028773 | 55 | // Create endpoint interface to manage register and unregister |
| janjongboom | 0:9fa3f3028773 | 56 | client->create_interface(); |
| janjongboom | 0:9fa3f3028773 | 57 | |
| janjongboom | 0:9fa3f3028773 | 58 | // Create Objects of varying types, see simpleclient.h for more details on implementation. |
| janjongboom | 0:9fa3f3028773 | 59 | M2MSecurity* register_object = client->create_register_object(); // server object specifying connector info |
| janjongboom | 0:9fa3f3028773 | 60 | M2MDevice* device_object = client->create_device_object(); // device resources object |
| janjongboom | 0:9fa3f3028773 | 61 | |
| janjongboom | 0:9fa3f3028773 | 62 | // Create list of Objects to register |
| janjongboom | 0:9fa3f3028773 | 63 | M2MObjectList object_list; |
| janjongboom | 0:9fa3f3028773 | 64 | |
| janjongboom | 0:9fa3f3028773 | 65 | // Add objects to list |
| janjongboom | 0:9fa3f3028773 | 66 | object_list.push_back(device_object); |
| janjongboom | 0:9fa3f3028773 | 67 | |
| janjongboom | 0:9fa3f3028773 | 68 | map<string, M2MObject*>::iterator it; |
| janjongboom | 0:9fa3f3028773 | 69 | for (it = objects.begin(); it != objects.end(); it++) |
| janjongboom | 0:9fa3f3028773 | 70 | { |
| janjongboom | 0:9fa3f3028773 | 71 | object_list.push_back(it->second); |
| janjongboom | 0:9fa3f3028773 | 72 | } |
| janjongboom | 0:9fa3f3028773 | 73 | |
| janjongboom | 0:9fa3f3028773 | 74 | // Set endpoint registration object |
| janjongboom | 0:9fa3f3028773 | 75 | client->set_register_object(register_object); |
| janjongboom | 0:9fa3f3028773 | 76 | |
| janjongboom | 0:9fa3f3028773 | 77 | // Issue register command. |
| janjongboom | 0:9fa3f3028773 | 78 | client->test_register(register_object, object_list); |
| janjongboom | 0:9fa3f3028773 | 79 | |
| janjongboom | 0:9fa3f3028773 | 80 | // @todo: no idea if this works |
| janjongboom | 0:9fa3f3028773 | 81 | Ticker updateRegister; |
| janjongboom | 0:9fa3f3028773 | 82 | updateRegister.attach(client, &MbedClient::test_update_register, 25.0f); |
| janjongboom | 0:9fa3f3028773 | 83 | |
| janjongboom | 0:9fa3f3028773 | 84 | return true; |
| janjongboom | 0:9fa3f3028773 | 85 | } |
| janjongboom | 0:9fa3f3028773 | 86 | |
| janjongboom | 0:9fa3f3028773 | 87 | bool setup(NetworkInterface* iface) { |
| janjongboom | 0:9fa3f3028773 | 88 | output.printf("[SMC] In mbed_client_setup\r\n"); |
| janjongboom | 0:9fa3f3028773 | 89 | if (client) { |
| janjongboom | 0:9fa3f3028773 | 90 | output.printf("[SMC] [ERROR] mbed_client_setup called, but mbed_client is already instantiated\r\n"); |
| janjongboom | 0:9fa3f3028773 | 91 | return false; |
| janjongboom | 0:9fa3f3028773 | 92 | } |
| janjongboom | 0:9fa3f3028773 | 93 | |
| janjongboom | 0:9fa3f3028773 | 94 | struct MbedClientOptions options = get_default_options(); |
| janjongboom | 0:9fa3f3028773 | 95 | |
| janjongboom | 0:9fa3f3028773 | 96 | client = new MbedClient(options); |
| janjongboom | 0:9fa3f3028773 | 97 | return init(iface); |
| janjongboom | 0:9fa3f3028773 | 98 | } |
| janjongboom | 0:9fa3f3028773 | 99 | |
| janjongboom | 0:9fa3f3028773 | 100 | bool setup(MbedClientOptions options, NetworkInterface* iface) { |
| janjongboom | 0:9fa3f3028773 | 101 | if (client) { |
| janjongboom | 0:9fa3f3028773 | 102 | output.printf("[SMC] [ERROR] mbed_client_setup called, but mbed_client is already instantiated\r\n"); |
| janjongboom | 0:9fa3f3028773 | 103 | return false; |
| janjongboom | 0:9fa3f3028773 | 104 | } |
| janjongboom | 0:9fa3f3028773 | 105 | client = new MbedClient(options); |
| janjongboom | 0:9fa3f3028773 | 106 | return init(iface); |
| janjongboom | 0:9fa3f3028773 | 107 | } |
| janjongboom | 0:9fa3f3028773 | 108 | |
| janjongboom | 0:9fa3f3028773 | 109 | void on_registered(void(*fn)(void)) { |
| janjongboom | 0:9fa3f3028773 | 110 | FunctionPointer fp(fn); |
| janjongboom | 0:9fa3f3028773 | 111 | client->set_registered_function(fp); |
| janjongboom | 0:9fa3f3028773 | 112 | } |
| janjongboom | 0:9fa3f3028773 | 113 | |
| janjongboom | 0:9fa3f3028773 | 114 | template<typename T> |
| janjongboom | 0:9fa3f3028773 | 115 | void on_registered(T *object, void (T::*member)(void)) { |
| janjongboom | 0:9fa3f3028773 | 116 | FunctionPointer fp(object, member); |
| janjongboom | 0:9fa3f3028773 | 117 | client->set_registered_function(fp); |
| janjongboom | 0:9fa3f3028773 | 118 | } |
| janjongboom | 0:9fa3f3028773 | 119 | |
| janjongboom | 0:9fa3f3028773 | 120 | void on_unregistered(void(*fn)(void)) { |
| janjongboom | 0:9fa3f3028773 | 121 | FunctionPointer fp(fn); |
| janjongboom | 0:9fa3f3028773 | 122 | client->set_unregistered_function(fp); |
| janjongboom | 0:9fa3f3028773 | 123 | } |
| janjongboom | 0:9fa3f3028773 | 124 | |
| janjongboom | 0:9fa3f3028773 | 125 | template<typename T> |
| janjongboom | 0:9fa3f3028773 | 126 | void on_unregistered(T *object, void (T::*member)(void)) { |
| janjongboom | 0:9fa3f3028773 | 127 | FunctionPointer fp(object, member); |
| janjongboom | 0:9fa3f3028773 | 128 | client->set_unregistered_function(fp); |
| janjongboom | 0:9fa3f3028773 | 129 | } |
| janjongboom | 0:9fa3f3028773 | 130 | |
| janjongboom | 0:9fa3f3028773 | 131 | bool define_function(const char* route, void(*fn)(void*)) { |
| janjongboom | 0:9fa3f3028773 | 132 | if (!define_resource_internal(route, string(), M2MBase::POST_ALLOWED, false)) { |
| janjongboom | 0:9fa3f3028773 | 133 | return false; |
| janjongboom | 0:9fa3f3028773 | 134 | } |
| janjongboom | 0:9fa3f3028773 | 135 | |
| janjongboom | 0:9fa3f3028773 | 136 | string route_str(route); |
| janjongboom | 0:9fa3f3028773 | 137 | if (!resources.count(route_str)) { |
| janjongboom | 0:9fa3f3028773 | 138 | output.printf("[SMC] [ERROR] Should be created, but no such route (%s)\r\n", route); |
| janjongboom | 0:9fa3f3028773 | 139 | return false; |
| janjongboom | 0:9fa3f3028773 | 140 | } |
| janjongboom | 0:9fa3f3028773 | 141 | |
| janjongboom | 0:9fa3f3028773 | 142 | FunctionPointerArg1<void, void*>* fp = new FunctionPointerArg1<void, void*>(fn); |
| janjongboom | 0:9fa3f3028773 | 143 | resources[route_str]->set_execute_function(execute_callback(fp, &FunctionPointerArg1<void, void*>::call)); |
| janjongboom | 0:9fa3f3028773 | 144 | return true; |
| janjongboom | 0:9fa3f3028773 | 145 | } |
| janjongboom | 0:9fa3f3028773 | 146 | |
| janjongboom | 0:9fa3f3028773 | 147 | bool define_function(const char* route, execute_callback fn) { |
| janjongboom | 0:9fa3f3028773 | 148 | if (!define_resource_internal(route, string(), M2MBase::POST_ALLOWED, false)) { |
| janjongboom | 0:9fa3f3028773 | 149 | return false; |
| janjongboom | 0:9fa3f3028773 | 150 | } |
| janjongboom | 0:9fa3f3028773 | 151 | |
| janjongboom | 0:9fa3f3028773 | 152 | string route_str(route); |
| janjongboom | 0:9fa3f3028773 | 153 | if (!resources.count(route_str)) { |
| janjongboom | 0:9fa3f3028773 | 154 | output.printf("[SMC] [ERROR] Should be created, but no such route (%s)\r\n", route); |
| janjongboom | 0:9fa3f3028773 | 155 | return false; |
| janjongboom | 0:9fa3f3028773 | 156 | } |
| janjongboom | 0:9fa3f3028773 | 157 | // No clue why this is not working?! It works with class member, but not with static function... |
| janjongboom | 0:9fa3f3028773 | 158 | resources[route_str]->set_execute_function(fn); |
| janjongboom | 0:9fa3f3028773 | 159 | return true; |
| janjongboom | 0:9fa3f3028773 | 160 | } |
| janjongboom | 0:9fa3f3028773 | 161 | // |
| janjongboom | 0:9fa3f3028773 | 162 | string get(string route_str) { |
| janjongboom | 0:9fa3f3028773 | 163 | if (!resources.count(route_str)) { |
| janjongboom | 0:9fa3f3028773 | 164 | output.printf("[SMC] [ERROR] No such route (%s)\r\n", route_str.c_str()); |
| janjongboom | 0:9fa3f3028773 | 165 | return string(); |
| janjongboom | 0:9fa3f3028773 | 166 | } |
| janjongboom | 2:0a015df677a4 | 167 | |
| janjongboom | 2:0a015df677a4 | 168 | // otherwise ask mbed Client... |
| janjongboom | 2:0a015df677a4 | 169 | uint8_t* buffIn = NULL; |
| janjongboom | 0:9fa3f3028773 | 170 | uint32_t sizeIn; |
| janjongboom | 0:9fa3f3028773 | 171 | resources[route_str]->get_value(buffIn, sizeIn); |
| janjongboom | 0:9fa3f3028773 | 172 | |
| janjongboom | 2:0a015df677a4 | 173 | string s((char*)buffIn, sizeIn); |
| janjongboom | 0:9fa3f3028773 | 174 | return s; |
| janjongboom | 0:9fa3f3028773 | 175 | } |
| janjongboom | 0:9fa3f3028773 | 176 | |
| janjongboom | 0:9fa3f3028773 | 177 | bool set(string route_str, string v) { |
| janjongboom | 2:0a015df677a4 | 178 | // Potentially set() happens in InterruptContext. That's not good. |
| janjongboom | 2:0a015df677a4 | 179 | // so we put the set() in an updateQueue and then we'll see... |
| janjongboom | 2:0a015df677a4 | 180 | |
| janjongboom | 0:9fa3f3028773 | 181 | if (!resources.count(route_str)) { |
| janjongboom | 0:9fa3f3028773 | 182 | output.printf("[SMC] [ERROR] No such route (%s)\r\n", route_str.c_str()); |
| janjongboom | 0:9fa3f3028773 | 183 | return false; |
| janjongboom | 0:9fa3f3028773 | 184 | } |
| janjongboom | 2:0a015df677a4 | 185 | |
| janjongboom | 0:9fa3f3028773 | 186 | resources[route_str]->set_value((uint8_t*)v.c_str(), v.length()); |
| janjongboom | 2:0a015df677a4 | 187 | |
| janjongboom | 0:9fa3f3028773 | 188 | return true; |
| janjongboom | 0:9fa3f3028773 | 189 | } |
| janjongboom | 0:9fa3f3028773 | 190 | |
| janjongboom | 0:9fa3f3028773 | 191 | bool set(string route, const int& v) { |
| janjongboom | 0:9fa3f3028773 | 192 | stringstream ss; |
| janjongboom | 0:9fa3f3028773 | 193 | ss << v; |
| janjongboom | 0:9fa3f3028773 | 194 | std::string stringified = ss.str(); |
| janjongboom | 0:9fa3f3028773 | 195 | |
| janjongboom | 0:9fa3f3028773 | 196 | return set(route, stringified); |
| janjongboom | 0:9fa3f3028773 | 197 | } |
| janjongboom | 0:9fa3f3028773 | 198 | |
| janjongboom | 0:9fa3f3028773 | 199 | bool define_resource_internal(const char* route, std::string v, M2MBase::Operation opr, bool observable) { |
| janjongboom | 0:9fa3f3028773 | 200 | if (client) { |
| janjongboom | 0:9fa3f3028773 | 201 | output.printf("[SMC] [ERROR] mbed_client_define_resource, Can only define resources before mbed_client_setup is called!\r\n"); |
| janjongboom | 0:9fa3f3028773 | 202 | return false; |
| janjongboom | 0:9fa3f3028773 | 203 | } |
| janjongboom | 0:9fa3f3028773 | 204 | |
| janjongboom | 0:9fa3f3028773 | 205 | vector<string> segments = parse_route(route); |
| janjongboom | 0:9fa3f3028773 | 206 | if (segments.size() != 3) { |
| janjongboom | 0:9fa3f3028773 | 207 | output.printf("[SMC] [ERROR] mbed_client_define_resource, Route needs to have three segments, split by '/' (%s)\r\n", route); |
| janjongboom | 0:9fa3f3028773 | 208 | return false; |
| janjongboom | 0:9fa3f3028773 | 209 | } |
| janjongboom | 0:9fa3f3028773 | 210 | |
| janjongboom | 0:9fa3f3028773 | 211 | int inst_id = 0; |
| janjongboom | 0:9fa3f3028773 | 212 | // try { |
| janjongboom | 0:9fa3f3028773 | 213 | // inst_id = stoi(segments.at(1)); |
| janjongboom | 0:9fa3f3028773 | 214 | // } |
| janjongboom | 0:9fa3f3028773 | 215 | // catch (const std::invalid_argument& ia) { |
| janjongboom | 0:9fa3f3028773 | 216 | // output.printf("[SMC] [ERROR] mbed_client_define_resource, second route segment should be numeric, but was not (%s)\r\n", route); |
| janjongboom | 0:9fa3f3028773 | 217 | // return false; |
| janjongboom | 0:9fa3f3028773 | 218 | // } |
| janjongboom | 0:9fa3f3028773 | 219 | |
| janjongboom | 0:9fa3f3028773 | 220 | |
| janjongboom | 0:9fa3f3028773 | 221 | M2MObjectInstance* inst; |
| janjongboom | 0:9fa3f3028773 | 222 | if (objectInstances.count(segments.at(0))) { |
| janjongboom | 0:9fa3f3028773 | 223 | output.printf("Found object... %s\r\n", segments.at(0).c_str()); |
| janjongboom | 0:9fa3f3028773 | 224 | inst = objectInstances[segments.at(0)]; |
| janjongboom | 0:9fa3f3028773 | 225 | } |
| janjongboom | 0:9fa3f3028773 | 226 | else { |
| janjongboom | 0:9fa3f3028773 | 227 | output.printf("Create new object... %s\r\n", segments.at(0).c_str()); |
| janjongboom | 0:9fa3f3028773 | 228 | M2MObject* obj = M2MInterfaceFactory::create_object(segments.at(0).c_str()); |
| janjongboom | 0:9fa3f3028773 | 229 | inst = obj->create_object_instance(inst_id); |
| janjongboom | 0:9fa3f3028773 | 230 | objects.insert(std::pair<string, M2MObject*>(segments.at(0), obj)); |
| janjongboom | 0:9fa3f3028773 | 231 | objectInstances.insert(std::pair<string, M2MObjectInstance*>(segments.at(0), inst)); |
| janjongboom | 0:9fa3f3028773 | 232 | } |
| janjongboom | 0:9fa3f3028773 | 233 | |
| janjongboom | 0:9fa3f3028773 | 234 | // @todo check if the resource exists yet |
| janjongboom | 0:9fa3f3028773 | 235 | M2MResource* res = inst->create_dynamic_resource(segments.at(2).c_str(), "", |
| janjongboom | 0:9fa3f3028773 | 236 | M2MResourceInstance::STRING, observable); |
| janjongboom | 0:9fa3f3028773 | 237 | res->set_operation(opr); |
| janjongboom | 0:9fa3f3028773 | 238 | res->set_value((uint8_t*)v.c_str(), v.length()); |
| janjongboom | 0:9fa3f3028773 | 239 | |
| janjongboom | 0:9fa3f3028773 | 240 | string route_str(route); |
| janjongboom | 2:0a015df677a4 | 241 | resources.insert(pair<string, M2MResource*>(route_str, res)); |
| janjongboom | 2:0a015df677a4 | 242 | |
| janjongboom | 0:9fa3f3028773 | 243 | return true; |
| janjongboom | 0:9fa3f3028773 | 244 | } |
| janjongboom | 2:0a015df677a4 | 245 | |
| janjongboom | 2:0a015df677a4 | 246 | void keep_alive() { |
| janjongboom | 2:0a015df677a4 | 247 | client->test_update_register(); |
| janjongboom | 2:0a015df677a4 | 248 | } |
| janjongboom | 2:0a015df677a4 | 249 | |
| janjongboom | 0:9fa3f3028773 | 250 | private: |
| janjongboom | 0:9fa3f3028773 | 251 | vector<string> parse_route(const char* route) { |
| janjongboom | 0:9fa3f3028773 | 252 | string s(route); |
| janjongboom | 0:9fa3f3028773 | 253 | vector<string> v; |
| janjongboom | 0:9fa3f3028773 | 254 | stringstream ss(s); |
| janjongboom | 0:9fa3f3028773 | 255 | string item; |
| janjongboom | 0:9fa3f3028773 | 256 | while (getline(ss, item, '/')) { |
| janjongboom | 0:9fa3f3028773 | 257 | v.push_back(item); |
| janjongboom | 0:9fa3f3028773 | 258 | } |
| janjongboom | 0:9fa3f3028773 | 259 | return v; |
| janjongboom | 0:9fa3f3028773 | 260 | } |
| janjongboom | 0:9fa3f3028773 | 261 | |
| janjongboom | 0:9fa3f3028773 | 262 | Serial output; |
| janjongboom | 0:9fa3f3028773 | 263 | |
| janjongboom | 0:9fa3f3028773 | 264 | MbedClient* client; |
| janjongboom | 0:9fa3f3028773 | 265 | map<string, M2MObject*> objects; |
| janjongboom | 0:9fa3f3028773 | 266 | map<string, M2MObjectInstance*> objectInstances; |
| janjongboom | 0:9fa3f3028773 | 267 | map<string, M2MResource*> resources; |
| janjongboom | 2:0a015df677a4 | 268 | |
| janjongboom | 1:75015f627e89 | 269 | // @todo: write this |
| janjongboom | 1:75015f627e89 | 270 | // map<string, FunctionPointerArg1<void, void*> updateValues; |
| janjongboom | 0:9fa3f3028773 | 271 | }; |
| janjongboom | 0:9fa3f3028773 | 272 | |
| janjongboom | 0:9fa3f3028773 | 273 | class SimpleResourceString { |
| janjongboom | 0:9fa3f3028773 | 274 | public: |
| janjongboom | 0:9fa3f3028773 | 275 | SimpleResourceString(SimpleMbedClientBase* aSimpleClient, string aRoute) : |
| janjongboom | 0:9fa3f3028773 | 276 | simpleClient(aSimpleClient), route(aRoute) {} |
| janjongboom | 0:9fa3f3028773 | 277 | |
| janjongboom | 0:9fa3f3028773 | 278 | string operator=(const string& newValue) { |
| janjongboom | 0:9fa3f3028773 | 279 | simpleClient->set(route, newValue); |
| janjongboom | 0:9fa3f3028773 | 280 | return newValue; |
| janjongboom | 0:9fa3f3028773 | 281 | }; |
| janjongboom | 0:9fa3f3028773 | 282 | operator string() const { |
| janjongboom | 0:9fa3f3028773 | 283 | return simpleClient->get(route); |
| janjongboom | 0:9fa3f3028773 | 284 | }; |
| janjongboom | 0:9fa3f3028773 | 285 | |
| janjongboom | 0:9fa3f3028773 | 286 | private: |
| janjongboom | 0:9fa3f3028773 | 287 | SimpleMbedClientBase* simpleClient; |
| janjongboom | 0:9fa3f3028773 | 288 | string route; |
| janjongboom | 0:9fa3f3028773 | 289 | }; |
| janjongboom | 0:9fa3f3028773 | 290 | |
| janjongboom | 0:9fa3f3028773 | 291 | class SimpleResourceInt { |
| janjongboom | 0:9fa3f3028773 | 292 | public: |
| janjongboom | 0:9fa3f3028773 | 293 | SimpleResourceInt(SimpleMbedClientBase* aSimpleClient, string aRoute) : |
| janjongboom | 0:9fa3f3028773 | 294 | simpleClient(aSimpleClient), route(aRoute) {} |
| janjongboom | 0:9fa3f3028773 | 295 | |
| janjongboom | 0:9fa3f3028773 | 296 | int operator=(int newValue) { |
| janjongboom | 0:9fa3f3028773 | 297 | simpleClient->set(route, newValue); |
| janjongboom | 0:9fa3f3028773 | 298 | return newValue; |
| janjongboom | 0:9fa3f3028773 | 299 | }; |
| janjongboom | 0:9fa3f3028773 | 300 | operator int() const { |
| janjongboom | 0:9fa3f3028773 | 301 | string v = simpleClient->get(route); |
| janjongboom | 0:9fa3f3028773 | 302 | if (v.empty()) return 0; |
| janjongboom | 0:9fa3f3028773 | 303 | |
| janjongboom | 0:9fa3f3028773 | 304 | return atoi((const char*)v.c_str()); |
| janjongboom | 0:9fa3f3028773 | 305 | }; |
| janjongboom | 0:9fa3f3028773 | 306 | |
| janjongboom | 0:9fa3f3028773 | 307 | private: |
| janjongboom | 0:9fa3f3028773 | 308 | SimpleMbedClientBase* simpleClient; |
| janjongboom | 0:9fa3f3028773 | 309 | string route; |
| janjongboom | 0:9fa3f3028773 | 310 | }; |
| janjongboom | 0:9fa3f3028773 | 311 | |
| janjongboom | 0:9fa3f3028773 | 312 | class SimpleMbedClient : public SimpleMbedClientBase { |
| janjongboom | 0:9fa3f3028773 | 313 | public: |
| janjongboom | 1:75015f627e89 | 314 | |
| janjongboom | 1:75015f627e89 | 315 | // @todo: macro this up |
| janjongboom | 1:75015f627e89 | 316 | |
| janjongboom | 1:75015f627e89 | 317 | SimpleResourceString define_resource( |
| janjongboom | 1:75015f627e89 | 318 | const char* route, |
| janjongboom | 1:75015f627e89 | 319 | string v, |
| janjongboom | 1:75015f627e89 | 320 | M2MBase::Operation opr = M2MBase::GET_PUT_ALLOWED, |
| janjongboom | 1:75015f627e89 | 321 | bool observable = true, |
| janjongboom | 1:75015f627e89 | 322 | FunctionPointerArg1<void, string> onUpdate = NULL) |
| janjongboom | 1:75015f627e89 | 323 | { |
| janjongboom | 0:9fa3f3028773 | 324 | bool res = define_resource_internal(route, v, opr, observable); |
| janjongboom | 0:9fa3f3028773 | 325 | if (!res) printf("Error while creating %s\n", route); |
| janjongboom | 0:9fa3f3028773 | 326 | return *(new SimpleResourceString(this, route)); |
| janjongboom | 0:9fa3f3028773 | 327 | } |
| janjongboom | 1:75015f627e89 | 328 | |
| janjongboom | 1:75015f627e89 | 329 | SimpleResourceString define_resource( |
| janjongboom | 1:75015f627e89 | 330 | const char* route, |
| janjongboom | 1:75015f627e89 | 331 | string v, |
| janjongboom | 1:75015f627e89 | 332 | M2MBase::Operation opr, |
| janjongboom | 1:75015f627e89 | 333 | bool observable, |
| janjongboom | 1:75015f627e89 | 334 | void(*onUpdate)(string)) |
| janjongboom | 1:75015f627e89 | 335 | { |
| janjongboom | 1:75015f627e89 | 336 | FunctionPointerArg1<void, string> fp; |
| janjongboom | 1:75015f627e89 | 337 | fp.attach(onUpdate); |
| janjongboom | 1:75015f627e89 | 338 | return define_resource(route, v, opr, observable, fp); |
| janjongboom | 1:75015f627e89 | 339 | } |
| janjongboom | 0:9fa3f3028773 | 340 | |
| janjongboom | 1:75015f627e89 | 341 | SimpleResourceString define_resource( |
| janjongboom | 1:75015f627e89 | 342 | const char* route, |
| janjongboom | 1:75015f627e89 | 343 | string v, |
| janjongboom | 1:75015f627e89 | 344 | FunctionPointerArg1<void, string> onUpdate = NULL) |
| janjongboom | 1:75015f627e89 | 345 | { |
| janjongboom | 1:75015f627e89 | 346 | return define_resource(route, v, M2MBase::GET_PUT_ALLOWED, true, onUpdate); |
| janjongboom | 1:75015f627e89 | 347 | } |
| janjongboom | 1:75015f627e89 | 348 | |
| janjongboom | 1:75015f627e89 | 349 | SimpleResourceString define_resource( |
| janjongboom | 1:75015f627e89 | 350 | const char* route, |
| janjongboom | 1:75015f627e89 | 351 | string v, |
| janjongboom | 1:75015f627e89 | 352 | void(*onUpdate)(string)) |
| janjongboom | 1:75015f627e89 | 353 | { |
| janjongboom | 1:75015f627e89 | 354 | FunctionPointerArg1<void, string> fp; |
| janjongboom | 1:75015f627e89 | 355 | fp.attach(onUpdate); |
| janjongboom | 1:75015f627e89 | 356 | return define_resource(route, v, M2MBase::GET_PUT_ALLOWED, true, fp); |
| janjongboom | 1:75015f627e89 | 357 | } |
| janjongboom | 1:75015f627e89 | 358 | |
| janjongboom | 1:75015f627e89 | 359 | SimpleResourceInt define_resource( |
| janjongboom | 1:75015f627e89 | 360 | const char* route, |
| janjongboom | 1:75015f627e89 | 361 | int v, |
| janjongboom | 1:75015f627e89 | 362 | M2MBase::Operation opr = M2MBase::GET_PUT_ALLOWED, |
| janjongboom | 1:75015f627e89 | 363 | bool observable = true, |
| janjongboom | 1:75015f627e89 | 364 | FunctionPointerArg1<void, int> onUpdate = NULL) |
| janjongboom | 1:75015f627e89 | 365 | { |
| janjongboom | 0:9fa3f3028773 | 366 | stringstream ss; |
| janjongboom | 0:9fa3f3028773 | 367 | ss << v; |
| janjongboom | 0:9fa3f3028773 | 368 | std::string stringified = ss.str(); |
| janjongboom | 0:9fa3f3028773 | 369 | bool res = define_resource_internal(route, stringified, opr, observable); |
| janjongboom | 0:9fa3f3028773 | 370 | if (!res) printf("Error while creating %s\n", route); |
| janjongboom | 0:9fa3f3028773 | 371 | return *(new SimpleResourceInt(this, route)); |
| janjongboom | 0:9fa3f3028773 | 372 | } |
| janjongboom | 1:75015f627e89 | 373 | |
| janjongboom | 1:75015f627e89 | 374 | SimpleResourceInt define_resource( |
| janjongboom | 1:75015f627e89 | 375 | const char* route, |
| janjongboom | 1:75015f627e89 | 376 | int v, |
| janjongboom | 1:75015f627e89 | 377 | M2MBase::Operation opr, |
| janjongboom | 1:75015f627e89 | 378 | bool observable, |
| janjongboom | 1:75015f627e89 | 379 | void(*onUpdate)(int)) |
| janjongboom | 1:75015f627e89 | 380 | { |
| janjongboom | 1:75015f627e89 | 381 | FunctionPointerArg1<void, int> fp; |
| janjongboom | 1:75015f627e89 | 382 | fp.attach(onUpdate); |
| janjongboom | 1:75015f627e89 | 383 | return define_resource(route, v, opr, observable, fp); |
| janjongboom | 1:75015f627e89 | 384 | } |
| janjongboom | 1:75015f627e89 | 385 | |
| janjongboom | 1:75015f627e89 | 386 | SimpleResourceInt define_resource( |
| janjongboom | 1:75015f627e89 | 387 | const char* route, |
| janjongboom | 1:75015f627e89 | 388 | int v, |
| janjongboom | 1:75015f627e89 | 389 | FunctionPointerArg1<void, int> onUpdate = NULL) |
| janjongboom | 1:75015f627e89 | 390 | { |
| janjongboom | 1:75015f627e89 | 391 | return define_resource(route, v, M2MBase::GET_PUT_ALLOWED, true, onUpdate); |
| janjongboom | 1:75015f627e89 | 392 | } |
| janjongboom | 1:75015f627e89 | 393 | |
| janjongboom | 1:75015f627e89 | 394 | SimpleResourceInt define_resource( |
| janjongboom | 1:75015f627e89 | 395 | const char* route, |
| janjongboom | 1:75015f627e89 | 396 | int v, |
| janjongboom | 1:75015f627e89 | 397 | void(*onUpdate)(int)) |
| janjongboom | 1:75015f627e89 | 398 | { |
| janjongboom | 1:75015f627e89 | 399 | FunctionPointerArg1<void, int> fp; |
| janjongboom | 1:75015f627e89 | 400 | fp.attach(onUpdate); |
| janjongboom | 1:75015f627e89 | 401 | return define_resource(route, v, M2MBase::GET_PUT_ALLOWED, true, fp); |
| janjongboom | 1:75015f627e89 | 402 | } |
| janjongboom | 0:9fa3f3028773 | 403 | }; |
| janjongboom | 0:9fa3f3028773 | 404 | |
| janjongboom | 0:9fa3f3028773 | 405 | #endif // __SIMPLE_MBED_CLIENT_H__ |
