mbed client
Fork of simple-mbed-client by
simple-mbed-client.h@1:75015f627e89, 2016-05-15 (annotated)
- Committer:
- janjongboom
- Date:
- Sun May 15 20:28:07 2016 +0000
- Revision:
- 1:75015f627e89
- Parent:
- 0:9fa3f3028773
- Child:
- 2:0a015df677a4
Add some overloads for update callbacks
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 | 0:9fa3f3028773 | 167 | |
janjongboom | 0:9fa3f3028773 | 168 | uint8_t* buffIn; |
janjongboom | 0:9fa3f3028773 | 169 | uint32_t sizeIn; |
janjongboom | 0:9fa3f3028773 | 170 | resources[route_str]->get_value(buffIn, sizeIn); |
janjongboom | 0:9fa3f3028773 | 171 | |
janjongboom | 0:9fa3f3028773 | 172 | std::string s((char*)buffIn, sizeIn); |
janjongboom | 0:9fa3f3028773 | 173 | return s; |
janjongboom | 0:9fa3f3028773 | 174 | } |
janjongboom | 0:9fa3f3028773 | 175 | |
janjongboom | 0:9fa3f3028773 | 176 | bool set(string route_str, string v) { |
janjongboom | 0:9fa3f3028773 | 177 | if (!resources.count(route_str)) { |
janjongboom | 0:9fa3f3028773 | 178 | output.printf("[SMC] [ERROR] No such route (%s)\r\n", route_str.c_str()); |
janjongboom | 0:9fa3f3028773 | 179 | return false; |
janjongboom | 0:9fa3f3028773 | 180 | } |
janjongboom | 0:9fa3f3028773 | 181 | resources[route_str]->set_value((uint8_t*)v.c_str(), v.length()); |
janjongboom | 0:9fa3f3028773 | 182 | return true; |
janjongboom | 0:9fa3f3028773 | 183 | } |
janjongboom | 0:9fa3f3028773 | 184 | |
janjongboom | 0:9fa3f3028773 | 185 | bool set(string route, const int& v) { |
janjongboom | 0:9fa3f3028773 | 186 | stringstream ss; |
janjongboom | 0:9fa3f3028773 | 187 | ss << v; |
janjongboom | 0:9fa3f3028773 | 188 | std::string stringified = ss.str(); |
janjongboom | 0:9fa3f3028773 | 189 | |
janjongboom | 0:9fa3f3028773 | 190 | return set(route, stringified); |
janjongboom | 0:9fa3f3028773 | 191 | } |
janjongboom | 0:9fa3f3028773 | 192 | |
janjongboom | 0:9fa3f3028773 | 193 | bool define_resource_internal(const char* route, std::string v, M2MBase::Operation opr, bool observable) { |
janjongboom | 0:9fa3f3028773 | 194 | if (client) { |
janjongboom | 0:9fa3f3028773 | 195 | output.printf("[SMC] [ERROR] mbed_client_define_resource, Can only define resources before mbed_client_setup is called!\r\n"); |
janjongboom | 0:9fa3f3028773 | 196 | return false; |
janjongboom | 0:9fa3f3028773 | 197 | } |
janjongboom | 0:9fa3f3028773 | 198 | |
janjongboom | 0:9fa3f3028773 | 199 | vector<string> segments = parse_route(route); |
janjongboom | 0:9fa3f3028773 | 200 | if (segments.size() != 3) { |
janjongboom | 0:9fa3f3028773 | 201 | output.printf("[SMC] [ERROR] mbed_client_define_resource, Route needs to have three segments, split by '/' (%s)\r\n", route); |
janjongboom | 0:9fa3f3028773 | 202 | return false; |
janjongboom | 0:9fa3f3028773 | 203 | } |
janjongboom | 0:9fa3f3028773 | 204 | |
janjongboom | 0:9fa3f3028773 | 205 | int inst_id = 0; |
janjongboom | 0:9fa3f3028773 | 206 | // try { |
janjongboom | 0:9fa3f3028773 | 207 | // inst_id = stoi(segments.at(1)); |
janjongboom | 0:9fa3f3028773 | 208 | // } |
janjongboom | 0:9fa3f3028773 | 209 | // catch (const std::invalid_argument& ia) { |
janjongboom | 0:9fa3f3028773 | 210 | // output.printf("[SMC] [ERROR] mbed_client_define_resource, second route segment should be numeric, but was not (%s)\r\n", route); |
janjongboom | 0:9fa3f3028773 | 211 | // return false; |
janjongboom | 0:9fa3f3028773 | 212 | // } |
janjongboom | 0:9fa3f3028773 | 213 | |
janjongboom | 0:9fa3f3028773 | 214 | |
janjongboom | 0:9fa3f3028773 | 215 | M2MObjectInstance* inst; |
janjongboom | 0:9fa3f3028773 | 216 | if (objectInstances.count(segments.at(0))) { |
janjongboom | 0:9fa3f3028773 | 217 | output.printf("Found object... %s\r\n", segments.at(0).c_str()); |
janjongboom | 0:9fa3f3028773 | 218 | inst = objectInstances[segments.at(0)]; |
janjongboom | 0:9fa3f3028773 | 219 | } |
janjongboom | 0:9fa3f3028773 | 220 | else { |
janjongboom | 0:9fa3f3028773 | 221 | output.printf("Create new object... %s\r\n", segments.at(0).c_str()); |
janjongboom | 0:9fa3f3028773 | 222 | M2MObject* obj = M2MInterfaceFactory::create_object(segments.at(0).c_str()); |
janjongboom | 0:9fa3f3028773 | 223 | inst = obj->create_object_instance(inst_id); |
janjongboom | 0:9fa3f3028773 | 224 | objects.insert(std::pair<string, M2MObject*>(segments.at(0), obj)); |
janjongboom | 0:9fa3f3028773 | 225 | objectInstances.insert(std::pair<string, M2MObjectInstance*>(segments.at(0), inst)); |
janjongboom | 0:9fa3f3028773 | 226 | } |
janjongboom | 0:9fa3f3028773 | 227 | |
janjongboom | 0:9fa3f3028773 | 228 | // @todo check if the resource exists yet |
janjongboom | 0:9fa3f3028773 | 229 | M2MResource* res = inst->create_dynamic_resource(segments.at(2).c_str(), "", |
janjongboom | 0:9fa3f3028773 | 230 | M2MResourceInstance::STRING, observable); |
janjongboom | 0:9fa3f3028773 | 231 | res->set_operation(opr); |
janjongboom | 0:9fa3f3028773 | 232 | res->set_value((uint8_t*)v.c_str(), v.length()); |
janjongboom | 0:9fa3f3028773 | 233 | |
janjongboom | 0:9fa3f3028773 | 234 | string route_str(route); |
janjongboom | 0:9fa3f3028773 | 235 | resources.insert(std::pair<string, M2MResource*>(route_str, res)); |
janjongboom | 0:9fa3f3028773 | 236 | |
janjongboom | 0:9fa3f3028773 | 237 | return true; |
janjongboom | 0:9fa3f3028773 | 238 | } |
janjongboom | 0:9fa3f3028773 | 239 | |
janjongboom | 0:9fa3f3028773 | 240 | private: |
janjongboom | 0:9fa3f3028773 | 241 | vector<string> parse_route(const char* route) { |
janjongboom | 0:9fa3f3028773 | 242 | string s(route); |
janjongboom | 0:9fa3f3028773 | 243 | vector<string> v; |
janjongboom | 0:9fa3f3028773 | 244 | stringstream ss(s); |
janjongboom | 0:9fa3f3028773 | 245 | string item; |
janjongboom | 0:9fa3f3028773 | 246 | while (getline(ss, item, '/')) { |
janjongboom | 0:9fa3f3028773 | 247 | v.push_back(item); |
janjongboom | 0:9fa3f3028773 | 248 | } |
janjongboom | 0:9fa3f3028773 | 249 | return v; |
janjongboom | 0:9fa3f3028773 | 250 | } |
janjongboom | 0:9fa3f3028773 | 251 | |
janjongboom | 0:9fa3f3028773 | 252 | Serial output; |
janjongboom | 0:9fa3f3028773 | 253 | |
janjongboom | 0:9fa3f3028773 | 254 | MbedClient* client; |
janjongboom | 0:9fa3f3028773 | 255 | map<string, M2MObject*> objects; |
janjongboom | 0:9fa3f3028773 | 256 | map<string, M2MObjectInstance*> objectInstances; |
janjongboom | 0:9fa3f3028773 | 257 | map<string, M2MResource*> resources; |
janjongboom | 1:75015f627e89 | 258 | // @todo: write this |
janjongboom | 1:75015f627e89 | 259 | // map<string, FunctionPointerArg1<void, void*> updateValues; |
janjongboom | 0:9fa3f3028773 | 260 | }; |
janjongboom | 0:9fa3f3028773 | 261 | |
janjongboom | 0:9fa3f3028773 | 262 | class SimpleResourceString { |
janjongboom | 0:9fa3f3028773 | 263 | public: |
janjongboom | 0:9fa3f3028773 | 264 | SimpleResourceString(SimpleMbedClientBase* aSimpleClient, string aRoute) : |
janjongboom | 0:9fa3f3028773 | 265 | simpleClient(aSimpleClient), route(aRoute) {} |
janjongboom | 0:9fa3f3028773 | 266 | |
janjongboom | 0:9fa3f3028773 | 267 | string operator=(const string& newValue) { |
janjongboom | 0:9fa3f3028773 | 268 | simpleClient->set(route, newValue); |
janjongboom | 0:9fa3f3028773 | 269 | return newValue; |
janjongboom | 0:9fa3f3028773 | 270 | }; |
janjongboom | 0:9fa3f3028773 | 271 | operator string() const { |
janjongboom | 0:9fa3f3028773 | 272 | return simpleClient->get(route); |
janjongboom | 0:9fa3f3028773 | 273 | }; |
janjongboom | 0:9fa3f3028773 | 274 | |
janjongboom | 0:9fa3f3028773 | 275 | private: |
janjongboom | 0:9fa3f3028773 | 276 | SimpleMbedClientBase* simpleClient; |
janjongboom | 0:9fa3f3028773 | 277 | string route; |
janjongboom | 0:9fa3f3028773 | 278 | }; |
janjongboom | 0:9fa3f3028773 | 279 | |
janjongboom | 0:9fa3f3028773 | 280 | class SimpleResourceInt { |
janjongboom | 0:9fa3f3028773 | 281 | public: |
janjongboom | 0:9fa3f3028773 | 282 | SimpleResourceInt(SimpleMbedClientBase* aSimpleClient, string aRoute) : |
janjongboom | 0:9fa3f3028773 | 283 | simpleClient(aSimpleClient), route(aRoute) {} |
janjongboom | 0:9fa3f3028773 | 284 | |
janjongboom | 0:9fa3f3028773 | 285 | int operator=(int newValue) { |
janjongboom | 0:9fa3f3028773 | 286 | // printf("newValue %s = %d\n", route.c_str(), newValue); |
janjongboom | 0:9fa3f3028773 | 287 | simpleClient->set(route, newValue); |
janjongboom | 0:9fa3f3028773 | 288 | return newValue; |
janjongboom | 0:9fa3f3028773 | 289 | }; |
janjongboom | 0:9fa3f3028773 | 290 | operator int() const { |
janjongboom | 0:9fa3f3028773 | 291 | // printf("receiving a value for %s\n", route.c_str()); |
janjongboom | 0:9fa3f3028773 | 292 | string v = simpleClient->get(route); |
janjongboom | 0:9fa3f3028773 | 293 | // printf("string value is %s\n", v.c_str()); |
janjongboom | 0:9fa3f3028773 | 294 | if (v.empty()) return 0; |
janjongboom | 0:9fa3f3028773 | 295 | |
janjongboom | 0:9fa3f3028773 | 296 | return atoi((const char*)v.c_str()); |
janjongboom | 0:9fa3f3028773 | 297 | }; |
janjongboom | 0:9fa3f3028773 | 298 | |
janjongboom | 0:9fa3f3028773 | 299 | private: |
janjongboom | 0:9fa3f3028773 | 300 | SimpleMbedClientBase* simpleClient; |
janjongboom | 0:9fa3f3028773 | 301 | string route; |
janjongboom | 0:9fa3f3028773 | 302 | }; |
janjongboom | 0:9fa3f3028773 | 303 | |
janjongboom | 0:9fa3f3028773 | 304 | class SimpleMbedClient : public SimpleMbedClientBase { |
janjongboom | 0:9fa3f3028773 | 305 | public: |
janjongboom | 1:75015f627e89 | 306 | |
janjongboom | 1:75015f627e89 | 307 | // @todo: macro this up |
janjongboom | 1:75015f627e89 | 308 | |
janjongboom | 1:75015f627e89 | 309 | SimpleResourceString define_resource( |
janjongboom | 1:75015f627e89 | 310 | const char* route, |
janjongboom | 1:75015f627e89 | 311 | string v, |
janjongboom | 1:75015f627e89 | 312 | M2MBase::Operation opr = M2MBase::GET_PUT_ALLOWED, |
janjongboom | 1:75015f627e89 | 313 | bool observable = true, |
janjongboom | 1:75015f627e89 | 314 | FunctionPointerArg1<void, string> onUpdate = NULL) |
janjongboom | 1:75015f627e89 | 315 | { |
janjongboom | 0:9fa3f3028773 | 316 | bool res = define_resource_internal(route, v, opr, observable); |
janjongboom | 0:9fa3f3028773 | 317 | if (!res) printf("Error while creating %s\n", route); |
janjongboom | 0:9fa3f3028773 | 318 | return *(new SimpleResourceString(this, route)); |
janjongboom | 0:9fa3f3028773 | 319 | } |
janjongboom | 1:75015f627e89 | 320 | |
janjongboom | 1:75015f627e89 | 321 | SimpleResourceString define_resource( |
janjongboom | 1:75015f627e89 | 322 | const char* route, |
janjongboom | 1:75015f627e89 | 323 | string v, |
janjongboom | 1:75015f627e89 | 324 | M2MBase::Operation opr, |
janjongboom | 1:75015f627e89 | 325 | bool observable, |
janjongboom | 1:75015f627e89 | 326 | void(*onUpdate)(string)) |
janjongboom | 1:75015f627e89 | 327 | { |
janjongboom | 1:75015f627e89 | 328 | FunctionPointerArg1<void, string> fp; |
janjongboom | 1:75015f627e89 | 329 | fp.attach(onUpdate); |
janjongboom | 1:75015f627e89 | 330 | return define_resource(route, v, opr, observable, fp); |
janjongboom | 1:75015f627e89 | 331 | } |
janjongboom | 0:9fa3f3028773 | 332 | |
janjongboom | 1:75015f627e89 | 333 | SimpleResourceString define_resource( |
janjongboom | 1:75015f627e89 | 334 | const char* route, |
janjongboom | 1:75015f627e89 | 335 | string v, |
janjongboom | 1:75015f627e89 | 336 | FunctionPointerArg1<void, string> onUpdate = NULL) |
janjongboom | 1:75015f627e89 | 337 | { |
janjongboom | 1:75015f627e89 | 338 | return define_resource(route, v, M2MBase::GET_PUT_ALLOWED, true, onUpdate); |
janjongboom | 1:75015f627e89 | 339 | } |
janjongboom | 1:75015f627e89 | 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 | void(*onUpdate)(string)) |
janjongboom | 1:75015f627e89 | 345 | { |
janjongboom | 1:75015f627e89 | 346 | FunctionPointerArg1<void, string> fp; |
janjongboom | 1:75015f627e89 | 347 | fp.attach(onUpdate); |
janjongboom | 1:75015f627e89 | 348 | return define_resource(route, v, M2MBase::GET_PUT_ALLOWED, true, fp); |
janjongboom | 1:75015f627e89 | 349 | } |
janjongboom | 1:75015f627e89 | 350 | |
janjongboom | 1:75015f627e89 | 351 | SimpleResourceInt define_resource( |
janjongboom | 1:75015f627e89 | 352 | const char* route, |
janjongboom | 1:75015f627e89 | 353 | int v, |
janjongboom | 1:75015f627e89 | 354 | M2MBase::Operation opr = M2MBase::GET_PUT_ALLOWED, |
janjongboom | 1:75015f627e89 | 355 | bool observable = true, |
janjongboom | 1:75015f627e89 | 356 | FunctionPointerArg1<void, int> onUpdate = NULL) |
janjongboom | 1:75015f627e89 | 357 | { |
janjongboom | 0:9fa3f3028773 | 358 | stringstream ss; |
janjongboom | 0:9fa3f3028773 | 359 | ss << v; |
janjongboom | 0:9fa3f3028773 | 360 | std::string stringified = ss.str(); |
janjongboom | 0:9fa3f3028773 | 361 | bool res = define_resource_internal(route, stringified, opr, observable); |
janjongboom | 0:9fa3f3028773 | 362 | if (!res) printf("Error while creating %s\n", route); |
janjongboom | 0:9fa3f3028773 | 363 | return *(new SimpleResourceInt(this, route)); |
janjongboom | 0:9fa3f3028773 | 364 | } |
janjongboom | 1:75015f627e89 | 365 | |
janjongboom | 1:75015f627e89 | 366 | SimpleResourceInt define_resource( |
janjongboom | 1:75015f627e89 | 367 | const char* route, |
janjongboom | 1:75015f627e89 | 368 | int v, |
janjongboom | 1:75015f627e89 | 369 | M2MBase::Operation opr, |
janjongboom | 1:75015f627e89 | 370 | bool observable, |
janjongboom | 1:75015f627e89 | 371 | void(*onUpdate)(int)) |
janjongboom | 1:75015f627e89 | 372 | { |
janjongboom | 1:75015f627e89 | 373 | FunctionPointerArg1<void, int> fp; |
janjongboom | 1:75015f627e89 | 374 | fp.attach(onUpdate); |
janjongboom | 1:75015f627e89 | 375 | return define_resource(route, v, opr, observable, fp); |
janjongboom | 1:75015f627e89 | 376 | } |
janjongboom | 1:75015f627e89 | 377 | |
janjongboom | 1:75015f627e89 | 378 | SimpleResourceInt define_resource( |
janjongboom | 1:75015f627e89 | 379 | const char* route, |
janjongboom | 1:75015f627e89 | 380 | int v, |
janjongboom | 1:75015f627e89 | 381 | FunctionPointerArg1<void, int> onUpdate = NULL) |
janjongboom | 1:75015f627e89 | 382 | { |
janjongboom | 1:75015f627e89 | 383 | return define_resource(route, v, M2MBase::GET_PUT_ALLOWED, true, onUpdate); |
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 | void(*onUpdate)(int)) |
janjongboom | 1:75015f627e89 | 390 | { |
janjongboom | 1:75015f627e89 | 391 | FunctionPointerArg1<void, int> fp; |
janjongboom | 1:75015f627e89 | 392 | fp.attach(onUpdate); |
janjongboom | 1:75015f627e89 | 393 | return define_resource(route, v, M2MBase::GET_PUT_ALLOWED, true, fp); |
janjongboom | 1:75015f627e89 | 394 | } |
janjongboom | 0:9fa3f3028773 | 395 | }; |
janjongboom | 0:9fa3f3028773 | 396 | |
janjongboom | 0:9fa3f3028773 | 397 | #endif // __SIMPLE_MBED_CLIENT_H__ |