1550 {
1555 int i,
j, l,
n,
status, size,
index1,
index2,
state,
run_number,
cont;
1560
1561 if (!
seq.running ||
seq.paused) {
1563 return;
1564 }
1565
1566 if (
c->pnseq ==
NULL) {
1571 return;
1572 }
1573
1576 return;
1577
1578
1581 strcpy(
seq.last_msg,
str+11);
1582
1585 seq_error(
seq,
c,
"Cannot find <RunSequence> tag in XML file");
1586 return;
1587 }
1588
1590
1591
1592 if (
seq.stack_index > 0 &&
seq.current_line_number ==
seq.subroutine_end_line[
seq.stack_index - 1]) {
1594 seq.subroutine_end_line[
seq.stack_index - 1] = 0;
1595
1596 if (
seq.subroutine_return_line[
seq.stack_index - 1] == -1) {
1597
1599 cm_msg(
MTALK,
"sequencer",
"Sequencer is finished.");
1600
1602 return;
1603 }
1604
1605 seq.current_line_number =
seq.subroutine_return_line[
seq.stack_index - 1];
1606 seq.subroutine_return_line[
seq.stack_index - 1] = 0;
1607 seq.subroutine_call_line[
seq.stack_index - 1] = 0;
1608 seq.ssubroutine_call_line[
seq.stack_index - 1] = 0;
1611 return;
1612 }
1613
1614
1616
1619 cm_msg(
MTALK,
"sequencer",
"Sequencer is finished.");
1620
1622 }
1623 return;
1624 }
1625
1626
1628 if (
seq.loop_start_line[
i] > 0)
1629 break;
1631 if (
seq.current_line_number ==
seq.loop_end_line[
i]) {
1634
1635 if (
seq.loop_counter[
i] ==
seq.loop_n[
i]) {
1636 seq.loop_counter[
i] = 0;
1637 seq.loop_start_line[
i] = 0;
1638 seq.sloop_start_line[
i] = 0;
1639 seq.loop_end_line[
i] = 0;
1640 seq.sloop_end_line[
i] = 0;
1642 seq.current_line_number++;
1643 } else {
1652 value = std::to_string(
seq.loop_counter[
i] + 1);
1653 }
1655 size =
value.length() + 1;
1656 if (size < 32)
1657 size = 32;
1659 }
1660 seq.loop_counter[
i]++;
1661 seq.current_line_number =
seq.loop_start_line[
i] + 1;
1662 }
1664 return;
1665 }
1666 }
1667
1668
1669 if (
seq.if_index > 0 &&
seq.current_line_number ==
seq.if_endif_line[
seq.if_index - 1]) {
1673 seq.if_line[
seq.if_index] = 0;
1674 seq.if_else_line[
seq.if_index] = 0;
1675 seq.if_endif_line[
seq.if_index] = 0;
1676 seq.current_line_number++;
1678 return;
1679 }
1680
1681
1682 if (
seq.current_line_number ==
seq.subdir_end_line) {
1685 seq.subdir_end_line = 0;
1689 return;
1690 }
1691
1692
1697 seq.current_line_number++;
1699 return;
1700 }
1701
1702
1705 if (
seq.follow_libraries) {
1710
1711
1712 if (filename != std::string(
seq.sfilename)) {
1714 mstrlcpy(
seq.sfilename, filename.c_str(),
sizeof(
seq.sfilename));
1715 }
1716 }
1717 } else {
1720 }
1721 }
1722
1723
1724
1725#if 0
1726 if (
seq.scurrent_line_number >= 0) {
1728 std::string s =
o[
seq.scurrent_line_number - 1];
1729 printf(
"%3d: %s\n",
seq.scurrent_line_number, s.c_str());
1730 }
1731#endif
1732
1735
1736 seq.current_line_number++;
1738 }
1739
1740
1744 } else {
1745
1747 if (s.find('$') != std::string::npos)
1749
1754 seq.current_line_number++;
1755 }
1756 }
1757
1758
1762 } else {
1767
1770
1772 std::string
s1 = s.substr(0, s.find(
'['));
1773 std::string
s2 = s.substr(s.find(
'['));
1777 } else {
1778
1782 }
1783 }
1784
1786 if (
seq.subdir_not_notify)
1790
1793
1795
1797
1801 seq.current_line_number++;
1805 } else {
1806
1809 return;
1810 }
1811 }
1812 }
1813
1814
1817
1818
1820 path += "userfiles/sequencer/";
1823 } else {
1824
1826 path += "userfiles/sequencer/";
1829 if (
value.back() !=
'/')
1832 }
1833
1834 if (
value.find(
'$') != std::string::npos)
1836
1837
1843
1848 }
1849
1850
1854 return;
1855 } else {
1857 }
1858 } else {
1859
1861 }
1862
1866 seq.current_line_number++;
1869 } else {
1870
1872 return;
1873 }
1874 }
1875
1876
1879
1880
1882 path += "userfiles/sequencer/";
1885 } else {
1886
1888 path += "userfiles/sequencer/";
1892 size_t pos =
value.find_last_of(
'/');
1893 if (pos != std::string::npos)
1896 }
1897
1898 if (
value.find(
'$') != std::string::npos)
1900
1901
1907
1912 }
1913
1914
1918 return;
1919 } else {
1924 else
1928 return;
1929 }
1930 }
1931 } else {
1932 seq_error(
seq,
c,
"No ODB path specified in ODBSAVE command");
1933 return;
1934 }
1935
1939 seq.current_line_number++;
1942 } else {
1943
1945 return;
1946 }
1947 }
1948
1949
1953 } else {
1958
1961
1963 std::string
s1 = s.substr(0, s.find(
'['));
1964 std::string
s2 = s.substr(s.find(
'['));
1968 } else {
1969
1973 }
1974 }
1975
1976
1979
1984 return;
1985 } else {
1987 size =
sizeof(
data);
1988
1991 value = *((
int *)
data) > 0 ?
"1" :
"0";
1992 else
1994
1996 size =
value.length() + 1;
1997 if (size < 32)
1998 size = 32;
2000
2004 }
2005 }
2006 }
2007
2008
2014 } else {
2019
2022
2024 std::string
s1 = s.substr(0, s.find(
'['));
2025 std::string
s2 = s.substr(s.find(
'['));
2029 } else {
2030
2034 }
2035 }
2036
2038
2041
2045 return;
2046 } else {
2048
2049
2051 size =
sizeof(
data);
2054 break;
2055 }
2056
2060 else
2062
2064 size =
value.length() + 1;
2065 if (size < 32)
2066 size = 32;
2068
2072 }
2073 }
2074 }
2075
2076
2080 } else {
2085
2088
2090 std::string
s1 = s.substr(0, s.find(
'['));
2091 std::string
s2 = s.substr(s.find(
'['));
2095 } else {
2096
2100 }
2101 }
2102
2105
2107
2111 } else {
2113 size =
sizeof(
data);
2119 size =
sizeof(
data);
2121
2123 if (
seq.subdir_not_notify)
2127
2129 seq.current_line_number++;
2130 }
2131 }
2132 }
2133
2134
2140
2145 }
2146
2150 } else {
2154 } else
2155 seq.current_line_number++;
2156 }
2157 }
2158
2159
2165 } else {
2170
2175 }
2176
2177
2178 unsigned int tid;
2179 for (tid = 0; tid <
TID_LAST; tid++) {
2181 break;
2182 }
2183
2185 seq_error(
seq,
c,
"Type must be one of UINT8,INT8,UINT16,INT16,UINT32,INT32,BOOL,FLOAT,DOUBLE,STRING");
2186 else {
2187
2194 }
2195 } else {
2201 }
2202
2205 } else {
2211 }
2212 seq.current_line_number++;
2213 }
2214 }
2215 }
2216 }
2217
2218
2221 seq.current_line_number++;
2222 }
2223
2224
2227
2231 for (
i = 0;
i <
n;
i++) {
2232
2234
2237 }
2238 }
2239
2242 std::string r =
ss_execs(s.c_str());
2243
2244
2246
2247 seq.current_line_number++;
2248 }
2249
2250
2253 if (!
seq.transition_request) {
2254 seq.transition_request =
TRUE;
2255 size =
sizeof(
state);
2263 }
2264 }
2265 } else {
2266
2267 size =
sizeof(
state);
2271 seq.current_line_number++;
2272 }
2273 }
2275 if (!
seq.transition_request) {
2276 seq.transition_request =
TRUE;
2277 size =
sizeof(
state);
2282
2285 }
2286 }
2287 } else {
2288
2289 size =
sizeof(
state);
2294
2296
2297 if (
seq.stop_after_run) {
2299
2304 cm_msg(
MTALK,
"sequencer",
"Sequencer is finished by \"stop after current run\".");
2305 } else {
2306 cm_msg(
MTALK,
"sequencer",
"Sequencer is going to finish by \"stop after current run\". Executing ATEXIT.");
2307 }
2308 } else {
2309 seq.current_line_number++;
2310 }
2311
2313 }
2314 }
2315 } else {
2317 return;
2318 }
2319 }
2320
2321
2326 strcpy(
seq.wait_type,
"Events");
2334 seq.wait_type[0] = 0;
2335 seq.wait_odb[0] = 0;
2336 }
2343 return;
2344 } else {
2347
2350
2352 std::string
s1 = s.substr(0, s.find(
'['));
2353 std::string
s2 = s.substr(s.find(
'['));
2357 } else {
2358
2362 }
2363 }
2364
2370 return;
2371 } else {
2374 else
2377
2379 size =
sizeof(
data);
2382 value = *((
int *)
data) > 0 ?
"1" :
"0";
2383 else
2399 } else {
2401 return;
2402 }
2403
2408 seq.wait_type[0] = 0;
2409 seq.wait_odb[0] = 0;
2410 }
2411 }
2412 }
2415 strcpy(
seq.wait_type,
"Seconds");
2416 if (
seq.start_time == 0) {
2419 } else {
2421 if (
seq.wait_value >
seq.wait_limit)
2422 seq.wait_value =
seq.wait_limit;
2423 }
2425 seq.current_line_number++;
2429 seq.wait_type[0] = 0;
2430 seq.wait_odb[0] = 0;
2431 }
2432 } else {
2434 }
2435
2436
2438 }
2439
2440
2443 if (
seq.loop_start_line[
i] == 0)
2444 break;
2447 return;
2448 }
2449 seq.loop_start_line[
i] =
seq.current_line_number;
2455 seq.loop_counter[
i] = 1;
2456
2460 else {
2462 }
2468 } else {
2470 return;
2471 }
2472
2476 size =
value.length() + 1;
2477 if (size < 32)
2478 size = 32;
2480 }
2481
2482 seq.current_line_number++;
2483 }
2484
2485
2487
2488
2489 while (
seq.if_index > 0 &&
2490 seq.current_line_number >
seq.if_line[
seq.if_index - 1] &&
2491 seq.current_line_number <
seq.if_endif_line[
seq.if_index-1]) {
2495 seq.if_line[
seq.if_index] = 0;
2496 seq.if_else_line[
seq.if_index] = 0;
2497 seq.if_endif_line[
seq.if_index] = 0;
2498 seq.current_line_number++;
2500 }
2501
2502
2504 if (
seq.loop_start_line[
i] == 0)
2505 break;
2508 return;
2509 }
2510
2511
2512 seq.current_line_number =
seq.loop_end_line[
i-1];
2513 seq.loop_counter[
i-1] =
seq.loop_n[
i-1];
2514 }
2515
2516
2518
2520 seq_error(
seq,
c,
"Maximum number of nested if..endif exceeded");
2521 return;
2522 }
2523
2524
2525 seq.if_line[
seq.if_index] =
seq.current_line_number;
2527
2528
2529 seq.if_else_line[
seq.if_index] = 0;
2532
2533
2536 continue;
2537 }
2538
2539
2541 seq.if_else_line[
seq.if_index] =
j;
2542 break;
2543 }
2544 }
2545
2550 return;
2551 }
2552
2554 seq.current_line_number++;
2555 else if (
seq.if_else_line[
seq.if_index])
2556 seq.current_line_number =
seq.if_else_line[
seq.if_index] + 1;
2557 else
2558 seq.current_line_number =
seq.if_endif_line[
seq.if_index];
2559
2561 }
2562
2563
2565
2566 if (
seq.if_index == 0) {
2568 return;
2569 }
2570 seq.current_line_number =
seq.if_endif_line[
seq.if_index - 1];
2571 }
2572
2573
2576 cm_msg(
MTALK,
"sequencer",
"Sequencer is finished.");
2577 return;
2578 }
2579
2580
2584 return;
2585 }
2588 }
2596 seq.current_line_number =
i;
2597 break;
2598 }
2599 }
2600 }
2601 }
2602 }
2603
2604
2606
2608 }
2609
2610
2612
2614 }
2615
2616
2618
2620 }
2621
2622
2626 return;
2627 }
2630
2632
2643 }
2644 size =
value.length() + 1;
2645 if (size < 32)
2646 size = 32;
2648 } else {
2650 size =
value.length() + 1;
2651 if (size < 32)
2652 size = 32;
2654 }
2655
2656
2658 if (
seq.loop_start_line[
i] > 0) {
2663 }
2664 }
2665
2667 }
2668
2669
2673 else
2679
2681
2685 } else {
2686
2687
2688
2689 if (!
seq.message_wait) {
2693
2694 return;
2695 } else {
2696
2697
2698
2699 if (
seq.message[0] != 0) {
2700
2701 return;
2702 }
2703
2704
2705 seq.message_wait =
false;
2706 }
2707 }
2708
2710 }
2711
2712
2716 else
2718 std::string
type =
"INFO";
2721
2722 if (
type ==
"ERROR")
2724 else if (
type ==
"DEBUG")
2726 else if (
type ==
"LOG")
2728 else if (
type ==
"TALK")
2730 else
2732
2734 }
2735
2736
2740 return;
2741 }
2744 return;
2747 if (size < 32)
2748 size = 32;
2750
2752 }
2753
2754
2758 return;
2759 } else {
2760
2764
2765
2771
2773
2775
2777 char p[256];
2780 else
2782
2784 }
2785
2787 break;
2788 }
2789 }
2790 }
2791 }
2794 }
2795 }
2796 }
2797
2798
2799 else {
2801 }
2802
2803
2805 size =
sizeof(
seq1);
2811 seq.stop_after_run =
seq1.stop_after_run;
2813
2814
2817
2818
2820}
INT cm_transition(INT transition, INT run_number, char *errstr, INT errstr_size, INT async_flag, INT debug_flag)
#define CM_DEFERRED_TRANSITION
std::string ss_execs(const char *cmd)
std::string ss_replace_env_variables(const std::string &inputPath)
INT ss_sleep(INT millisec)
INT cm_msg_retrieve(INT n_message, char *message, INT buf_size)
INT db_get_data_index(HNDLE hDB, HNDLE hKey, void *data, INT *buf_size, INT idx, DWORD type)
INT db_delete_key(HNDLE hDB, HNDLE hKey, BOOL follow_links)
INT db_get_value(HNDLE hDB, HNDLE hKeyRoot, const char *key_name, void *data, INT *buf_size, DWORD type, BOOL create)
INT db_save_json(HNDLE hDB, HNDLE hKey, const char *filename, int flags)
INT db_save_xml(HNDLE hDB, HNDLE hKey, const char *filename)
INT db_create_key(HNDLE hDB, HNDLE hKey, const char *key_name, DWORD type)
INT db_get_record(HNDLE hDB, HNDLE hKey, void *data, INT *buf_size, INT align)
INT db_save(HNDLE hDB, HNDLE hKey, const char *filename, BOOL bRemote)
INT db_get_key(HNDLE hDB, HNDLE hKey, KEY *key)
INT db_load(HNDLE hDB, HNDLE hKeyRoot, const char *filename, BOOL bRemote)
INT db_set_data_index(HNDLE hDB, HNDLE hKey, const void *data, INT data_size, INT idx, DWORD type)
INT db_sprintf(char *string, const void *data, INT data_size, INT idx, DWORD type)
INT db_set_value(HNDLE hDB, HNDLE hKeyRoot, const char *key_name, const void *data, INT data_size, INT num_values, DWORD type)
INT db_set_data_index1(HNDLE hDB, HNDLE hKey, const void *data, INT data_size, INT idx, DWORD type, BOOL bNotify)
INT db_sscanf(const char *data_str, void *data, INT *data_size, INT i, DWORD tid)
INT db_set_num_values(HNDLE hDB, HNDLE hKey, INT num_values)
const char * rpc_tid_name(INT id)
void seq_array_index(SEQUENCER &seq, SeqCon *c, char *odbpath, int *index1, int *index2)
int concatenate(SEQUENCER &seq, SeqCon *c, char *result, int size, char *value)
int set_all_matching(HNDLE hDB, HNDLE hBaseKey, char *odbpath, char *value, int index1, int index2, int notify)
static void seq_start_next(SEQUENCER &seq, SeqCon *c)
int eval_condition(SEQUENCER &seq, SeqCon *c, const char *condition)
std::string msprintf(const char *format,...)
#define JSFLAG_FOLLOW_LINKS
#define JSFLAG_OMIT_LAST_WRITTEN
static void pn(const te_expr *n, int depth)