void siginthandler(int sig) { cm_msg(MINFO, "Speaker", "Speaker interrupted"); cm_disconnect_experiment(); pclose(fp); exit(0); }
void sigpipehandler(int sig) { cm_msg(MERROR, "Speaker", "No speech synthesizer attached"); cm_disconnect_experiment(); pclose(fp); exit(2); }
void cam_exit(void) { if (midas_connect) { cm_disconnect_client(hConn, FALSE); cm_disconnect_experiment(); } else { if (hConn) rpc_client_disconnect(hConn, FALSE); } }
void receive_message(HNDLE hBuf, HNDLE id, EVENT_HEADER * header, void *message) { char str[256], *pc, *sp; static DWORD last_beep = 0; /* print message */ printf("%s\n", (char *) (message)); if (fp == NULL) { fputs("Speech synthesizer not enabled - terminating\n", stderr); cm_disconnect_experiment(); exit(2); } /* skip none talking message */ if (header->trigger_mask == MT_TALK || header->trigger_mask == MT_USER) { pc = strchr((char *) (message), ']') + 2; sp = pc + strlen(pc) - 1; while (*sp == ' ' || *sp == '\t') sp--; *(++sp) = '\0'; /* Send beep first */ // "play --volume=0.3 /etc/mt_talk.wav" if ((ss_time() - last_beep) > shutupTime) { switch (header->trigger_mask) { case MT_TALK: if (mtTalkStr[0]) sprintf(str, "%s", mtTalkStr); break; case MT_USER: if (mtUserStr[0]) sprintf(str, "%s", mtUserStr); break; } ss_system(str); last_beep = ss_time(); ss_sleep(1000); } #ifdef OS_DARWIN sprintf(str, "say %s.", pc); ss_system(str); #else fprintf(fp, "%s.\n", pc); fflush(fp); #endif } return; }
int main() { int status, size; HNDLE hDB, hKey; /* connect to experiment */ status = cm_connect_experiment("", "", "ODBTest", NULL); if (status != CM_SUCCESS) return 1; /* get handle to online database */ cm_get_experiment_database(&hDB, &hKey); /* read key "runinfo/run number" */ size = sizeof(run_number); status = db_get_value(hDB, 0, "/runinfo/run number", &run_number, &size, TID_INT, TRUE); if (status != DB_SUCCESS) { printf("Cannot read run number"); return 0; } printf("Current run number is %d\n", run_number); /* set new run number */ run_number++; db_set_value(hDB, 0, "/runinfo/run number", &run_number, size, 1, TID_INT); /* now open run_number with automatic updates */ db_find_key(hDB, 0, "/runinfo/run number", &hKey); db_open_record(hDB, hKey, &run_number, sizeof(run_number), MODE_READ, run_number_changed, NULL); printf("Waiting for run number to change. Hit RETURN to abort\n"); do { cm_yield(1000); } while (!ss_kbhit()); db_close_record(hDB, hKey); /* disconnect from experiment */ cm_disconnect_experiment(); return 1; }
int main(int argc, char *argv[]) { char host_name[256], exp_name[32]; cm_get_environment(host_name, sizeof(host_name), exp_name, sizeof(exp_name)); cm_connect_experiment(host_name, exp_name, "Compression", NULL); cm_get_experiment_database(&hDB, NULL); compress_load_all(); if(argc != 2) { printf("Usage: mucap_optimize uncompressed_input.mid\n"); exit(1); } FILE *fp = fopen(argv[1], "r"); if (!fp) { printf("Unable to open %s\n", argv[1]); exit(1); } char *input_event = new char[MAX_EVENT_SIZE]; char *output_event = new char[MAX_EVENT_SIZE]; while (read_midas_event(fp, input_event) == SUCCESS) { EVENT_HEADER header = *((EVENT_HEADER *) input_event); int event_id = header.event_id; if (event_id == EVENTID_BOR || event_id == EVENTID_EOR || event_id == EVENTID_MESSAGE) { continue; } bk_init32(output_event); compress_event(input_event + sizeof(EVENT_HEADER), output_event); } compress_optimize_all(); fclose(fp); cm_disconnect_experiment(); }
int cam_init_rpc(char *host_name, char *exp_name, char *fe_name, char *client_name, char *rpc_server) { INT status, i, size; char str[256]; HNDLE hDB, hKey, hRootKey, hSubkey; if (rpc_server[0]) { /* connect directly to RPC server, not to MIDAS experiment */ midas_connect = FALSE; #ifdef OS_WINNT { WSADATA WSAData; /* Start windows sockets */ if (WSAStartup(MAKEWORD(1, 1), &WSAData) != 0) return RPC_NET_ERROR; } #endif rpc_set_name(client_name); rpc_register_functions(rpc_get_internal_list(0), NULL); rpc_register_functions(rpc_get_internal_list(1), NULL); status = rpc_client_connect(rpc_server, 1750, client_name, &hConn); if (status != RPC_SUCCESS) { printf("Cannot connect to RPC server running on %s at port 1750.\n", rpc_server); return status; } } else { /* connect to MIDAS experiment */ midas_connect = TRUE; /* turn off message display, turn on message logging */ cm_set_msg_print(MT_ALL, 0, NULL); /* connect to experiment */ status = cm_connect_experiment(host_name, exp_name, client_name, 0); if (status != CM_SUCCESS) return CM_UNDEF_EXP; /* connect to the database */ cm_get_experiment_database(&hDB, &hKey); /* find CNAF server if not specified */ strcpy(str, fe_name); if (fe_name[0] == '\0') { /* find client which exports CNAF function */ status = db_find_key(hDB, 0, "System/Clients", &hRootKey); if (status == DB_SUCCESS) { for (i = 0, status = 0;; i++) { status = db_enum_key(hDB, hRootKey, i, &hSubkey); if (status == DB_NO_MORE_SUBKEYS) { printf("No client currently exports the CNAF functionality.\n"); cm_disconnect_experiment(); return CM_UNDEF_EXP; } sprintf(str, "RPC/%d", RPC_CNAF16); status = db_find_key(hDB, hSubkey, str, &hKey); if (status == DB_SUCCESS) { size = sizeof(str); db_get_value(hDB, hSubkey, "Name", str, &size, TID_STRING, TRUE); break; } } } } /* register CNAF_RPC call */ if (cm_connect_client(str, &hConn) == CM_SUCCESS) { DWORD data, size, q, x; /* test if CNAF function implemented */ size = sizeof(WORD); status = rpc_client_call(hConn, RPC_CNAF16, CNAF_TEST, 0, 0, 0, 0, 0, &data, &size, &q, &x); if (status != RPC_SUCCESS) { printf("CNAF functionality not implemented by frontend %s\n", fe_name); cm_disconnect_client(hConn, FALSE); return CM_NO_CLIENT; } } else { printf("Cannot connect to frontend %s\n", fe_name); return CM_NO_CLIENT; } } return SUCCESS; }
main() { INT status, size, trans, run_number; char host_name[256], str[32]; INT event_id, request_id; DWORD last_time; BOOL via_callback; /* get parameters */ printf("ID of event to request: "); ss_gets(str, 32); event_id = atoi(str); printf("Host to connect: "); ss_gets(host_name, 256); printf("Get all events (0/1): "); ss_gets(str, 32); all_flag = atoi(str); printf("Receive via callback ([y]/n): "); ss_gets(str, 32); via_callback = str[0] != 'n'; /* connect to experiment */ status = cm_connect_experiment(host_name, "", all_flag ? "Power Consumer" : "Consumer", NULL); if (status != CM_SUCCESS) return 1; /* open the "system" buffer, 1M size */ bm_open_buffer("SYSTEM", EVENT_BUFFER_SIZE, &hBufEvent); /* set the buffer cache size */ bm_set_cache_size(hBufEvent, 100000, 0); /* place a request for a specific event id */ bm_request_event(hBufEvent, (WORD) event_id, TRIGGER_ALL, all_flag ? GET_ALL : GET_SOME, &request_id, via_callback ? process_event : NULL); /* place a request for system messages */ cm_msg_register(process_message); /* place a request for transition notification */ cm_register_transition(TR_START, via_callback? transition : NULL); last_time = 0; do { if (via_callback) status = cm_yield(1000); else { /* receive event "manually" and call receive_event */ size = sizeof(event_buffer); status = bm_receive_event(hBufEvent, event_buffer, &size, ASYNC); if (status == BM_SUCCESS) process_event(hBufEvent, request_id, (EVENT_HEADER *) event_buffer, (void *) (((EVENT_HEADER *) event_buffer) + 1)); /* receive transitions "manually" */ if (cm_query_transition(&trans, &run_number, NULL)) transition(run_number, NULL); /* call yield once every 100 ms */ if (ss_millitime() - last_time > 100) { last_time = ss_millitime(); status = cm_yield(0); } } } while (status != RPC_SHUTDOWN && status != SS_ABORT); cm_disconnect_experiment(); return 1; }
int main(int argc, char *argv[]) { BOOL daemon = FALSE; INT status, i, ch; char host_name[HOST_NAME_LENGTH]; char exp_name[NAME_LENGTH]; char *speech_program = SPEECH_PROGRAM; /* get default from environment */ cm_get_environment(host_name, sizeof(host_name), exp_name, sizeof(exp_name)); #ifdef OS_DARWIN strlcpy(mtTalkStr, "afplay $MIDASSYS/utils/notify.wav", sizeof(mtTalkStr)); strlcpy(mtUserStr, "afplay $MIDASSYS/utils/notify.wav", sizeof(mtTalkStr)); #endif /* parse command line parameters */ for (i = 1; i < argc; i++) { if (argv[i][0] == '-' && argv[i][1] == 'D') daemon = TRUE; else if (argv[i][0] == '-') { if (i + 1 >= argc || argv[i + 1][0] == '-') goto usage; if (argv[i][1] == 'e') strcpy(exp_name, argv[++i]); else if (argv[i][1] == 'h') strcpy(host_name, argv[++i]); else if (argv[i][1] == 'c') speech_program = argv[++i]; else if (argv[i][1] == 't') strcpy(mtTalkStr, argv[++i]); else if (argv[i][1] == 'u') strcpy(mtUserStr, argv[++i]); else if (argv[i][1] == 's') shutupTime = atoi(argv[++i]); else { usage: printf ("usage: mlxspeaker [-h Hostname] [-e Experiment] [-c command] [-D] daemon\n"); printf(" [-t mt_talk] Specify the mt_talk alert command\n"); printf(" [-u mt_user] Specify the mt_user alert command\n"); printf(" [-s shut up time] Specify the min time interval between alert [s]\n"); printf(" The -t & -u switch require a command equivalent to:\n"); printf(" '-t play --volume=0.3 file.wav'\n"); printf(" [-c command] Used to start the speech synthesizer,\n"); printf(" which should read text from it's standard input.\n"); printf(" eg: mlxspeaker -c 'festival --tts -'\n\n"); return 0; } } } if (daemon) { printf("Becoming a daemon...\n"); ss_daemon_init(FALSE); } /* Handle SIGPIPE signals generated from errors on the pipe */ signal(SIGPIPE, sigpipehandler); signal(SIGINT, siginthandler); fp = popen(speech_program, "w"); if (fp == NULL) { cm_msg(MERROR, "Speaker", "Unable to start \"%s\": %s\n", speech_program, strerror(errno)); cm_disconnect_experiment(); exit(2); } /* now connect to server */ status = cm_connect_experiment(host_name, exp_name, "Speaker", NULL); if (status != CM_SUCCESS) return 1; cm_msg_register(receive_message); printf("Midas Message Speaker connected to %s. Press \"!\" to exit.\n", host_name[0] ? host_name : "local host"); /* initialize terminal */ ss_getchar(0); do { status = cm_yield(1000); while (ss_kbhit()) { ch = ss_getchar(0); if (ch == -1) ch = getchar(); if (ch == '!') status = RPC_SHUTDOWN; } } while (status != SS_ABORT && status != RPC_SHUTDOWN); /* reset terminal */ ss_getchar(TRUE); pclose(fp); cm_disconnect_experiment(); return 1; }
INT register_equipment(void) { INT index, size, status; char str[256]; EQUIPMENT_INFO *eq_info; EQUIPMENT_STATS *eq_stats; HNDLE hKey; /* get current ODB run state */ size = sizeof(run_state); run_state = STATE_STOPPED; db_get_value(hDB, 0, "/Runinfo/State", &run_state, &size, TID_INT, TRUE); size = sizeof(run_number); run_number = 1; status = db_get_value(hDB, 0, "/Runinfo/Run number", &run_number, &size, TID_INT, TRUE); assert(status == SUCCESS); /* scan EQUIPMENT table from mevb.C */ for (index = 0; equipment[index].name[0]; index++) { eq_info = &equipment[index].info; eq_stats = &equipment[index].stats; if (eq_info->event_id == 0) { printf("\nEvent ID 0 for %s not allowed\n", equipment[index].name); cm_disconnect_experiment(); ss_sleep(5000); exit(0); } /* init status */ equipment[index].status = EB_SUCCESS; sprintf(str, "/Equipment/%s/Common", equipment[index].name); /* get last event limit from ODB */ if (eq_info->eq_type != EQ_SLOW) { db_find_key(hDB, 0, str, &hKey); size = sizeof(double); if (hKey) db_get_value(hDB, hKey, "Event limit", &eq_info->event_limit, &size, TID_DOUBLE, TRUE); } /* Create common subtree */ status = db_check_record(hDB, 0, str, EQUIPMENT_COMMON_STR, TRUE); if (status != DB_SUCCESS) { printf("Cannot check equipment record, status = %d\n", status); ss_sleep(3000); } db_find_key(hDB, 0, str, &hKey); if (equal_ustring(eq_info->format, "FIXED")) equipment[index].format = FORMAT_FIXED; else /* default format is MIDAS */ equipment[index].format = FORMAT_MIDAS; gethostname(eq_info->frontend_host, sizeof(eq_info->frontend_host)); strcpy(eq_info->frontend_name, frontend_name); strcpy(eq_info->frontend_file_name, frontend_file_name); /* set record from equipment[] table in frontend.c */ db_set_record(hDB, hKey, eq_info, sizeof(EQUIPMENT_INFO), 0); /* get record once at the start equipment info */ size = sizeof(EQUIPMENT_INFO); db_get_record(hDB, hKey, eq_info, &size, 0); /*---- Create just the key , leave it empty ---------------------------------*/ sprintf(str, "/Equipment/%s/Variables", equipment[index].name); db_create_key(hDB, 0, str, TID_KEY); db_find_key(hDB, 0, str, &hKey); equipment[index].hkey_variables = hKey; /*---- Create and initialize statistics tree -------------------*/ sprintf(str, "/Equipment/%s/Statistics", equipment[index].name); status = db_check_record(hDB, 0, str, EQUIPMENT_STATISTICS_STR, TRUE); if (status != DB_SUCCESS) { printf("Cannot create/check statistics record, error %d\n", status); ss_sleep(3000); } status = db_find_key(hDB, 0, str, &hKey); if (status != DB_SUCCESS) { printf("Cannot find statistics record, error %d\n", status); ss_sleep(3000); } eq_stats->events_sent = 0; eq_stats->events_per_sec = 0; eq_stats->kbytes_per_sec = 0; /* open hot link to statistics tree */ status = db_open_record(hDB, hKey, eq_stats, sizeof(EQUIPMENT_STATS) , MODE_WRITE, NULL, NULL); if (status != DB_SUCCESS) { cm_msg(MERROR, "register_equipment", "Cannot open statistics record, error %d. Probably other FE is using it", status); ss_sleep(3000); } /*---- open event buffer ---------------------------------------*/ if (eq_info->buffer[0]) { status = bm_open_buffer(eq_info->buffer, 2 * max_event_size, &equipment[index].buffer_handle); if (status != BM_SUCCESS && status != BM_CREATED) { cm_msg(MERROR, "register_equipment", "Cannot open event buffer. Try to reduce EVENT_BUFFER_SIZE in midas.h \ and rebuild the system."); return 0; } if (1) { int level = 0; bm_get_buffer_level(equipment[index].buffer_handle, &level); printf("Buffer %s, level %d, info: \n", eq_info->buffer, level); } /* set the default buffer cache size */ bm_set_cache_size(equipment[index].buffer_handle, 0, SERVER_CACHE_SIZE); } else {