Changeset 152 for uKadecot/trunk/kadecot


Ignore:
Timestamp:
Jan 14, 2016, 1:17:21 PM (8 years ago)
Author:
coas-nagasima
Message:

・デジタルPinとアナログPinのWAMPトピックを追加し、PubSubできるように機能追加。

デジタルPINのトピックは、

「com.sonycsl.kadecot.arduino.topic.pinXX」(XXは0から13)

アナログPINのトピックは、

「com.sonycsl.kadecot.arduino.topic.pinXX.thrYYY」(XXは14から19、YYYは閾値十進)

・デバッグ用の使用していない文字列が、ROM領域に残ってしまうのを修正
・WebSocket接続時のHTTPヘッダーを1行ずつNAK応答を待って送信しているのを、一括で送るよう変更

Location:
uKadecot/trunk/kadecot
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • uKadecot/trunk/kadecot/wamp_broker.c

    r148 r152  
    8080void wamp_broker_subscribe_topic(wamp_broker_t *broker, const char *value)
    8181{
    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
     91void wamp_broker_subscribe_echonetlite_topic(wamp_broker_t *broker, const char *value, int val_pos)
     92{
    8393        char *pos, *end;
    8494        wamp_subscription_t *subscription;
     95        wamp_echonetlite_subscription_t *echonetlite;
    8596        uint16_t devType;
    8697        uint8_t epc;
    8798
    88         if(strncmp(topic, value, sizeof(topic) - 1) != 0)
    89                 return;
    90 
    9199        subscription = wamp_broker_new_subscription(broker);
    92100        if(subscription == NULL)
    93101                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++){
    101111                if(*pos != '.')
    102112                        continue;
    103113
    104114                *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)));
    111121        if(devType == 0){
    112122                wamp_broker_delete_subscription(broker, subscription);
     
    114124        }
    115125
    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);
    118128        if(epc == 0){
    119129                wamp_broker_delete_subscription(broker, subscription);
     
    121131        }
    122132
    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        }
    125149
    126150        broker->current_subscription = subscription;
    127151}
    128152
    129 static void wamp_broker_subscribe_res(wamp_broker_t *broker);
     153void 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
     213static void wamp_broker_subscribe_echonetlite_res(wamp_broker_t *broker);
     214static void wamp_broker_subscribe_arduino_res(wamp_broker_t *broker);
    130215
    131216void wamp_broker_subscribe_close(struct wamp_state *s)
     
    137222
    138223        // 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        }
    140236
    141237        if (broker->error != NULL){
     
    148244}
    149245
    150 static void wamp_broker_subscribe_res(wamp_broker_t *broker)
     246static void wamp_broker_subscribe_echonetlite_res(wamp_broker_t *broker)
    151247{
    152248        struct wamp_state *s = broker->s;
     
    157253        ER ret;
    158254
    159         if ((subscription == NULL) || (subscription->devType == 0) || (subscription->epc == 0))
     255        if ((subscription == NULL) || (subscription->echonetlite.devType == 0) || (subscription->echonetlite.epc == 0))
    160256                return;
    161257
     
    175271        ret = main_send_message(buf, s->wbsid);
    176272        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
     280static 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);
    178312                return;
    179313        }
     
    218352                return;
    219353
     354        if (subscription->kind == WAMP_SUBSCRIPTION_KIND_ARDUINO)
     355                main_del_threshold(subscription->subscriptionId);
     356
    220357        wamp_broker_delete_subscription(broker, subscription);
    221358
     
    318455
    319456        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))
    324461                        continue;
    325462
     
    339476
    340477                ret = fbs_printf(buf, &pos, "{\"propertyName\":\"%s\",\"propertyValue\":[",
    341                         subscription->proprtyName);
     478                        subscription->echonetlite.proprtyName);
    342479                if (ret != E_OK) {
    343480                        syslog(LOG_WARNING, "fbs_printf() result = %d", ret);
     
    374511        }
    375512}
     513
     514void 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  
    3939#define WAMP_BROKER_H
    4040
     41typedef 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
     48typedef 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
     56typedef struct wamp_arduino_subscription
     57{
     58        uint8_t pinno;
     59        uint16_t threshold;
     60} wamp_arduino_subscription_t;
     61
    4162typedef struct wamp_subscription
    4263{
     
    4465        unsigned int requestId;
    4566        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        };
    5072} wamp_subscription_t;
    5173
     
    5577        unsigned int requestId;
    5678        int subscriptionId;
    57         wamp_subscription_t subscriptions[10];
     79        wamp_subscription_t subscriptions[30];
    5880        wamp_subscription_t *current_subscription;
    5981        const char *error;
     
    6688void wamp_broker_subscribe_options(wamp_broker_t *broker);
    6789void wamp_broker_subscribe_topic(wamp_broker_t *broker, const char *value);
     90void wamp_broker_subscribe_echonetlite_topic(wamp_broker_t *broker, const char *value, int pos);
     91void wamp_broker_subscribe_arduino_topic(wamp_broker_t *broker, const char *value, int pos);
    6892void wamp_broker_subscribe_close(struct wamp_state *s);
    6993
     
    89113void wamp_broker_publish_inf(wamp_broker_t *broker, uint16_t pubId, int deviceId,
    90114        uint16_t devType, uint8_t epc, uint8_t pdc, uint8_t *p_edt);
     115void wamp_broker_publish_pin(wamp_broker_t *broker, uint16_t pubId, int deviceId,
     116        int pinno, uint16_t value);
    91117
    92118#endif // WAMP_BROKER_H
Note: See TracChangeset for help on using the changeset viewer.