svghmi/svghmi.c
author Edouard Tisserant
Thu, 17 Nov 2022 11:08:36 +0100
changeset 3682 c613afdab571
parent 3613 7af7a23e4adb
permissions -rw-r--r--
IDE: Optimization of modification events processing in text editors.

Too many modifications types where registered, and then too many events were fired.
Also, in case of uninterrupted sequence of events, updates to the model is deferred to the end of that sequence (wx.Callafter).
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
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    13
#define MAX_CON_INDEX MAX_CONNECTIONS - 1
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
    14
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
    15
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
    16
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    17
/* PLC reads from that buffer */
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    18
static char rbuf[HMI_BUFFER_SIZE];
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    19
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    20
/* PLC writes to that buffer */
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    21
static char wbuf[HMI_BUFFER_SIZE];
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    22
2788
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
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    45
typedef struct hmi_tree_item_s hmi_tree_item_t;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    46
struct hmi_tree_item_s{
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
    47
    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
    48
    __IEC_types_enum type;
2765
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    49
    uint32_t buf_index;
2768
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    50
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    51
    /* retrieve/read/recv */
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    52
    buf_state_t rstate;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    53
2768
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    54
    /* 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
    55
    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
    56
2768
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    57
    /* 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
    58
    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
    59
    uint16_t age_ms[MAX_CONNECTIONS];
2768
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
    60
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    61
    /* dual linked list for subscriptions */
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    62
    hmi_tree_item_t *subscriptions_next;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    63
    hmi_tree_item_t *subscriptions_prev;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    64
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    65
    /* single linked list for changes from HMI */
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    66
    hmi_tree_item_t *incoming_prev;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    67
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    68
};
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    69
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    70
#define HMITREE_ITEM_INITIALIZER(cpath,type,buf_index) {        \
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    71
    &(cpath),                             /*ptr*/               \
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    72
    type,                                 /*type*/              \
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    73
    buf_index,                            /*buf_index*/         \
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    74
    buf_free,                             /*rstate*/            \
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    75
    {[0 ... MAX_CON_INDEX] = buf_free},   /*wstate*/            \
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    76
    {[0 ... MAX_CON_INDEX] = 0},          /*refresh_period_ms*/ \
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    77
    {[0 ... MAX_CON_INDEX] = 0},          /*age_ms*/            \
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    78
    NULL,                                 /*subscriptions_next*/\
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    79
    NULL,                                 /*subscriptions_prev*/\
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    80
    NULL}                                 /*incoming_next*/
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    81
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    82
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    83
/* entry for dual linked list for HMI subscriptions */
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    84
/* points to the end of the list */
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    85
static hmi_tree_item_t  *subscriptions_tail = NULL;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    86
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    87
/* entry for single linked list for changes from HMI */
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    88
/* points to the end of the list */
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    89
static hmi_tree_item_t *incoming_tail = NULL;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    90
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    91
static hmi_tree_item_t hmi_tree_items[] = {
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
    92
%(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
    93
};
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
    94
2767
302347f48193 svghmi.c : deduplicated variable access code borrowed from plc_debug.c. Added targets/var_access.c.
Edouard Tisserant
parents: 2766
diff changeset
    95
#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
    96
2767
302347f48193 svghmi.c : deduplicated variable access code borrowed from plc_debug.c. Added targets/var_access.c.
Edouard Tisserant
parents: 2766
diff changeset
    97
%(var_access_code)s
2765
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
    98
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
    99
static int write_iterator(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
   100
{
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   101
    uint32_t session_index = 0;
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   102
    int value_changed = 0;
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   103
    void *dest_p = NULL;
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   104
    void *value_p = NULL;
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   105
    size_t sz = 0;
3613
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   106
    int do_sample = 0;
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   107
    while(session_index < MAX_CONNECTIONS) {
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   108
        if(dsc->wstate[session_index] == buf_set){
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   109
            /* if being subscribed */
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   110
            if(dsc->refresh_period_ms[session_index]){
3613
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   111
                uint16_t new_age_ms = dsc->age_ms[session_index] + ticktime_ms;
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   112
                if(new_age_ms < dsc->refresh_period_ms[session_index]){
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   113
                    dsc->age_ms[session_index] = new_age_ms;
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   114
                }else{
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   115
                    dsc->wstate[session_index] = buf_tosend;
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   116
                    global_write_dirty = 1;
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   117
                }
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   118
            }
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   119
        }
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   120
3613
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   121
        /* variable is sampled if just subscribed (initial value)
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   122
           or already subscribed and having value change */
3613
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   123
        int sample_session = 0;
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   124
        int just_subscribed = dsc->wstate[session_index] == buf_new;
3613
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   125
        if(just_subscribed){
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   126
            sample_session = 1;
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   127
        } else {
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   128
            int already_subscribed = dsc->refresh_period_ms[session_index] > 0;
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   129
            if(already_subscribed){
3613
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   130
                /* compute value_changed once only */
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   131
                if(!value_p){
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   132
                    UnpackVar(dsc, &value_p, NULL, &sz);
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   133
                    if(__Is_a_string(dsc)){
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   134
                        sz = ((STRING*)value_p)->len + 1;
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   135
                    }
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   136
                    dest_p = &wbuf[dsc->buf_index];
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   137
                    value_changed = memcmp(dest_p, value_p, sz) != 0;
3613
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   138
                }
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   139
                sample_session = value_changed;
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   140
            }
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   141
        }
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   142
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   143
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   144
        if(sample_session){
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   145
            if(dsc->wstate[session_index] != buf_set && dsc->wstate[session_index] != buf_tosend) {
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   146
                if(dsc->wstate[session_index] == buf_new \
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   147
                   || ticktime_ms > dsc->refresh_period_ms[session_index]){
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   148
                    dsc->wstate[session_index] = buf_tosend;
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   149
                    global_write_dirty = 1;
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   150
                } else {
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   151
                    dsc->wstate[session_index] = buf_set;
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   152
                }
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   153
                dsc->age_ms[session_index] = 0;
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   154
            }
3613
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   155
            do_sample = 1;
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   156
        }
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   157
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   158
        session_index++;
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   159
    }
3613
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   160
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   161
    /* copy value if one at least one session did sample */
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   162
    if(do_sample){
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   163
        if(!value_p){
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   164
            UnpackVar(dsc, &value_p, NULL, &sz);
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   165
            if(__Is_a_string(dsc)){
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   166
                sz = ((STRING*)value_p)->len + 1;
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   167
            }
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   168
            dest_p = &wbuf[dsc->buf_index];
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   169
        }
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   170
        memcpy(dest_p, value_p, sz);
3613
7af7a23e4adb SVGHMI: ensures that PLC sends only fresh data to HMI, even right after variable being subscribed.
Edouard Tisserant
parents: 3400
diff changeset
   171
    }
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   172
    return 0;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   173
}
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   174
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   175
static int send_iterator(uint32_t index, hmi_tree_item_t *dsc, uint32_t session_index)
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   176
{
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   177
    if(dsc->wstate[session_index] == buf_tosend)
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   178
    {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   179
        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
   180
        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
   181
        {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   182
            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
   183
            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
   184
            if(__Is_a_string(dsc)){
1e5abecc3cde SVGHMI : support for HMI_STRING and HMI_BOOL
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 2822
diff changeset
   185
                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
   186
            }
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
   187
            /* 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
   188
            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
   189
            memcpy(dst_p + sizeof(uint32_t), src_p, sz);
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   190
            dsc->wstate[session_index] = buf_free;
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   191
            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
   192
        }
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   193
        else
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   194
        {
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
   195
            printf("BUG!!! %%d + %%ld + %%d >  %%ld \n", sbufidx, sizeof(uint32_t), sz,  sizeof(sbuf));
2862
a108677bd3d0 SVGHMI: whitespaces
Edouard Tisserant
parents: 2829
diff changeset
   196
            return EOVERFLOW;
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   197
        }
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   198
    }
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   199
2862
a108677bd3d0 SVGHMI: whitespaces
Edouard Tisserant
parents: 2829
diff changeset
   200
    return 0;
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   201
}
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   202
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   203
static int read_iterator(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
   204
{
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   205
    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
   206
    {
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   207
        void *src_p = &rbuf[dsc->buf_index];
3397
75920c99ffc9 SVGHMI: Adapt svghmi.c to changes in UnpackVar
Edouard Tisserant
parents: 3374
diff changeset
   208
        void *value_p = NULL;
75920c99ffc9 SVGHMI: Adapt svghmi.c to changes in UnpackVar
Edouard Tisserant
parents: 3374
diff changeset
   209
        size_t sz = 0;
75920c99ffc9 SVGHMI: Adapt svghmi.c to changes in UnpackVar
Edouard Tisserant
parents: 3374
diff changeset
   210
        UnpackVar(dsc, &value_p, NULL, &sz);
75920c99ffc9 SVGHMI: Adapt svghmi.c to changes in UnpackVar
Edouard Tisserant
parents: 3374
diff changeset
   211
        memcpy(value_p, src_p, sz);
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   212
        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
   213
    }
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   214
    return 0;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   215
}
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
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
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
   218
{
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   219
    uint32_t other_session_index = 0;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   220
    int previously_subscribed = 0;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   221
    int session_only_subscriber = 0;
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   222
    int session_already_subscriber = 0;
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   223
    int needs_subscription_for_session = (refresh_period_ms != 0);
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   224
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   225
    while(other_session_index < session_index) {
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   226
        previously_subscribed |= (dsc->refresh_period_ms[other_session_index++] != 0);
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   227
    }
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   228
    session_already_subscriber = (dsc->refresh_period_ms[other_session_index++] != 0);
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   229
    while(other_session_index < MAX_CONNECTIONS) {
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   230
        previously_subscribed |= (dsc->refresh_period_ms[other_session_index++] != 0);
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   231
    }
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   232
    session_only_subscriber = session_already_subscriber && !previously_subscribed;
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   233
    previously_subscribed |= session_already_subscriber;
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   234
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   235
    if(needs_subscription_for_session) {
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   236
        if(!session_already_subscriber)
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
   237
        {
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
   238
            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
   239
        }
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   240
        /* item is appended to list only when no session was previously subscribed */
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   241
        if(!previously_subscribed){
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   242
            /* append subsciption to list */
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   243
            if(subscriptions_tail != NULL){ 
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   244
                /* if list wasn't empty, link with previous tail*/
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   245
                subscriptions_tail->subscriptions_next = dsc;
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   246
            }
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   247
            dsc->subscriptions_prev = subscriptions_tail;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   248
            subscriptions_tail = dsc;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   249
            dsc->subscriptions_next = NULL;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   250
        }
2805
e521e0d133d5 SVGHMI: fixed HMI->PLC dataflow : not updates as expected, and not initialized properly after subscribe.
Edouard Tisserant
parents: 2802
diff changeset
   251
    } 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
   252
        dsc->wstate[session_index] = buf_free;
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   253
        /* item is removed from list only when session was the only one remaining */
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   254
        if (session_only_subscriber) {
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   255
            if(dsc->subscriptions_next == NULL){ /* remove tail  */
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   256
                /* re-link tail to previous */
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   257
                subscriptions_tail = dsc->subscriptions_prev;
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   258
                if(subscriptions_tail != NULL){
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   259
                    subscriptions_tail->subscriptions_next = NULL;
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   260
                }
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   261
            } else if(dsc->subscriptions_prev == NULL){ /* remove head  */
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   262
                dsc->subscriptions_next->subscriptions_prev = NULL;
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   263
            } else { /* remove entry in between other entries */
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   264
                /* re-link previous and next node */
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   265
                dsc->subscriptions_next->subscriptions_prev = dsc->subscriptions_prev;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   266
                dsc->subscriptions_prev->subscriptions_next = dsc->subscriptions_next;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   267
            }
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   268
            /* unnecessary
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   269
            dsc->subscriptions_next = NULL;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   270
            dsc->subscriptions_prev = NULL;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   271
            */
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   272
        }
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
   273
    }
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
   274
    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
   275
}
3f3b1b8ccba4 SVGHMI: Added iterators in svghmi.c copy-pasted form plc_debug.c
Edouard Tisserant
parents: 2765
diff changeset
   276
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
   277
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
   278
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
   279
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
   280
{
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
   281
    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
   282
}
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
   283
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
   284
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
   285
{
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
   286
    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
   287
}
2775
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   288
3281
1fc4274de64e SVGHMI: Fixed halting problem when there is no session opened.
Edouard Tisserant
parents: 3273
diff changeset
   289
int svghmi_continue_collect;
2776
246ae685ab65 SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2775
diff changeset
   290
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
   291
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
   292
{
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
   293
    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
   294
    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
   295
3281
1fc4274de64e SVGHMI: Fixed halting problem when there is no session opened.
Edouard Tisserant
parents: 3273
diff changeset
   296
    svghmi_continue_collect = 1;
2765
887aba5ef178 SVGHMI: svghmi.c now has mutex, iterator, and read/write buffer.
Edouard Tisserant
parents: 2764
diff changeset
   297
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
   298
    /* 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
   299
    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
   300
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   301
    if(!svghmi_handle)
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
   302
        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
   303
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
   304
    return 0;
2750
2694170cd88e intermediate commit, work in progress
Edouard Tisserant
parents:
diff changeset
   305
}
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
   306
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   307
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
   308
{
3281
1fc4274de64e SVGHMI: Fixed halting problem when there is no session opened.
Edouard Tisserant
parents: 3273
diff changeset
   309
    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
   310
    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
   311
    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
   312
}
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   313
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   314
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
   315
{
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   316
    if(AtomicCompareExchange(&hmitree_rlock, 0, 1) == 0) {
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   317
        hmi_tree_item_t *dsc = incoming_tail;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   318
        /* iterate through read list (changes from HMI) */
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   319
        while(dsc){
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   320
            hmi_tree_item_t *_dsc = dsc->incoming_prev;
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   321
            read_iterator(dsc);
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   322
            /* unnecessary
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   323
            dsc->incoming_prev = NULL;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   324
            */
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   325
            dsc = _dsc;
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   326
        }
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   327
        /* flush read list */
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   328
        incoming_tail = NULL;
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   329
        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
   330
    }
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
   331
}
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   332
b75cc2cf4e50 SVGHMI: draft for svghmi.c. It has all PLC variables pointed in HMI tree in an array.
Edouard Tisserant
parents: 2754
diff changeset
   333
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
   334
{
2768
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
   335
    global_write_dirty = 0;
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   336
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   337
    if(AtomicCompareExchange(&hmitree_wlock, 0, 1) == 0) {
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   338
        hmi_tree_item_t *dsc = subscriptions_tail;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   339
        while(dsc){
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   340
            write_iterator(dsc);
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   341
            dsc = dsc->subscriptions_prev;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   342
        }
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   343
        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
   344
    }
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   345
2768
31785529a657 SVGHMI: Intermediate state while working on svghmi.c
Edouard Tisserant
parents: 2767
diff changeset
   346
    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
   347
        SVGHMI_WakeupFromRTThread();
2775
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   348
    }
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   349
}
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   350
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   351
/* 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
   352
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
   353
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
   354
    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
   355
}
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
   356
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
   357
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
   358
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   359
3281
1fc4274de64e SVGHMI: Fixed halting problem when there is no session opened.
Edouard Tisserant
parents: 3273
diff changeset
   360
    if(svghmi_continue_collect) {
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   361
        int res;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   362
        sbufidx = HMI_HASH_SIZE;
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   363
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   364
        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
   365
            nRT_reschedule();
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
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   368
        hmi_tree_item_t *dsc = subscriptions_tail;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   369
        while(dsc){
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   370
            uint32_t index = dsc - hmi_tree_items;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   371
            res = send_iterator(index, dsc, session_index);
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   372
            if(res != 0){
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   373
                break;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   374
            }
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   375
            dsc = dsc->subscriptions_prev;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   376
        }
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   377
        if(res == 0)
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   378
        {
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
   379
            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
   380
                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
   381
                *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
   382
                *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
   383
                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
   384
                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
   385
            }
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   386
            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
   387
            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
   388
        }
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   389
        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
   390
        return res;
2775
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   391
    }
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   392
    else
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   393
    {
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   394
        return EINTR;
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   395
    }
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   396
}
3b93409ba22c SVGHMI: WIP for python<->C data exchange
Edouard Tisserant
parents: 2771
diff changeset
   397
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   398
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
   399
    unset = -1,
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   400
    setval = 0,
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   401
    reset = 1,
2798
ddb2c4668a6b SVGHMI : many details about communication implemented in JS, with side effects.
Edouard Tisserant
parents: 2789
diff changeset
   402
    subscribe = 2
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   403
} cmd_from_JS;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   404
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
   405
int svghmi_reset(uint32_t session_index){
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   406
    hmi_tree_item_t *dsc = subscriptions_tail;
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   407
    while(AtomicCompareExchange(&hmitree_wlock, 0, 1)){
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   408
        nRT_reschedule();
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   409
    }
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   410
    while(dsc){
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   411
        hmi_tree_item_t *_dsc = dsc->subscriptions_prev;
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   412
        update_refresh_period(dsc, session_index, 0);
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   413
        dsc = _dsc;
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   414
    }
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   415
    AtomicCompareExchange(&hmitree_wlock, 1, 0);
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
   416
    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
   417
}
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
   418
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
   419
// 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
   420
//   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
   421
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
   422
    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
   423
    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
   424
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
   425
    int was_hearbeat = 0;
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   426
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   427
    /* match hmitree fingerprint */
2789
ba0dd2ec6dc4 SVGHMI: now built.
Edouard Tisserant
parents: 2788
diff changeset
   428
    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
   429
    {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   430
        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
   431
        return -EINVAL;
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   432
    }
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   433
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   434
    int ret;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   435
    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
   436
    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
   437
    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
   438
    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
   439
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   440
    while(cursor < end)
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   441
    {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   442
        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
   443
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   444
        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
   445
        cmd = *(cursor++);
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   446
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   447
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   448
        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
   449
            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
   450
                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
   451
                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
   452
            }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   453
            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
   454
                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
   455
                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
   456
            }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   457
        }
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   458
        switch(cmd)
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   459
        {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   460
            case setval:
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   461
            {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   462
                uint32_t index = *(uint32_t*)(cursor);
2789
ba0dd2ec6dc4 SVGHMI: now built.
Edouard Tisserant
parents: 2788
diff changeset
   463
                uint8_t const *valptr = cursor + sizeof(uint32_t);
2862
a108677bd3d0 SVGHMI: whitespaces
Edouard Tisserant
parents: 2829
diff changeset
   464
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   465
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
   466
                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
   467
                    was_hearbeat = 1;
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   468
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   469
                if(index < HMI_ITEM_COUNT)
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   470
                {
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   471
                    hmi_tree_item_t *dsc = &hmi_tree_items[index];
3397
75920c99ffc9 SVGHMI: Adapt svghmi.c to changes in UnpackVar
Edouard Tisserant
parents: 3374
diff changeset
   472
                    size_t sz = 0;
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   473
                    void *dst_p = &rbuf[dsc->buf_index];
2829
4c2c50f60730 SVGHMI : HMI_STRING now also supported from HMI to PLC
Edouard Tisserant
parents: 2828
diff changeset
   474
4c2c50f60730 SVGHMI : HMI_STRING now also supported from HMI to PLC
Edouard Tisserant
parents: 2828
diff changeset
   475
                    if(__Is_a_string(dsc)){
4c2c50f60730 SVGHMI : HMI_STRING now also supported from HMI to PLC
Edouard Tisserant
parents: 2828
diff changeset
   476
                        sz = ((STRING*)valptr)->len + 1;
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   477
                    } else {
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   478
                        UnpackVar(dsc, NULL, NULL, &sz);
2829
4c2c50f60730 SVGHMI : HMI_STRING now also supported from HMI to PLC
Edouard Tisserant
parents: 2828
diff changeset
   479
                    }
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   480
2802
64e6f73b9859 SVGHMI - Fixed svghmi.{c,js} about HMI -> PLC data unpack.
Edouard Tisserant
parents: 2799
diff changeset
   481
                    if((valptr + sz) <= end)
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   482
                    {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   483
                        // 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
   484
                        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
   485
                            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
   486
                                nRT_reschedule();
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   487
                            }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   488
                            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
   489
                        }
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   490
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   491
                        memcpy(dst_p, valptr, sz);
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   492
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   493
                        /* check that rstate is not already buf_set */
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   494
                        if(dsc->rstate != buf_set){
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   495
                            dsc->rstate = buf_set;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   496
                            /* append entry to read list (changes from HMI) */
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   497
                            dsc->incoming_prev = incoming_tail;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   498
                            incoming_tail = dsc;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   499
                        }
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   500
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   501
                        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
   502
                    }
2862
a108677bd3d0 SVGHMI: whitespaces
Edouard Tisserant
parents: 2829
diff changeset
   503
                    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
   504
                    {
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   505
                        ret = -EINVAL;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   506
                        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
   507
                    }
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
   508
                }
2862
a108677bd3d0 SVGHMI: whitespaces
Edouard Tisserant
parents: 2829
diff changeset
   509
                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
   510
                {
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   511
                    ret = -EINVAL;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   512
                    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
   513
                }
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   514
            }
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   515
            break;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   516
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   517
            case reset:
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   518
            {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   519
                progress = 0;
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   520
                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
   521
                    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
   522
                        nRT_reschedule();
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   523
                    }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   524
                    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
   525
                }
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   526
                {
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   527
                    hmi_tree_item_t *dsc = subscriptions_tail;
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   528
                    while(dsc){
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   529
                        hmi_tree_item_t *_dsc = dsc->subscriptions_prev;
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   530
                        update_refresh_period(dsc, session_index, 0);
3400
c2b46d0965ca Fix bug introduced in previous commit : dual link list wasn't append and remove wasn't implemented correctly. Removed debug code, enhanced variable names and comments.
Edouard Tisserant <edouard.tisserant@gmail.com>
parents: 3399
diff changeset
   531
                        dsc = _dsc;
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   532
                    }
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   533
                }
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   534
            }
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   535
            break;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   536
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   537
            case subscribe:
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   538
            {
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   539
                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
   540
                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
   541
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   542
                if(index < HMI_ITEM_COUNT)
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   543
                {
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   544
                    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
   545
                        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
   546
                            nRT_reschedule();
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   547
                        }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   548
                        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
   549
                    }
3399
95e0b926a8c3 SVGHMI: optimization of C part : stop traversing the whole HMI tree, use dual linked list for subscriptions and single linked list for changes from HMI. Intermediate commit, still crashing in some cases.
Edouard Tisserant
parents: 3397
diff changeset
   550
                    hmi_tree_item_t *dsc = &hmi_tree_items[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
   551
                    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
   552
                }
2862
a108677bd3d0 SVGHMI: whitespaces
Edouard Tisserant
parents: 2829
diff changeset
   553
                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
   554
                {
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   555
                    ret = -EINVAL;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   556
                    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
   557
                }
2788
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   558
2862
a108677bd3d0 SVGHMI: whitespaces
Edouard Tisserant
parents: 2829
diff changeset
   559
                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
   560
                           sizeof(uint16_t) /* refresh period */;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   561
            }
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   562
            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
   563
            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
   564
                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
   565
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   566
        }
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   567
        cursor += progress;
2ed9ff826d03 SVGHMI: Work in progress. C side mostly implemented, neither built nor tested.
Edouard Tisserant
parents: 2779
diff changeset
   568
    }
3374
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   569
    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
   570
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   571
exit_free:
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   572
    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
   573
        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
   574
        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
   575
    }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   576
    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
   577
        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
   578
        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
   579
    }
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   580
    return ret;
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   581
}
9a82918e063c SVGHMI: optimize HMI tree handling C code to lower CPU usage when traversing large trees
Edouard Tisserant
parents: 3295
diff changeset
   582