1547 {
1552 int i,
j, l,
n,
status, size,
index1,
index2,
state,
run_number,
cont;
1557
1558 if (!
seq.running ||
seq.paused) {
1560 return;
1561 }
1562
1563 if (
c->pnseq ==
NULL) {
1568 return;
1569 }
1570
1573 return;
1574
1575
1578 strcpy(
seq.last_msg,
str+11);
1579
1582 seq_error(
seq,
c,
"Cannot find <RunSequence> tag in XML file");
1583 return;
1584 }
1585
1587
1588
1589 if (
seq.stack_index > 0 &&
seq.current_line_number ==
seq.subroutine_end_line[
seq.stack_index - 1]) {
1591 seq.subroutine_end_line[
seq.stack_index - 1] = 0;
1592
1593 if (
seq.subroutine_return_line[
seq.stack_index - 1] == -1) {
1594
1596 cm_msg(
MTALK,
"sequencer",
"Sequencer is finished.");
1597
1599 return;
1600 }
1601
1602 seq.current_line_number =
seq.subroutine_return_line[
seq.stack_index - 1];
1603 seq.subroutine_return_line[
seq.stack_index - 1] = 0;
1604 seq.subroutine_call_line[
seq.stack_index - 1] = 0;
1605 seq.ssubroutine_call_line[
seq.stack_index - 1] = 0;
1608 return;
1609 }
1610
1611
1613
1616 cm_msg(
MTALK,
"sequencer",
"Sequencer is finished.");
1617
1619 }
1620 return;
1621 }
1622
1623
1625 if (
seq.loop_start_line[
i] > 0)
1626 break;
1628 if (
seq.current_line_number ==
seq.loop_end_line[
i]) {
1631
1632 if (
seq.loop_counter[
i] ==
seq.loop_n[
i]) {
1633 seq.loop_counter[
i] = 0;
1634 seq.loop_start_line[
i] = 0;
1635 seq.sloop_start_line[
i] = 0;
1636 seq.loop_end_line[
i] = 0;
1637 seq.sloop_end_line[
i] = 0;
1639 seq.current_line_number++;
1640 } else {
1649 value = std::to_string(
seq.loop_counter[
i] + 1);
1650 }
1652 size =
value.length() + 1;
1653 if (size < 32)
1654 size = 32;
1656 }
1657 seq.loop_counter[
i]++;
1658 seq.current_line_number =
seq.loop_start_line[
i] + 1;
1659 }
1661 return;
1662 }
1663 }
1664
1665
1666 if (
seq.if_index > 0 &&
seq.current_line_number ==
seq.if_endif_line[
seq.if_index - 1]) {
1670 seq.if_line[
seq.if_index] = 0;
1671 seq.if_else_line[
seq.if_index] = 0;
1672 seq.if_endif_line[
seq.if_index] = 0;
1673 seq.current_line_number++;
1675 return;
1676 }
1677
1678
1679 if (
seq.current_line_number ==
seq.subdir_end_line) {
1682 seq.subdir_end_line = 0;
1686 return;
1687 }
1688
1689
1694 seq.current_line_number++;
1696 return;
1697 }
1698
1699
1702 if (
seq.follow_libraries) {
1707
1708
1709 if (filename != std::string(
seq.sfilename)) {
1711 mstrlcpy(
seq.sfilename, filename.c_str(),
sizeof(
seq.sfilename));
1712 }
1713 }
1714 } else {
1717 }
1718 }
1719
1720
1721
1722#if 0
1723 if (
seq.scurrent_line_number >= 0) {
1725 std::string s =
o[
seq.scurrent_line_number - 1];
1726 printf(
"%3d: %s\n",
seq.scurrent_line_number, s.c_str());
1727 }
1728#endif
1729
1732
1733 seq.current_line_number++;
1735 }
1736
1737
1741 } else {
1742
1744 if (s.find('$') != std::string::npos)
1746
1751 seq.current_line_number++;
1752 }
1753 }
1754
1755
1759 } else {
1764
1767
1769 std::string
s1 = s.substr(0, s.find(
'['));
1770 std::string
s2 = s.substr(s.find(
'['));
1774 } else {
1775
1779 }
1780 }
1781
1783 if (
seq.subdir_not_notify)
1787
1790
1793 return;
1794 }
1795
1798 return;
1799 }
1800
1802
1804
1808 seq.current_line_number++;
1815 } else {
1816
1819 return;
1820 }
1821 }
1822 }
1823
1824
1827
1828
1830 path += "userfiles/sequencer/";
1833 } else {
1834
1836 path += "userfiles/sequencer/";
1839 if (
value.back() !=
'/')
1842 }
1843
1844 if (
value.find(
'$') != std::string::npos)
1846
1847
1853
1858 }
1859
1860
1864 return;
1865 } else {
1867 }
1868 } else {
1869
1871 }
1872
1876 seq.current_line_number++;
1879 } else {
1880
1882 return;
1883 }
1884 }
1885
1886
1889
1890
1892 path += "userfiles/sequencer/";
1895 } else {
1896
1898 path += "userfiles/sequencer/";
1902 size_t pos =
value.find_last_of(
'/');
1903 if (pos != std::string::npos)
1906 }
1907
1908 if (
value.find(
'$') != std::string::npos)
1910
1911
1917
1922 }
1923
1924
1928 return;
1929 } else {
1934 else
1938 return;
1939 }
1940 }
1941 } else {
1942 seq_error(
seq,
c,
"No ODB path specified in ODBSAVE command");
1943 return;
1944 }
1945
1949 seq.current_line_number++;
1952 } else {
1953
1955 return;
1956 }
1957 }
1958
1959
1963 } else {
1968
1971
1973 std::string
s1 = s.substr(0, s.find(
'['));
1974 std::string
s2 = s.substr(s.find(
'['));
1978 } else {
1979
1983 }
1984 }
1985
1986
1989
1994 return;
1995 } else {
1997 size =
sizeof(
data);
1998
2001 value = *((
int *)
data) > 0 ?
"1" :
"0";
2002 else
2004
2006 size =
value.length() + 1;
2007 if (size < 32)
2008 size = 32;
2010
2014 }
2015 }
2016 }
2017
2018
2024 } else {
2029
2032
2034 std::string
s1 = s.substr(0, s.find(
'['));
2035 std::string
s2 = s.substr(s.find(
'['));
2039 } else {
2040
2044 }
2045 }
2046
2048
2051
2055 return;
2056 } else {
2058
2059
2061 size =
sizeof(
data);
2064 break;
2065 }
2066
2070 else {
2073 return;
2074 }
2075
2077 size =
value.length() + 1;
2078 if (size < 32)
2079 size = 32;
2081
2085 }
2086 }
2087 }
2088
2089
2093 } else {
2098
2101
2103 std::string
s1 = s.substr(0, s.find(
'['));
2104 std::string
s2 = s.substr(s.find(
'['));
2108 } else {
2109
2113 }
2114 }
2115
2118
2120
2124 } else {
2126 size =
sizeof(
data);
2132 size =
sizeof(
data);
2134
2136 if (
seq.subdir_not_notify)
2140
2142 seq.current_line_number++;
2143 }
2144 }
2145 }
2146
2147
2153
2158 }
2159
2163 } else {
2167 } else
2168 seq.current_line_number++;
2169 }
2170 }
2171
2172
2178 } else {
2183
2188 }
2189
2190
2191 unsigned int tid;
2192 for (tid = 0; tid <
TID_LAST; tid++) {
2194 break;
2195 }
2196
2198 seq_error(
seq,
c,
"Type must be one of UINT8,INT8,UINT16,INT16,UINT32,INT32,BOOL,FLOAT,DOUBLE,STRING");
2199 else {
2200
2207 }
2208 } else {
2214 }
2215
2218 } else {
2224 }
2225 seq.current_line_number++;
2226 }
2227 }
2228 }
2229 }
2230
2231
2234 seq.current_line_number++;
2235 }
2236
2237
2240
2244 for (
i = 0;
i <
n;
i++) {
2245
2247
2250 }
2251 }
2252
2255 std::string r =
ss_execs(s.c_str());
2256
2257
2259
2260 seq.current_line_number++;
2261 }
2262
2263
2266 if (!
seq.transition_request) {
2267 seq.transition_request =
TRUE;
2268 size =
sizeof(
state);
2276 }
2277 }
2278 } else {
2279
2280 size =
sizeof(
state);
2284 seq.current_line_number++;
2285 }
2286 }
2288 if (!
seq.transition_request) {
2289 seq.transition_request =
TRUE;
2290 size =
sizeof(
state);
2295
2298 }
2299 }
2300 } else {
2301
2302 size =
sizeof(
state);
2307
2309
2310 if (
seq.stop_after_run) {
2312
2317 cm_msg(
MTALK,
"sequencer",
"Sequencer is finished by \"stop after current run\".");
2318 } else {
2319 cm_msg(
MTALK,
"sequencer",
"Sequencer is going to finish by \"stop after current run\". Executing ATEXIT.");
2320 }
2321 } else {
2322 seq.current_line_number++;
2323 }
2324
2326 }
2327 }
2328 } else {
2330 return;
2331 }
2332 }
2333
2334
2339 strcpy(
seq.wait_type,
"Events");
2347 seq.wait_type[0] = 0;
2348 seq.wait_odb[0] = 0;
2349 }
2356 return;
2357 } else {
2360
2363
2365 std::string
s1 = s.substr(0, s.find(
'['));
2366 std::string
s2 = s.substr(s.find(
'['));
2370 } else {
2371
2375 }
2376 }
2377
2383 return;
2384 } else {
2387 else
2390
2392 size =
sizeof(
data);
2395 value = *((
int *)
data) > 0 ?
"1" :
"0";
2396 else
2412 } else {
2414 return;
2415 }
2416
2421 seq.wait_type[0] = 0;
2422 seq.wait_odb[0] = 0;
2423 }
2424 }
2425 }
2428 strcpy(
seq.wait_type,
"Seconds");
2429 if (
seq.start_time == 0) {
2432 } else {
2434 if (
seq.wait_value >
seq.wait_limit)
2435 seq.wait_value =
seq.wait_limit;
2436 }
2438 seq.current_line_number++;
2442 seq.wait_type[0] = 0;
2443 seq.wait_odb[0] = 0;
2444 }
2445 } else {
2447 }
2448
2449
2451 }
2452
2453
2456 if (
seq.loop_start_line[
i] == 0)
2457 break;
2460 return;
2461 }
2462 seq.loop_start_line[
i] =
seq.current_line_number;
2468 seq.loop_counter[
i] = 1;
2469
2473 else {
2475 }
2481 } else {
2483 return;
2484 }
2485
2489 size =
value.length() + 1;
2490 if (size < 32)
2491 size = 32;
2493 }
2494
2495 seq.current_line_number++;
2496 }
2497
2498
2500
2501
2502 while (
seq.if_index > 0 &&
2503 seq.current_line_number >
seq.if_line[
seq.if_index - 1] &&
2504 seq.current_line_number <
seq.if_endif_line[
seq.if_index-1]) {
2508 seq.if_line[
seq.if_index] = 0;
2509 seq.if_else_line[
seq.if_index] = 0;
2510 seq.if_endif_line[
seq.if_index] = 0;
2511 seq.current_line_number++;
2513 }
2514
2515
2517 if (
seq.loop_start_line[
i] == 0)
2518 break;
2521 return;
2522 }
2523
2524
2525 seq.current_line_number =
seq.loop_end_line[
i-1];
2526 seq.loop_counter[
i-1] =
seq.loop_n[
i-1];
2527 }
2528
2529
2531
2533 seq_error(
seq,
c,
"Maximum number of nested if..endif exceeded");
2534 return;
2535 }
2536
2537
2538 seq.if_line[
seq.if_index] =
seq.current_line_number;
2540
2541
2542 seq.if_else_line[
seq.if_index] = 0;
2545
2546
2549 continue;
2550 }
2551
2552
2554 seq.if_else_line[
seq.if_index] =
j;
2555 break;
2556 }
2557 }
2558
2563 return;
2564 }
2565
2567 seq.current_line_number++;
2568 else if (
seq.if_else_line[
seq.if_index])
2569 seq.current_line_number =
seq.if_else_line[
seq.if_index] + 1;
2570 else
2571 seq.current_line_number =
seq.if_endif_line[
seq.if_index];
2572
2574 }
2575
2576
2578
2579 if (
seq.if_index == 0) {
2581 return;
2582 }
2583 seq.current_line_number =
seq.if_endif_line[
seq.if_index - 1];
2584 }
2585
2586
2589 cm_msg(
MTALK,
"sequencer",
"Sequencer is finished.");
2590 return;
2591 }
2592
2593
2597 return;
2598 }
2601 }
2609 seq.current_line_number =
i;
2610 break;
2611 }
2612 }
2613 }
2614 }
2615 }
2616
2617
2619
2621 }
2622
2623
2625
2627 }
2628
2629
2631
2633 }
2634
2635
2639 return;
2640 }
2643
2645
2656 }
2657 size =
value.length() + 1;
2658 if (size < 32)
2659 size = 32;
2661 } else {
2663 size =
value.length() + 1;
2664 if (size < 32)
2665 size = 32;
2667 }
2668
2669
2671 if (
seq.loop_start_line[
i] > 0) {
2676 }
2677 }
2678
2680 }
2681
2682
2686 else
2692
2694
2698 } else {
2699
2700
2701
2702 if (!
seq.message_wait) {
2706
2707 return;
2708 } else {
2709
2710
2711
2712 if (
seq.message[0] != 0) {
2713
2714 return;
2715 }
2716
2717
2718 seq.message_wait =
false;
2719 }
2720 }
2721
2723 }
2724
2725
2729 else
2731 std::string
type =
"INFO";
2734
2735 if (
type ==
"ERROR")
2737 else if (
type ==
"DEBUG")
2739 else if (
type ==
"LOG")
2741 else if (
type ==
"TALK")
2743 else
2745
2747 }
2748
2749
2753 return;
2754 }
2757 return;
2760 if (size < 32)
2761 size = 32;
2763
2765 }
2766
2767
2771 return;
2772 } else {
2773
2777
2778
2784
2786
2788
2790 char p[256];
2793 else
2795
2797 }
2798
2800 break;
2801 }
2802 }
2803 }
2804 }
2807 }
2808 }
2809 }
2810
2811
2812 else {
2814 }
2815
2816
2818 size =
sizeof(
seq1);
2824 seq.stop_after_run =
seq1.stop_after_run;
2826
2827
2830
2831
2833}
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)