Changeset 152 for uKadecot/trunk/kadecot
- Timestamp:
- Jan 14, 2016, 1:17:21 PM (7 years ago)
- Location:
- uKadecot/trunk/kadecot
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
uKadecot/trunk/kadecot/wamp_broker.c
r148 r152 80 80 void wamp_broker_subscribe_topic(wamp_broker_t *broker, const char *value) 81 81 { 82 static const char topic[] = "com.sonycsl.kadecot.echonetlite.topic."; 82 static const char echonetlite_topic[] = "com.sonycsl.kadecot.echonetlite.topic."; 83 static const char arduino_topic[] = "com.sonycsl.kadecot.arduino.topic."; 84 85 if (strncmp(echonetlite_topic, value, sizeof(echonetlite_topic) - 1) == 0) 86 wamp_broker_subscribe_echonetlite_topic(broker, value, sizeof(echonetlite_topic) - 1); 87 else if (strncmp(arduino_topic, value, sizeof(arduino_topic) - 1) == 0) 88 wamp_broker_subscribe_arduino_topic(broker, value, sizeof(arduino_topic) - 1); 89 } 90 91 void wamp_broker_subscribe_echonetlite_topic(wamp_broker_t *broker, const char *value, int val_pos) 92 { 83 93 char *pos, *end; 84 94 wamp_subscription_t *subscription; 95 wamp_echonetlite_subscription_t *echonetlite; 85 96 uint16_t devType; 86 97 uint8_t epc; 87 98 88 if(strncmp(topic, value, sizeof(topic) - 1) != 0)89 return;90 91 99 subscription = wamp_broker_new_subscription(broker); 92 100 if(subscription == NULL) 93 101 return; 94 95 subscription->deviceName[0] = '\0'; 96 strcpy_s(subscription->deviceName, sizeof(subscription->deviceName), &value[sizeof(topic) - 1]); 97 subscription->deviceName[sizeof(subscription->deviceName) - 1] = '\0'; 98 99 end = &subscription->deviceName[sizeof(subscription->deviceName)]; 100 for(pos = subscription->deviceName; pos < end; pos++){ 102 subscription->kind = WAMP_SUBSCRIPTION_KIND_ECHONETLITE; 103 echonetlite = &subscription->echonetlite; 104 105 echonetlite->deviceName[0] = '\0'; 106 strcpy_s(echonetlite->deviceName, sizeof(echonetlite->deviceName), &value[val_pos]); 107 echonetlite->deviceName[sizeof(echonetlite->deviceName) - 1] = '\0'; 108 109 end = &echonetlite->deviceName[sizeof(echonetlite->deviceName)]; 110 for(pos = echonetlite->deviceName; pos < end; pos++){ 101 111 if(*pos != '.') 102 112 continue; 103 113 104 114 *pos = '\0'; 105 subscription->proprtyName = pos + 1;106 break; 107 } 108 109 devType = kadecot_names_get_device_type( subscription->deviceName,110 strnlen( subscription->deviceName, sizeof(subscription->deviceName)));115 echonetlite->proprtyName = pos + 1; 116 break; 117 } 118 119 devType = kadecot_names_get_device_type(echonetlite->deviceName, 120 strnlen(echonetlite->deviceName, sizeof(echonetlite->deviceName))); 111 121 if(devType == 0){ 112 122 wamp_broker_delete_subscription(broker, subscription); … … 114 124 } 115 125 116 epc = kadecot_names_get_property_code( subscription->proprtyName,117 strnlen( subscription->proprtyName, subscription->proprtyName - subscription->deviceName), devType);126 epc = kadecot_names_get_property_code(echonetlite->proprtyName, 127 strnlen(echonetlite->proprtyName, echonetlite->proprtyName - echonetlite->deviceName), devType); 118 128 if(epc == 0){ 119 129 wamp_broker_delete_subscription(broker, subscription); … … 121 131 } 122 132 123 subscription->devType = devType; 124 subscription->epc = epc; 133 echonetlite->devType = devType; 134 echonetlite->epc = epc; 135 136 wamp_subscription_t *spos, *send = &broker->subscriptions[sizeof(broker->subscriptions) / sizeof(broker->subscriptions[0])]; 137 138 for (spos = broker->subscriptions; spos < send; spos++) { 139 if ((spos == subscription) || (spos->subscriptionId == 0) || (spos->kind != WAMP_SUBSCRIPTION_KIND_ECHONETLITE)) 140 continue; 141 142 if ((spos->echonetlite.devType != devType) || (spos->echonetlite.epc != epc)) 143 continue; 144 145 wamp_broker_delete_subscription(broker, subscription); 146 subscription = spos; 147 break; 148 } 125 149 126 150 broker->current_subscription = subscription; 127 151 } 128 152 129 static void wamp_broker_subscribe_res(wamp_broker_t *broker); 153 void wamp_broker_subscribe_arduino_topic(wamp_broker_t *broker, const char *value, int val_pos) 154 { 155 char *pos, *end; 156 wamp_subscription_t *subscription; 157 wamp_arduino_subscription_t *arduino; 158 char pinno[40], *threshold = NULL; 159 160 subscription = wamp_broker_new_subscription(broker); 161 if (subscription == NULL) 162 return; 163 subscription->kind = WAMP_SUBSCRIPTION_KIND_ARDUINO; 164 arduino = &subscription->arduino; 165 166 pinno[0] = '\0'; 167 strcpy_s(pinno, sizeof(pinno), &value[val_pos]); 168 pinno[sizeof(pinno) - 1] = '\0'; 169 170 if (pinno[0] != 'p' || pinno[1] != 'i' || pinno[2] != 'n') { 171 wamp_broker_delete_subscription(broker, subscription); 172 return; 173 } 174 175 end = &pinno[sizeof(pinno)]; 176 for (pos = pinno; pos < end; pos++) { 177 if (*pos != '.') 178 continue; 179 180 *pos = '\0'; 181 threshold = pos + 1; 182 if (threshold[0] != 't' || threshold[1] != 'h' || threshold[2] != 'r') { 183 threshold = NULL; 184 } 185 break; 186 } 187 188 arduino->pinno = atoi(&pinno[3]); 189 if (threshold != NULL) { 190 arduino->threshold = atoi(&threshold[3]); 191 } 192 else { 193 arduino->threshold = 0; 194 } 195 196 wamp_subscription_t *spos, *send = &broker->subscriptions[sizeof(broker->subscriptions) / sizeof(broker->subscriptions[0])]; 197 198 for (spos = broker->subscriptions; spos < send; spos++) { 199 if ((spos == subscription) || (spos->subscriptionId == 0) || (spos->kind != WAMP_SUBSCRIPTION_KIND_ARDUINO)) 200 continue; 201 202 if ((spos->arduino.pinno != arduino->pinno) || (spos->arduino.threshold != arduino->threshold)) 203 continue; 204 205 wamp_broker_delete_subscription(broker, subscription); 206 subscription = spos; 207 break; 208 } 209 210 broker->current_subscription = subscription; 211 } 212 213 static void wamp_broker_subscribe_echonetlite_res(wamp_broker_t *broker); 214 static void wamp_broker_subscribe_arduino_res(wamp_broker_t *broker); 130 215 131 216 void wamp_broker_subscribe_close(struct wamp_state *s) … … 137 222 138 223 // send RESULT 139 wamp_broker_subscribe_res(broker); 224 if (broker->current_subscription != NULL) { 225 switch (broker->current_subscription->kind) { 226 case WAMP_SUBSCRIPTION_KIND_ECHONETLITE: 227 wamp_broker_subscribe_echonetlite_res(broker); 228 break; 229 case WAMP_SUBSCRIPTION_KIND_ARDUINO: 230 wamp_broker_subscribe_arduino_res(broker); 231 break; 232 default: 233 break; 234 } 235 } 140 236 141 237 if (broker->error != NULL){ … … 148 244 } 149 245 150 static void wamp_broker_subscribe_ res(wamp_broker_t *broker)246 static void wamp_broker_subscribe_echonetlite_res(wamp_broker_t *broker) 151 247 { 152 248 struct wamp_state *s = broker->s; … … 157 253 ER ret; 158 254 159 if ((subscription == NULL) || (subscription-> devType == 0) || (subscription->epc == 0))255 if ((subscription == NULL) || (subscription->echonetlite.devType == 0) || (subscription->echonetlite.epc == 0)) 160 256 return; 161 257 … … 175 271 ret = main_send_message(buf, s->wbsid); 176 272 if (ret != E_OK) { 177 syslog(LOG_WARNING, "wamp_broker_subscribe_close() : main_send_message() result = %d", ret); 273 syslog(LOG_WARNING, "wamp_broker_subscribe_echonetlite_res() : main_send_message() result = %d", ret); 274 return; 275 } 276 277 broker->error = NULL; 278 } 279 280 static void wamp_broker_subscribe_arduino_res(wamp_broker_t *broker) 281 { 282 struct wamp_state *s = broker->s; 283 wamp_subscription_t *subscription = broker->current_subscription; 284 // send SUBSCRIBED or ERROR 285 ECN_FBS_ID buf; 286 ECN_FBS_SSIZE_T pos = 0; 287 ER ret; 288 289 if ((subscription == NULL) 290 || ((subscription->arduino.pinno < 0) || (subscription->arduino.pinno > 19))) 291 return; 292 293 if (subscription->arduino.pinno >= 14) 294 main_add_threshold(subscription->subscriptionId, subscription->arduino.pinno, subscription->arduino.threshold); 295 296 ret = _ecn_fbs_cre(1, &buf); 297 if (ret != E_OK) { 298 syslog(LOG_WARNING, "_ecn_fbs_cre() result = %d", ret); 299 return; 300 } 301 302 ret = fbs_printf(buf, &pos, "[33,%d,%d]", broker->requestId, subscription->subscriptionId); 303 if (ret != E_OK) { 304 syslog(LOG_WARNING, "fbs_printf() result = %d", ret); 305 _ecn_fbs_del(buf); 306 return; 307 } 308 309 ret = main_send_message(buf, s->wbsid); 310 if (ret != E_OK) { 311 syslog(LOG_WARNING, "wamp_broker_subscribe_arduino_res() : main_send_message() result = %d", ret); 178 312 return; 179 313 } … … 218 352 return; 219 353 354 if (subscription->kind == WAMP_SUBSCRIPTION_KIND_ARDUINO) 355 main_del_threshold(subscription->subscriptionId); 356 220 357 wamp_broker_delete_subscription(broker, subscription); 221 358 … … 318 455 319 456 for(subscription = broker->subscriptions; subscription < end; subscription++){ 320 if ( subscription->subscriptionId == 0)321 continue; 322 323 if ((subscription-> devType != devType) || (subscription->epc != epc))457 if ((subscription->subscriptionId == 0) || (subscription->kind != WAMP_SUBSCRIPTION_KIND_ECHONETLITE)) 458 continue; 459 460 if ((subscription->echonetlite.devType != devType) || (subscription->echonetlite.epc != epc)) 324 461 continue; 325 462 … … 339 476 340 477 ret = fbs_printf(buf, &pos, "{\"propertyName\":\"%s\",\"propertyValue\":[", 341 subscription-> proprtyName);478 subscription->echonetlite.proprtyName); 342 479 if (ret != E_OK) { 343 480 syslog(LOG_WARNING, "fbs_printf() result = %d", ret); … … 374 511 } 375 512 } 513 514 void wamp_broker_publish_pin(wamp_broker_t *broker, uint16_t pubId, int deviceId, int pinno, uint16_t value) 515 { 516 struct wamp_state *s = broker->s; 517 wamp_subscription_t *subscription, *end = &broker->subscriptions[sizeof(broker->subscriptions) / sizeof(broker->subscriptions[0])]; 518 ECN_FBS_ID buf; 519 ECN_FBS_SSIZE_T pos = 0; 520 ER ret; 521 522 for (subscription = broker->subscriptions; subscription < end; subscription++) { 523 if ((subscription->subscriptionId == 0) || (subscription->kind != WAMP_SUBSCRIPTION_KIND_ARDUINO)) 524 continue; 525 526 if (subscription->arduino.pinno != pinno) 527 continue; 528 529 ret = _ecn_fbs_cre(1, &buf); 530 if (ret != E_OK) { 531 syslog(LOG_WARNING, "_ecn_fbs_cre() result = %d", ret); 532 break; 533 } 534 535 ret = fbs_printf(buf, &pos, "[36,%d,%d,{\"deviceId\":%d},[],", 536 subscription->subscriptionId, pubId, deviceId); 537 if (ret != E_OK) { 538 syslog(LOG_WARNING, "fbs_printf() result = %d", ret); 539 _ecn_fbs_del(buf); 540 break; 541 } 542 543 if ((pinno >= 0) && (pinno <= 13)) { 544 ret = fbs_printf(buf, &pos, "{\"pin\":%d,\"value\":\"%s\"}]", 545 subscription->arduino.pinno, (value == 0) ? "LOW" : "HIGH"); 546 if (ret != E_OK) { 547 syslog(LOG_WARNING, "fbs_printf() result = %d", ret); 548 _ecn_fbs_del(buf); 549 break; 550 } 551 } 552 else { 553 ret = fbs_printf(buf, &pos, "{\"pin\":%d,\"value\":%d}]", 554 subscription->arduino.pinno, value); 555 if (ret != E_OK) { 556 syslog(LOG_WARNING, "fbs_printf() result = %d", ret); 557 _ecn_fbs_del(buf); 558 break; 559 } 560 } 561 562 ret = main_send_message(buf, s->wbsid); 563 if (ret != E_OK) { 564 syslog(LOG_WARNING, "wamp_broker_publish_inf() : main_send_message() result = %d", ret); 565 } 566 break; 567 } 568 } -
uKadecot/trunk/kadecot/wamp_broker.h
r108 r152 39 39 #define WAMP_BROKER_H 40 40 41 typedef enum wamp_subscription_kind 42 { 43 WAMP_SUBSCRIPTION_KIND_NONE, 44 WAMP_SUBSCRIPTION_KIND_ECHONETLITE, 45 WAMP_SUBSCRIPTION_KIND_ARDUINO, 46 } wamp_subscription_kind_t; 47 48 typedef struct wamp_echonetlite_subscription 49 { 50 char deviceName[40]; 51 char *proprtyName; 52 uint16_t devType; 53 uint8_t epc; 54 } wamp_echonetlite_subscription_t; 55 56 typedef struct wamp_arduino_subscription 57 { 58 uint8_t pinno; 59 uint16_t threshold; 60 } wamp_arduino_subscription_t; 61 41 62 typedef struct wamp_subscription 42 63 { … … 44 65 unsigned int requestId; 45 66 int subscriptionId; 46 char deviceName[40]; 47 char *proprtyName; 48 uint16_t devType; 49 uint8_t epc; 67 wamp_subscription_kind_t kind; 68 union{ 69 wamp_echonetlite_subscription_t echonetlite; 70 wamp_arduino_subscription_t arduino; 71 }; 50 72 } wamp_subscription_t; 51 73 … … 55 77 unsigned int requestId; 56 78 int subscriptionId; 57 wamp_subscription_t subscriptions[ 10];79 wamp_subscription_t subscriptions[30]; 58 80 wamp_subscription_t *current_subscription; 59 81 const char *error; … … 66 88 void wamp_broker_subscribe_options(wamp_broker_t *broker); 67 89 void wamp_broker_subscribe_topic(wamp_broker_t *broker, const char *value); 90 void wamp_broker_subscribe_echonetlite_topic(wamp_broker_t *broker, const char *value, int pos); 91 void wamp_broker_subscribe_arduino_topic(wamp_broker_t *broker, const char *value, int pos); 68 92 void wamp_broker_subscribe_close(struct wamp_state *s); 69 93 … … 89 113 void wamp_broker_publish_inf(wamp_broker_t *broker, uint16_t pubId, int deviceId, 90 114 uint16_t devType, uint8_t epc, uint8_t pdc, uint8_t *p_edt); 115 void wamp_broker_publish_pin(wamp_broker_t *broker, uint16_t pubId, int deviceId, 116 int pinno, uint16_t value); 91 117 92 118 #endif // WAMP_BROKER_H
Note:
See TracChangeset
for help on using the changeset viewer.