svghmi/svghmi.c
author Edouard Tisserant
Wed, 01 Dec 2021 09:54:02 +0100
branchRuntimeLists
changeset 3394 9ea29ac18837
parent 3374 9a82918e063c
child 3397 75920c99ffc9
permissions -rw-r--r--
RUNTIME: Variable trace now uses limited list and buffer instead of flags in instance tree that was requiring systematical instance tree traversal, and worst size buffer. Forcing and retain still use tree traversal.
2765
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
     1
#include <pthread.h>
2776
246ae685ab65 SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2775
diff changeset
     2
#include <errno.h>
2764
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
     3
#include "iec_types_all.h"
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
     4
#include "POUS.h"
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
     5
#include "config.h"
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
     6
#include "beremiz.h"
2750
2694170cd88e intermediate commit, work in progress
Edouard Tisserant
parents:
diff changeset
     7
2768
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
     8
#define DEFAULT_REFRESH_PERIOD_MS 100
2765
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
     9
#define HMI_BUFFER_SIZE %(buffer_size)d
2776
246ae685ab65 SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2775
diff changeset
    10
#define HMI_ITEM_COUNT %(item_count)d
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
    11
#define HMI_HASH_SIZE 8
3270
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
    12
#define MAX_CONNECTIONS %(max_connections)d
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
    13
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
    14
static uint8_t hmi_hash[HMI_HASH_SIZE] = {%(hmi_hash_ints)s};
2765
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    15
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    16
/* PLC reads from that buffer */
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    17
static char rbuf[HMI_BUFFER_SIZE];
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    18
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    19
/* PLC writes to that buffer */
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    20
static char wbuf[HMI_BUFFER_SIZE];
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    21
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
    22
/* TODO change that in case of multiclient... */
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
    23
/* worst biggest send buffer. FIXME : use dynamic alloc ? */
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
    24
static char sbuf[HMI_HASH_SIZE +  HMI_BUFFER_SIZE + (HMI_ITEM_COUNT * sizeof(uint32_t))];
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
    25
static unsigned int sbufidx;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
    26
2768
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    27
%(extern_variables_declarations)s
2765
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    28
2771
361366b891ca WIP on svghmi, now builds and runs. HTTP serving + WS transport ready, missing actual data to transmit and thread to collect it.
Edouard Tisserant
parents: 2768
diff changeset
    29
#define ticktime_ns %(PLC_ticktime)d
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
    30
static uint16_t ticktime_ms = (ticktime_ns>1000000)?
2768
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    31
                     ticktime_ns/1000000:
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    32
                     1;
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    33
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    34
typedef enum {
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    35
    buf_free = 0,
2805
e521e0d133d5 SVGHMI: fixed HMI->PLC dataflow : not updates as expected, and not initialized properly after subscribe.
Edouard Tisserant
parents: 2802
diff changeset
    36
    buf_new,
2768
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    37
    buf_set,
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    38
    buf_tosend
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    39
} buf_state_t;
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    40
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
    41
static int global_write_dirty = 0;
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
    42
static long hmitree_rlock = 0;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
    43
static long hmitree_wlock = 0;
2764
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
    44
2771
361366b891ca WIP on svghmi, now builds and runs. HTTP serving + WS transport ready, missing actual data to transmit and thread to collect it.
Edouard Tisserant
parents: 2768
diff changeset
    45
typedef struct {
2764
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
    46
    void *ptr;
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
    47
    __IEC_types_enum type;
2765
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    48
    uint32_t buf_index;
2768
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    49
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    50
    /* publish/write/send */
3270
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
    51
    buf_state_t wstate[MAX_CONNECTIONS];
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
    52
2768
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    53
    /* zero means not subscribed */
3270
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
    54
    uint16_t refresh_period_ms[MAX_CONNECTIONS];
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
    55
    uint16_t age_ms[MAX_CONNECTIONS];
2768
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    56
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    57
    /* retrieve/read/recv */
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    58
    buf_state_t rstate;
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    59
2764
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
    60
} hmi_tree_item_t;
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
    61
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
    62
static hmi_tree_item_t hmi_tree_item[] = {
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
    63
%(variable_decl_array)s
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
    64
};
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
    65
2789
ba0dd2ec6dc4 SVGHMI: now built.
Edouard Tisserant
parents: 2788
diff changeset
    66
typedef int(*hmi_tree_iterator)(uint32_t, hmi_tree_item_t*);
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
    67
static int traverse_hmi_tree(hmi_tree_iterator fp)
2765
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    68
{
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    69
    unsigned int i;
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    70
    for(i = 0; i < sizeof(hmi_tree_item)/sizeof(hmi_tree_item_t); i++){
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    71
        hmi_tree_item_t *dsc = &hmi_tree_item[i];
2799
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
    72
        int res = (*fp)(i, dsc);
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
    73
        if(res != 0){
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
    74
            return res;
2799
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
    75
        }
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
    76
    }
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
    77
    return 0;
2765
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    78
}
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    79
2767
302347f48193 svghmi.c : deduplicated variable access code borrowed from plc_debug.c. Added targets/var_access.c.
Edouard Tisserant
parents: 2766
diff changeset
    80
#define __Unpack_desc_type hmi_tree_item_t
2766
3f3b1b8ccba4 SVGHMI: Added iterators in svghmi.c copy-pasted form plc_debug.c
Edouard Tisserant
parents: 2765
diff changeset
    81
2767
302347f48193 svghmi.c : deduplicated variable access code borrowed from plc_debug.c. Added targets/var_access.c.
Edouard Tisserant
parents: 2766
diff changeset
    82
%(var_access_code)s
2765
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    83
2789
ba0dd2ec6dc4 SVGHMI: now built.
Edouard Tisserant
parents: 2788
diff changeset
    84
static int write_iterator(uint32_t index, hmi_tree_item_t *dsc)
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
    85
{
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
    86
    {
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
    87
        uint32_t session_index = 0;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
    88
        int value_changed = 0;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
    89
        void *dest_p = NULL;
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
    90
        void *real_value_p = NULL;
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
    91
        void *visible_value_p = NULL;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
    92
        USINT sz = 0;
3273
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
    93
        while(session_index < MAX_CONNECTIONS) {
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
    94
            if(dsc->wstate[session_index] == buf_set){
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
    95
                /* if being subscribed */
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
    96
                if(dsc->refresh_period_ms[session_index]){
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
    97
                    if(dsc->age_ms[session_index] + ticktime_ms < dsc->refresh_period_ms[session_index]){
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
    98
                        dsc->age_ms[session_index] += ticktime_ms;
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
    99
                    }else{
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   100
                        dsc->wstate[session_index] = buf_tosend;
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   101
                        global_write_dirty = 1;
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   102
                    }
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   103
                }
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   104
            }
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   105
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   106
            /* variable is sample only if just subscribed
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   107
               or already subscribed and having value change */
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   108
            int do_sample = 0;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   109
            int just_subscribed = dsc->wstate[session_index] == buf_new;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   110
            if(!just_subscribed){
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   111
                int already_subscribed = dsc->refresh_period_ms[session_index] > 0;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   112
                if(already_subscribed){
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   113
                    if(!value_changed){
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   114
                        if(!visible_value_p){
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   115
                            char flags = 0;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   116
                            visible_value_p = UnpackVar(dsc, &real_value_p, &flags);
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   117
                            if(__Is_a_string(dsc)){
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   118
                                sz = ((STRING*)visible_value_p)->len + 1;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   119
                            } else {
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   120
                                sz = __get_type_enum_size(dsc->type);
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   121
                            }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   122
                            dest_p = &wbuf[dsc->buf_index];
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   123
                        }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   124
                        value_changed = memcmp(dest_p, visible_value_p, sz) != 0;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   125
                        do_sample = value_changed;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   126
                    }else{
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   127
                        do_sample = 1;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   128
                    }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   129
                }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   130
            } else {
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   131
                do_sample = 1;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   132
            }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   133
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   134
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   135
            if(do_sample){
3273
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   136
                if(dsc->wstate[session_index] != buf_set && dsc->wstate[session_index] != buf_tosend) {
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   137
                    if(dsc->wstate[session_index] == buf_new \
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   138
                       || ticktime_ms > dsc->refresh_period_ms[session_index]){
3273
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   139
                        dsc->wstate[session_index] = buf_tosend;
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   140
                        global_write_dirty = 1;
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   141
                    } else {
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   142
                        dsc->wstate[session_index] = buf_set;
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   143
                    }
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   144
                    dsc->age_ms[session_index] = 0;
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   145
                }
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   146
            }
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   147
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   148
            session_index++;
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   149
        }
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   150
        /* copy value if changed (and subscribed) */
08a5a019bed2 SVGHMI: finished multiclient support. Still needs more testing.
Edouard Tisserant
parents: 3271
diff changeset
   151
        if(value_changed)
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   152
            memcpy(dest_p, visible_value_p, sz);
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   153
    }
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   154
    // else ... : PLC can't wait, variable will be updated next turn
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   155
    return 0;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   156
}
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   157
3270
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
   158
static uint32_t send_session_index;
2789
ba0dd2ec6dc4 SVGHMI: now built.
Edouard Tisserant
parents: 2788
diff changeset
   159
static int send_iterator(uint32_t index, hmi_tree_item_t *dsc)
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   160
{
3270
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
   161
    if(dsc->wstate[send_session_index] == buf_tosend)
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   162
    {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   163
        uint32_t sz = __get_type_enum_size(dsc->type);
2799
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   164
        if(sbufidx + sizeof(uint32_t) + sz <=  sizeof(sbuf))
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   165
        {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   166
            void *src_p = &wbuf[dsc->buf_index];
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   167
            void *dst_p = &sbuf[sbufidx];
2826
1e5abecc3cde SVGHMI : support for HMI_STRING and HMI_BOOL
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2822
diff changeset
   168
            if(__Is_a_string(dsc)){
1e5abecc3cde SVGHMI : support for HMI_STRING and HMI_BOOL
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2822
diff changeset
   169
                sz = ((STRING*)src_p)->len + 1;
1e5abecc3cde SVGHMI : support for HMI_STRING and HMI_BOOL
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2822
diff changeset
   170
            }
2799
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   171
            /* TODO : force into little endian */
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   172
            memcpy(dst_p, &index, sizeof(uint32_t));
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   173
            memcpy(dst_p + sizeof(uint32_t), src_p, sz);
3270
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
   174
            dsc->wstate[send_session_index] = buf_free;
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   175
            sbufidx += sizeof(uint32_t) /* index */ + sz;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   176
        }
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   177
        else
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   178
        {
2799
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   179
            printf("BUG!!! %%d + %%ld + %%d >  %%ld \n", sbufidx, sizeof(uint32_t), sz,  sizeof(sbuf));
2862
a108677bd3d0 SVGHMI: whitespaces
Edouard Tisserant
parents: 2829
diff changeset
   180
            return EOVERFLOW;
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   181
        }
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   182
    }
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   183
2862
a108677bd3d0 SVGHMI: whitespaces
Edouard Tisserant
parents: 2829
diff changeset
   184
    return 0;
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   185
}
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   186
2789
ba0dd2ec6dc4 SVGHMI: now built.
Edouard Tisserant
parents: 2788
diff changeset
   187
static int read_iterator(uint32_t index, hmi_tree_item_t *dsc)
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   188
{
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   189
    if(dsc->rstate == buf_set)
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   190
    {
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   191
        void *src_p = &rbuf[dsc->buf_index];
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   192
        void *real_value_p = NULL;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   193
        char flags = 0;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   194
        void *visible_value_p = UnpackVar(dsc, &real_value_p, &flags);
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   195
        memcpy(real_value_p, src_p, __get_type_enum_size(dsc->type));
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   196
        dsc->rstate = buf_free;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   197
    }
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   198
    return 0;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   199
}
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   200
3270
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
   201
void update_refresh_period(hmi_tree_item_t *dsc, uint32_t session_index, uint16_t refresh_period_ms)
2768
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
   202
{
2805
e521e0d133d5 SVGHMI: fixed HMI->PLC dataflow : not updates as expected, and not initialized properly after subscribe.
Edouard Tisserant
parents: 2802
diff changeset
   203
    if(refresh_period_ms) {
3270
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
   204
        if(!dsc->refresh_period_ms[session_index])
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
   205
        {
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
   206
            dsc->wstate[session_index] = buf_new;
2863
e120d6985a2f SVGHMI: fix wrong updates of HMI variables on each change, especially when not subscribed.
Edouard Tisserant
parents: 2862
diff changeset
   207
        }
2805
e521e0d133d5 SVGHMI: fixed HMI->PLC dataflow : not updates as expected, and not initialized properly after subscribe.
Edouard Tisserant
parents: 2802
diff changeset
   208
    } else {
3270
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
   209
        dsc->wstate[session_index] = buf_free;
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
   210
    }
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
   211
    dsc->refresh_period_ms[session_index] = refresh_period_ms;
2766
3f3b1b8ccba4 SVGHMI: Added iterators in svghmi.c copy-pasted form plc_debug.c
Edouard Tisserant
parents: 2765
diff changeset
   212
}
3f3b1b8ccba4 SVGHMI: Added iterators in svghmi.c copy-pasted form plc_debug.c
Edouard Tisserant
parents: 2765
diff changeset
   213
3270
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
   214
static uint32_t reset_session_index;
2789
ba0dd2ec6dc4 SVGHMI: now built.
Edouard Tisserant
parents: 2788
diff changeset
   215
static int reset_iterator(uint32_t index, hmi_tree_item_t *dsc)
ba0dd2ec6dc4 SVGHMI: now built.
Edouard Tisserant
parents: 2788
diff changeset
   216
{
3270
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
   217
    update_refresh_period(dsc, reset_session_index, 0);
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   218
    return 0;
2765
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
   219
}
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
   220
3294
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   221
static void *svghmi_handle;
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   222
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   223
void SVGHMI_SuspendFromPythonThread(void)
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   224
{
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   225
    wait_RT_to_nRT_signal(svghmi_handle);
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   226
}
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   227
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   228
void SVGHMI_WakeupFromRTThread(void)
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   229
{
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   230
    unblock_RT_to_nRT_signal(svghmi_handle);
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   231
}
2775
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   232
3281
1fc4274de64e SVGHMI: Fixed halting problem when there is no session opened.
Edouard Tisserant
parents: 3273
diff changeset
   233
int svghmi_continue_collect;
2776
246ae685ab65 SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2775
diff changeset
   234
2764
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   235
int __init_svghmi()
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   236
{
3295
0375d801fff7 Runtime+SVGHMI: Add generic wakeup of threads from PLC thread to windows implementation of plc_main.c. Also added nRT_reschedule to abstract sched_yield.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3294
diff changeset
   237
    memset(rbuf,0,sizeof(rbuf));
0375d801fff7 Runtime+SVGHMI: Add generic wakeup of threads from PLC thread to windows implementation of plc_main.c. Also added nRT_reschedule to abstract sched_yield.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3294
diff changeset
   238
    memset(wbuf,0,sizeof(wbuf));
2819
3b99c908f43b SVGHMI: change collect/send thread looping condition to fix infinite loop in some cases
Edouard Tisserant
parents: 2817
diff changeset
   239
3281
1fc4274de64e SVGHMI: Fixed halting problem when there is no session opened.
Edouard Tisserant
parents: 3273
diff changeset
   240
    svghmi_continue_collect = 1;
2765
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
   241
3294
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   242
    /* create svghmi_pipe */
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   243
    svghmi_handle = create_RT_to_nRT_signal("SVGHMI_pipe");
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   244
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   245
    if(!svghmi_handle) 
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   246
        return 1;
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   247
2764
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   248
    return 0;
2750
2694170cd88e intermediate commit, work in progress
Edouard Tisserant
parents:
diff changeset
   249
}
2764
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   250
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   251
void __cleanup_svghmi()
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   252
{
3281
1fc4274de64e SVGHMI: Fixed halting problem when there is no session opened.
Edouard Tisserant
parents: 3273
diff changeset
   253
    svghmi_continue_collect = 0;
2820
d9b5303d43dc SVGHMI : had to move the problem of wkaing up python thread from plc thread to platform specific code.
Edouard Tisserant
parents: 2819
diff changeset
   254
    SVGHMI_WakeupFromRTThread();
3294
e3db472b0dfb Runtime+SVGHMI: Added a generic way to wakeup non-real-time threads from real-time PLC thread. Replace SVGHMI specific calls in Linux and Xenomai implementations of plc_main.c. Fixed xenomai build, xeno-config making problems with --no-auto-init argument.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3281
diff changeset
   255
    delete_RT_to_nRT_signal(svghmi_handle);
2764
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   256
}
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   257
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   258
void __retrieve_svghmi()
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   259
{
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   260
    if(AtomicCompareExchange(&hmitree_rlock, 0, 1) == 0) {
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   261
        traverse_hmi_tree(read_iterator);
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   262
        AtomicCompareExchange(&hmitree_rlock, 1, 0);
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   263
    }
2764
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   264
}
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   265
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   266
void __publish_svghmi()
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   267
{
2768
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
   268
    global_write_dirty = 0;
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   269
    if(AtomicCompareExchange(&hmitree_wlock, 0, 1) == 0) {
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   270
        traverse_hmi_tree(write_iterator);
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   271
        AtomicCompareExchange(&hmitree_wlock, 1, 0);
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   272
    }
2768
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
   273
    if(global_write_dirty) {
2820
d9b5303d43dc SVGHMI : had to move the problem of wkaing up python thread from plc thread to platform specific code.
Edouard Tisserant
parents: 2819
diff changeset
   274
        SVGHMI_WakeupFromRTThread();
2775
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   275
    }
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   276
}
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   277
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   278
/* PYTHON CALLS */
3271
561dbd1e3e04 SVGHMI: Fixing last commit's multiclient implementation, in case of watchdog. To be continued, since multiclient still fail...
Edouard Tisserant
parents: 3270
diff changeset
   279
int svghmi_wait(void){
561dbd1e3e04 SVGHMI: Fixing last commit's multiclient implementation, in case of watchdog. To be continued, since multiclient still fail...
Edouard Tisserant
parents: 3270
diff changeset
   280
561dbd1e3e04 SVGHMI: Fixing last commit's multiclient implementation, in case of watchdog. To be continued, since multiclient still fail...
Edouard Tisserant
parents: 3270
diff changeset
   281
    SVGHMI_SuspendFromPythonThread();
561dbd1e3e04 SVGHMI: Fixing last commit's multiclient implementation, in case of watchdog. To be continued, since multiclient still fail...
Edouard Tisserant
parents: 3270
diff changeset
   282
}
561dbd1e3e04 SVGHMI: Fixing last commit's multiclient implementation, in case of watchdog. To be continued, since multiclient still fail...
Edouard Tisserant
parents: 3270
diff changeset
   283
3270
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
   284
int svghmi_send_collect(uint32_t session_index, uint32_t *size, char **ptr){
2775
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   285
3281
1fc4274de64e SVGHMI: Fixed halting problem when there is no session opened.
Edouard Tisserant
parents: 3273
diff changeset
   286
    if(svghmi_continue_collect) {
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   287
        int res;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   288
        sbufidx = HMI_HASH_SIZE;
3270
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
   289
        send_session_index = session_index;
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   290
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   291
        while(AtomicCompareExchange(&hmitree_wlock, 0, 1)){
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   292
            nRT_reschedule();
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   293
        }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   294
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   295
        if((res = traverse_hmi_tree(send_iterator)) == 0)
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   296
        {
2799
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   297
            if(sbufidx > HMI_HASH_SIZE){
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   298
                memcpy(&sbuf[0], &hmi_hash[0], HMI_HASH_SIZE);
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   299
                *ptr = &sbuf[0];
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   300
                *size = sbufidx;
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   301
                AtomicCompareExchange(&hmitree_wlock, 1, 0);
2799
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   302
                return 0;
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   303
            }
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   304
            AtomicCompareExchange(&hmitree_wlock, 1, 0);
2799
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   305
            return ENODATA;
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   306
        }
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   307
        // printf("collected BAD result %%d\n", res);
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   308
        AtomicCompareExchange(&hmitree_wlock, 1, 0);
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   309
        return res;
2775
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   310
    }
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   311
    else
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   312
    {
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   313
        return EINTR;
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   314
    }
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   315
}
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   316
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   317
typedef enum {
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   318
    unset = -1,
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   319
    setval = 0,
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   320
    reset = 1,
2798
ddb2c4668a6b SVGHMI : many details about communication implemented in JS, with side effects.
Edouard Tisserant
parents: 2789
diff changeset
   321
    subscribe = 2
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   322
} cmd_from_JS;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   323
3271
561dbd1e3e04 SVGHMI: Fixing last commit's multiclient implementation, in case of watchdog. To be continued, since multiclient still fail...
Edouard Tisserant
parents: 3270
diff changeset
   324
int svghmi_reset(uint32_t session_index){
561dbd1e3e04 SVGHMI: Fixing last commit's multiclient implementation, in case of watchdog. To be continued, since multiclient still fail...
Edouard Tisserant
parents: 3270
diff changeset
   325
    reset_session_index = session_index;
561dbd1e3e04 SVGHMI: Fixing last commit's multiclient implementation, in case of watchdog. To be continued, since multiclient still fail...
Edouard Tisserant
parents: 3270
diff changeset
   326
    traverse_hmi_tree(reset_iterator);
561dbd1e3e04 SVGHMI: Fixing last commit's multiclient implementation, in case of watchdog. To be continued, since multiclient still fail...
Edouard Tisserant
parents: 3270
diff changeset
   327
    return 1;
561dbd1e3e04 SVGHMI: Fixing last commit's multiclient implementation, in case of watchdog. To be continued, since multiclient still fail...
Edouard Tisserant
parents: 3270
diff changeset
   328
}
561dbd1e3e04 SVGHMI: Fixing last commit's multiclient implementation, in case of watchdog. To be continued, since multiclient still fail...
Edouard Tisserant
parents: 3270
diff changeset
   329
2822
9101a72a1da0 SVGHMI: added a watchdog. To ensure that the whole chain is checked, watchdog use a periodic echo of a hearteat variable. JS client code systematically register /HEARTBEAT at 1s update freq, and reacts on updates of /HEARTBEAT by systematically incrementing it. C code catch /HEARTBEAT update and feeds python-implemented watchdog. For now, watchdog does nothing when tiggered
Edouard Tisserant
parents: 2820
diff changeset
   330
// Returns :
9101a72a1da0 SVGHMI: added a watchdog. To ensure that the whole chain is checked, watchdog use a periodic echo of a hearteat variable. JS client code systematically register /HEARTBEAT at 1s update freq, and reacts on updates of /HEARTBEAT by systematically incrementing it. C code catch /HEARTBEAT update and feeds python-implemented watchdog. For now, watchdog does nothing when tiggered
Edouard Tisserant
parents: 2820
diff changeset
   331
//   0 is OK, <0 is error, 1 is heartbeat
3270
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
   332
int svghmi_recv_dispatch(uint32_t session_index, uint32_t size, const uint8_t *ptr){
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   333
    const uint8_t* cursor = ptr + HMI_HASH_SIZE;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   334
    const uint8_t* end = ptr + size;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   335
2822
9101a72a1da0 SVGHMI: added a watchdog. To ensure that the whole chain is checked, watchdog use a periodic echo of a hearteat variable. JS client code systematically register /HEARTBEAT at 1s update freq, and reacts on updates of /HEARTBEAT by systematically incrementing it. C code catch /HEARTBEAT update and feeds python-implemented watchdog. For now, watchdog does nothing when tiggered
Edouard Tisserant
parents: 2820
diff changeset
   336
    int was_hearbeat = 0;
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   337
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   338
    /* match hmitree fingerprint */
2789
ba0dd2ec6dc4 SVGHMI: now built.
Edouard Tisserant
parents: 2788
diff changeset
   339
    if(size <= HMI_HASH_SIZE || memcmp(ptr, hmi_hash, HMI_HASH_SIZE) != 0)
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   340
    {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   341
        printf("svghmi_recv_dispatch MISMATCH !!\n");
2822
9101a72a1da0 SVGHMI: added a watchdog. To ensure that the whole chain is checked, watchdog use a periodic echo of a hearteat variable. JS client code systematically register /HEARTBEAT at 1s update freq, and reacts on updates of /HEARTBEAT by systematically incrementing it. C code catch /HEARTBEAT update and feeds python-implemented watchdog. For now, watchdog does nothing when tiggered
Edouard Tisserant
parents: 2820
diff changeset
   342
        return -EINVAL;
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   343
    }
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   344
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   345
    int ret;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   346
    int got_wlock = 0;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   347
    int got_rlock = 0;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   348
    cmd_from_JS cmd_old = unset;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   349
    cmd_from_JS cmd = unset;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   350
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   351
    while(cursor < end)
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   352
    {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   353
        uint32_t progress;
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   354
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   355
        cmd_old = cmd;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   356
        cmd = *(cursor++);
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   357
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   358
        if(cmd_old != cmd){
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   359
            if(got_wlock){
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   360
                AtomicCompareExchange(&hmitree_wlock, 1, 0);
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   361
                got_wlock = 0;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   362
            }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   363
            if(got_rlock){
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   364
                AtomicCompareExchange(&hmitree_rlock, 1, 0);
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   365
                got_rlock = 0;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   366
            }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   367
        }
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   368
        switch(cmd)
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   369
        {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   370
            case setval:
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   371
            {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   372
                uint32_t index = *(uint32_t*)(cursor);
2789
ba0dd2ec6dc4 SVGHMI: now built.
Edouard Tisserant
parents: 2788
diff changeset
   373
                uint8_t const *valptr = cursor + sizeof(uint32_t);
2862
a108677bd3d0 SVGHMI: whitespaces
Edouard Tisserant
parents: 2829
diff changeset
   374
2822
9101a72a1da0 SVGHMI: added a watchdog. To ensure that the whole chain is checked, watchdog use a periodic echo of a hearteat variable. JS client code systematically register /HEARTBEAT at 1s update freq, and reacts on updates of /HEARTBEAT by systematically incrementing it. C code catch /HEARTBEAT update and feeds python-implemented watchdog. For now, watchdog does nothing when tiggered
Edouard Tisserant
parents: 2820
diff changeset
   375
                if(index == heartbeat_index)
9101a72a1da0 SVGHMI: added a watchdog. To ensure that the whole chain is checked, watchdog use a periodic echo of a hearteat variable. JS client code systematically register /HEARTBEAT at 1s update freq, and reacts on updates of /HEARTBEAT by systematically incrementing it. C code catch /HEARTBEAT update and feeds python-implemented watchdog. For now, watchdog does nothing when tiggered
Edouard Tisserant
parents: 2820
diff changeset
   376
                    was_hearbeat = 1;
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   377
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   378
                if(index < HMI_ITEM_COUNT)
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   379
                {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   380
                    hmi_tree_item_t *dsc = &hmi_tree_item[index];
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   381
                    void *real_value_p = NULL;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   382
                    char flags = 0;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   383
                    void *visible_value_p = UnpackVar(dsc, &real_value_p, &flags);
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   384
                    void *dst_p = &rbuf[dsc->buf_index];
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   385
                    uint32_t sz = __get_type_enum_size(dsc->type);
2829
4c2c50f60730 SVGHMI : HMI_STRING now also supported from HMI to PLC
Edouard Tisserant
parents: 2828
diff changeset
   386
4c2c50f60730 SVGHMI : HMI_STRING now also supported from HMI to PLC
Edouard Tisserant
parents: 2828
diff changeset
   387
                    if(__Is_a_string(dsc)){
4c2c50f60730 SVGHMI : HMI_STRING now also supported from HMI to PLC
Edouard Tisserant
parents: 2828
diff changeset
   388
                        sz = ((STRING*)valptr)->len + 1;
4c2c50f60730 SVGHMI : HMI_STRING now also supported from HMI to PLC
Edouard Tisserant
parents: 2828
diff changeset
   389
                    }
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   390
2802
64e6f73b9859 SVGHMI - Fixed svghmi.{c,js} about HMI -> PLC data unpack.
Edouard Tisserant
parents: 2799
diff changeset
   391
                    if((valptr + sz) <= end)
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   392
                    {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   393
                        // rescheduling spinlock until free
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   394
                        if(!got_rlock){
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   395
                            while(AtomicCompareExchange(&hmitree_rlock, 0, 1)){
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   396
                                nRT_reschedule();
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   397
                            }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   398
                            got_rlock=1;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   399
                        }
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   400
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   401
                        memcpy(dst_p, valptr, sz);
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   402
                        dsc->rstate = buf_set;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   403
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   404
                        progress = sz + sizeof(uint32_t) /* index */;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   405
                    }
2862
a108677bd3d0 SVGHMI: whitespaces
Edouard Tisserant
parents: 2829
diff changeset
   406
                    else
2799
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   407
                    {
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   408
                        ret = -EINVAL;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   409
                        goto exit_free;
2799
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   410
                    }
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   411
                }
2862
a108677bd3d0 SVGHMI: whitespaces
Edouard Tisserant
parents: 2829
diff changeset
   412
                else
2799
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   413
                {
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   414
                    ret = -EINVAL;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   415
                    goto exit_free;
2799
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   416
                }
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   417
            }
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   418
            break;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   419
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   420
            case reset:
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   421
            {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   422
                progress = 0;
3270
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
   423
                reset_session_index = session_index;
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   424
                if(!got_wlock){
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   425
                    while(AtomicCompareExchange(&hmitree_wlock, 0, 1)){
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   426
                        nRT_reschedule();
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   427
                    }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   428
                    got_wlock = 1;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   429
                }
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   430
                traverse_hmi_tree(reset_iterator);
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   431
            }
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   432
            break;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   433
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   434
            case subscribe:
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   435
            {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   436
                uint32_t index = *(uint32_t*)(cursor);
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   437
                uint16_t refresh_period_ms = *(uint32_t*)(cursor + sizeof(uint32_t));
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   438
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   439
                if(index < HMI_ITEM_COUNT)
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   440
                {
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   441
                    if(!got_wlock){
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   442
                        while(AtomicCompareExchange(&hmitree_wlock, 0, 1)){
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   443
                            nRT_reschedule();
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   444
                        }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   445
                        got_wlock = 1;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   446
                    }
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   447
                    hmi_tree_item_t *dsc = &hmi_tree_item[index];
3270
38f7122ccbf9 SVGHMI: Implemented multiserver+multiclient, but only tested with single client and single server for now. To be continued...
Edouard Tisserant
parents: 2863
diff changeset
   448
                    update_refresh_period(dsc, session_index, refresh_period_ms);
2799
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   449
                }
2862
a108677bd3d0 SVGHMI: whitespaces
Edouard Tisserant
parents: 2829
diff changeset
   450
                else
2799
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   451
                {
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   452
                    ret = -EINVAL;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   453
                    goto exit_free;
2799
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   454
                }
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   455
2862
a108677bd3d0 SVGHMI: whitespaces
Edouard Tisserant
parents: 2829
diff changeset
   456
                progress = sizeof(uint32_t) /* index */ +
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   457
                           sizeof(uint16_t) /* refresh period */;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   458
            }
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   459
            break;
2799
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   460
            default:
f5da343b9b63 SVGHMI: Many fixes. Subscriptions to HMItree seems to be working, and dispatch function is called in JS with good data. Bidirectional communication now really working.
Edouard Tisserant
parents: 2798
diff changeset
   461
                printf("svghmi_recv_dispatch unknown %%d\n",cmd);
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   462
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   463
        }
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   464
        cursor += progress;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   465
    }
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   466
    ret = was_hearbeat;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   467
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   468
exit_free:
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   469
    if(got_wlock){
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   470
        AtomicCompareExchange(&hmitree_wlock, 1, 0);
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   471
        got_wlock = 0;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   472
    }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   473
    if(got_rlock){
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   474
        AtomicCompareExchange(&hmitree_rlock, 1, 0);
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   475
        got_rlock = 0;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   476
    }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   477
    return ret;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   478
}
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   479