32#ifndef DOXYGEN_SHOULD_SKIP_THIS
48 std::vector<char> buf;
49 buf.insert(buf.end(), condition, condition+
strlen(condition)+1);
50 char*
str = buf.data();
59 for (
j = 1;
str[
i +
j] ==
' ';
j++)
74 while (
i > 0 &&
str[
i] ==
' ')
108 cm_msg(
MERROR,
"al_evaluate_condition",
"Alarm \"%s\": Cannot find ODB key \"%s\" to evaluate alarm condition",
alarm_name,
str);
110 *
pvalue =
"(cannot find in odb)";
118 while (std::getline(
ss,
token,
',')) {
124 for (
int i = 0;
i <
k.get_num_values(); ++
i)
129 if (
dashPos != std::string::npos) {
135 for (
int i = start;
i <=
end; ++
i) {
150 cm_msg(
MERROR,
"al_evaluate_condition",
"Alarm \"%s\": Cannot find ODB key \"%s\" to evaluate alarm condition",
alarm_name,
str);
152 *
pvalue =
"(cannot find in odb)";
176 }
else if (
equal_ustring(function.c_str(),
"access_running")) {
181 size =
sizeof(
state);
194 cm_msg(
MERROR,
"al_evaluate_condition",
"Alarm \"%s\": Cannot get ODB key \"%s\" to evaluate alarm condition",
alarm_name,
str);
203 cm_msg(
MERROR,
"al_evaluate_condition",
"Alarm \"%s\": Cannot get ODB value \"%s\" index %d to evaluate alarm condition",
alarm_name,
str,
idx);
251 if (((
unsigned int)
value1 & (
unsigned int)
value2) > 0)
314 cm_msg(
MERROR,
"al_trigger_alarm",
"Cannot create alarm record for alarm \"%s\", db_create_record() status %d",
alarm_path.c_str(),
status);
368 "Program alarm class mismatch: \"%s/Alarm class\" set to \"%s\" does not match \"/Programs/%s/Alarm "
369 "Class\" set to \"%s\"",
400 cm_msg(
MERROR,
"al_trigger_alarm",
"Cannot update alarm record for alarm \"%s\", db_set_record() status %d",
alarm_path.c_str(),
status);
410#ifndef DOXYGEN_SHOULD_SKIP_THIS
447 cm_msg(
MERROR,
"al_trigger_class",
"Alarm class \"%s\" for alarm \"%s\" not found in ODB", alarm_class, alarm_message);
461 if (
ac.write_system_message && (
now -
ac.system_message_last >= (
DWORD)
ac.system_message_interval)) {
463 msg =
msprintf(
"General alarm: %s", alarm_message);
465 msg =
msprintf(
"%s: %s", alarm_class, alarm_message);
466 cm_msg(
MTALK,
"al_trigger_class",
"%s", msg.c_str());
467 ac.system_message_last =
now;
471 if (
ac.write_elog_message &&
first) {
478 el_submit(0,
"Alarm system",
"Alarm",
"General", alarm_class, msg.c_str(),
"",
"plain",
"",
"", 0,
"",
"", 0,
"",
"", 0, tag,
sizeof(tag));
483 if (
ac.execute_command[0] &&
ac.execute_interval > 0 && (
INT)
ss_time() - (
INT)
ac.execute_last >
ac.execute_interval) {
485 msg =
msprintf(
"General alarm: %s", alarm_message);
487 msg =
msprintf(
"%s: %s", alarm_class, alarm_message);
488 std::string command =
msprintf(
ac.execute_command, msg.c_str());
489 cm_msg(
MINFO,
"al_trigger_class",
"Execute: %s", command.c_str());
497 size =
sizeof(
state);
500 cm_msg(
MINFO,
"al_trigger_class",
"Stopping the run from alarm class \'%s\', message \'%s\'", alarm_class,
508 cm_msg(
MERROR,
"al_trigger_class",
"Cannot update alarm class record");
564 cm_msg(
MERROR,
"al_reset_alarm",
"Cannot get alarm record");
578 cm_msg(
MERROR,
"al_reset_alarm",
"Cannot get alarm class record");
589 ac.system_message_last = 0;
594 cm_msg(
MERROR,
"al_reset_alarm",
"Cannot update alarm record");
599 cm_msg(
MERROR,
"al_reset_alarm",
"Cannot update alarm class record");
657 printf(
"al_check: Something is wrong with our semaphore, ss_semaphore_wait_for() returned %d, aborting.\n",
660 printf(
"al_check: Cannot abort - this will lock you out of odb. From this point, MIDAS will not work "
661 "correctly. Please read the discussion at https://midas.triumf.ca/elog/Midas/945\n");
693 for (
int i = 0;;
i++) {
733 cm_msg(
MERROR,
"al_check",
"Cannot change alarm record");
740 cm_msg(
MERROR,
"al_check",
"Cannot change alarm record");
751 cm_msg(
MERROR,
"al_check",
"Cannot change alarm record");
757 cm_msg(
MERROR,
"al_check",
"Cannot change alarm record");
767 for (
int i = 0;;
i++) {
782 "Cannot get program info record for program \"%s\", db_get_record1() status %d",
key.
name,
858 int size =
sizeof(
flag);
861 for (
int i = 0;;
i++) {
878 std::string alarm_class, msg;
static bool exists(const std::string &name)
INT al_trigger_class(const char *alarm_class, const char *alarm_message, BOOL first)
BOOL al_evaluate_condition(const char *alarm_name, const char *condition, std::string *pvalue)
INT EXPRT al_define_odb_alarm(const char *name, const char *condition, const char *aclass, const char *message)
INT al_get_alarms(std::string *presult)
INT al_reset_alarm(const char *alarm_name)
INT al_trigger_alarm(const char *alarm_name, const char *alarm_message, const char *default_class, const char *cond_str, INT type)
INT cm_get_experiment_database(HNDLE *hDB, HNDLE *hKeyClient)
INT cm_get_experiment_semaphore(INT *semaphore_alarm, INT *semaphore_elog, INT *semaphore_history, INT *semaphore_msg)
INT cm_transition(INT transition, INT run_number, char *errstr, INT errstr_size, INT async_flag, INT debug_flag)
INT cm_exist(const char *name, BOOL bUnique)
INT el_submit(int run, const char *author, const char *type, const char *syst, const char *subject, const char *text, const char *reply_to, const char *encoding, const char *afilename1, const char *buffer1, INT buffer_size1, const char *afilename2, const char *buffer2, INT buffer_size2, const char *afilename3, const char *buffer3, INT buffer_size3, char *tag, INT tag_size)
#define DB_NO_MORE_SUBKEYS
INT ss_semaphore_release(HNDLE semaphore_handle)
INT ss_semaphore_wait_for(HNDLE semaphore_handle, DWORD timeout_millisec)
INT ss_system(const char *command)
INT cm_msg(INT message_type, const char *filename, INT line, const char *routine, const char *format,...)
BOOL equal_ustring(const char *str1, const char *str2)
INT db_get_data_index(HNDLE hDB, HNDLE hKey, void *data, INT *buf_size, INT idx, DWORD type)
INT db_get_value(HNDLE hDB, HNDLE hKeyRoot, const char *key_name, void *data, INT *buf_size, DWORD type, BOOL create)
std::string strcomb1(const char **list)
INT db_get_record1(HNDLE hDB, HNDLE hKey, void *data, INT *buf_size, INT align, const char *rec_str)
INT db_check_record(HNDLE hDB, HNDLE hKey, const char *keyname, const char *rec_str, BOOL correct)
INT db_get_key(HNDLE hDB, HNDLE hKey, KEY *key)
INT EXPRT db_get_value_string(HNDLE hdb, HNDLE hKeyRoot, const char *key_name, int index, std::string *s, BOOL create, int create_string_length)
INT db_enum_link(HNDLE hDB, HNDLE hKey, INT idx, HNDLE *subkey_handle)
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_find_key(HNDLE hDB, HNDLE hKey, const char *key_name, HNDLE *subhKey)
INT db_get_key_time(HNDLE hDB, HNDLE hKey, DWORD *delta)
INT db_set_record(HNDLE hDB, HNDLE hKey, void *data, INT buf_size, INT align)
INT db_enum_key(HNDLE hDB, HNDLE hKey, INT idx, HNDLE *subkey_handle)
INT db_create_record(HNDLE hDB, HNDLE hKey, const char *orig_key_name, const char *init_str)
std::string rpc_get_name()
#define RPC_AL_TRIGGER_ALARM
INT rpc_call(DWORD routine_id,...)
std::string msprintf(const char *format,...)
#define ALARM_PERIODIC_STR(_name)
#define PROGRAM_INFO_STR(_name)
#define ALARM_CLASS_STR(_name)
#define ALARM_ODB_STR(_name)
#define message(type, str)
TH1X EXPRT * h1_book(const char *name, const char *title, int bins, double min, double max)
char time_triggered_first[32]
char time_triggered_last[32]
DWORD trigger_count_required