svghmi/svghmi.c
author Edouard Tisserant <edouard.tisserant@gmail.com>
Thu, 22 Dec 2022 02:46:08 +0100
branchwxPython4
changeset 3710 51c2d434e10e
parent 3613 7af7a23e4adb
permissions -rw-r--r--
tests: IDE: own text matching logic for OCR reliability, enhanced ihtml report
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