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