/* ============================================================== */ /* message sen to dsp: */ /* memoryMessageBase () */ /* do_set_ll_dac () */ /* do_set_dac () */ /* do_get_general_reply () */ /* do_load_control_block () */ /* do_execute_control_block () */ /* do_set_strobe_delay () */ /* do_set_counter_val () */ /* do_calibrate () */ /* */ /* do_dataTransfer () */ /* ============================================================== */ #define I_AM_HOST #include #include #include #include "hostspec.h" #include "sys_pub.h" #include "sys_priv.h" #include "sys_gen.h" #include "ucsc.h" #include "messages.h" /* ------------------------- */ /* global variables :( */ /* ------------------------- */ int32 wordsMessageBase; int32 *message_base; int verb_flag = 1; /* ========================================================= */ /* allocate memeory for message base */ /* ========================================================= */ int memoryMessageBase (int number_words32) { long length; wordsMessageBase = number_words32; length = sizeof (int32) * wordsMessageBase; message_base = (int32 *) malloc ( length ); if ( message_base == NULL ) { printf (" You are in real trouble. I could not allocate memory for message base \n"); return ( 0 ); } printf (" memeory for message base allocated \n length: %lx base %lx\n", length, message_base); return ( 1 ) ; } /* ======================================================== */ /* do_set_ll_dac */ /* ======================================================== */ int do_set_ll_dac (int dac_channel, double dac_set) { int dac_set_int; int status; m_set_LL_dac message; if ( dac_channel < 0 || dac_channel > 4 ) { printf ("Low level dac: wrong channel nr: %d\n", dac_channel); return ( 0 ); } if ( dac_set > 2500.0 ) { printf ("LL-Dac value to high %f\n", dac_set); return ( 0 ); } dac_set_int = (int) (4095.0 * dac_set / 2500.0); printf (" Threshold on channel %d is set to %f mV \n", dac_channel, dac_set); message.ciw = SET_LL_DAC; message.dsp = 0; message.channel = 0; message.len = 2 + HEADLEN; message.dac = dac_channel; message.voltage = dac_set_int; if ( ( status = send_mess ( (int32 *) &message) ) != SUCCESS ) printf (" Error in SET_LL_DAC send_mess \n"); if ( verb_flag != 0 ) { m_wait (0); do_get_general_reply (); } return 1; } /* =================================================== */ /* do set dac */ /* =================================================== */ int do_set_dac (int dac_channel, double dac_set) { int dac_set_int, status; m_set_dac message; if ( dac_channel < 0 || dac_channel > 4 ) { printf (" system dac: wrong channel nr: %d\n", dac_channel); return 0; } /* ----------------------------------------- */ /* calculate bit setting for dac value */ /* ----------------------------------------- */ dac_set_int = (int) (4095.0 * dac_set / 2.5); /* factor of two added because of support board change */ if ( dac_channel == 1 ) dac_set_int = (int) (4095.0 * dac_set / 5.0); if ( dac_set_int > 4095 ){ printf (" sys dac value to high %f (chan %d)\n", dac_set, dac_channel); return 0; } printf (" system dac: %d %f\n", dac_channel, dac_set); /* --- send message --- */ message.ciw = SET_DAC; message.dsp = 0; message.channel = 0; message.len = 2 + HEADLEN; message.dac = dac_channel; message.voltage = dac_set_int; if ( ( status = send_mess ( (int32 *) &message ) ) != SUCCESS ) { printf ("Error in SET_DAC send_mess"); return 0; } printf ("verbose flag %d\n", verb_flag); if ( verb_flag != 0 ) { m_wait (0); do_get_general_reply (); } return 1; } /* =================================================== */ /* do get general reply */ /* =================================================== */ int do_get_general_reply () { int status; unsigned int i; m_echo *rm = (m_echo *) message_base; while ( check_mess (0) ) if ( ( status = get_mess(0)) != SUCCESS ) { printf ("Error in GET_GENERAL_REPLY, Perhaps message already received?\n"); } else { if ( rm->ciw == RESPONSE ) printf ("\nResponse Code = %ld, Consider disabling the Verbose flag......\n", rm->data[0]); else { printf ("CIW is: %ld\n", rm->ciw); printf ("length: %ld\n", rm->len); for ( i = 0 ; i < (rm->len - HEADLEN); i++ ) printf ("Parameter is: %ld\n", rm->data[i]); } } return 1; } /* ========================================== */ /* load Control Block */ /* ========================================== */ int do_load_control_block (int blk_num, int *blkData) { FILE *fp; int i; m_load_control message; message.ciw = LOAD_CONTROL_BLOCK; message.dsp = 0; message.channel = 0; message.len = 2049 + HEADLEN; message.blocknum = blk_num ; fp = fopen ("CB_log", "w"); for ( i = 0; i < 2048; i++ ) { message.blockdata[i] = blkData[i]; fprintf (fp, "%d\n", blkData[i]); } fclose ( fp ); if ( send_mess ( (int32 *) &message ) != SUCCESS ) printf ("Error in Load Control blk send_mess"); if ( verb_flag != 0 ) { m_wait (0); do_get_general_reply (); } return ( 1 ); } /* ============================================= */ /* execute control block */ /* ============================================= */ int do_execute_control_block (int blk_num, int num_rep) { m_exe_control message; if ( num_rep == -1 ) { verb_flag = 0; set_flag (0, 6, verb_flag); } printf ("Executing Control block %d, %d times \n", blk_num, num_rep); message.ciw = EXECUTE_CONTROL_BLOCK; message.dsp = 0; message.channel = 0; message.len = 2 + HEADLEN; message.blocknum = blk_num; message.numexe = num_rep; if ( send_mess ( (int32 *) &message ) != SUCCESS ) printf ("Error in EXECUTE CTRL-BLK send_mess"); if ( verb_flag != 0 ) { m_wait (0); do_get_general_reply (); } return 1; } /* ============================================= */ /* set strobe delay */ /* ============================================= */ int do_set_strobe_delay (int delay_strobe) { m_set_strobe message; message.ciw = SET_STROBE_DELAY; message.dsp = 0; message.channel = 0; message.len = 1 + HEADLEN; message.strobe_delay = delay_strobe; if ( send_mess ( (int32 *) &message ) != SUCCESS ) { printf ("Error in SET_STROBE_DELAY send_mess"); return 0; } if ( verb_flag != 0 ) { m_wait (0); do_get_general_reply (); } return 1; } /* ============================================= */ /* set counter value */ /* ============================================= */ int do_set_counter_val (int val_counter) { m_set_counter message; printf ("Setting Counter Val to: %d\n", val_counter); message.ciw = SET_COUNTER_VAL; message.dsp = 0; message.channel = 0; message.len = 1 + HEADLEN; message.count_val = val_counter; if ( send_mess ( (int32 *) &message ) != SUCCESS ) { printf ("Error in SET_COUNTER_VAL send_mess"); return 0; } if ( verb_flag != 0 ) { m_wait (0); do_get_general_reply (); } return 1; } /* =================================================== */ /* do calibrate */ /* =================================================== */ int do_calibrate (int n_evts, int det_readout, int control_blk) { m_calib message; message.ciw = CALIBRATE; message.dsp = 0; message.channel = 0; message.len = 3 + HEADLEN; message.acqui_events = n_evts; message.take_data = det_readout; message.user_par = control_blk; printf ("Requesting Calibration. %d %d %d\n", n_evts, det_readout, control_blk); if ( send_mess ( (int32 *) &message ) != SUCCESS ) { printf ("Error in CALIBRATE send_mess \n"); return 0; } if ( verb_flag != 0 ) { m_wait (0); do_get_general_reply (); } return 1; } /* ============================================================== */ /* ============================================================== */ /* */ /* data transfer */ /* */ /* ============================================================== */ /* ============================================================== */ /* =============================================== */ /* do transfer data */ /* =============================================== */ int* do_dataTransfer (link_num, dsp_num, format) int link_num; int dsp_num; int format; { int i, status; m_transfer_data message; m_echo *rm = (m_echo *) message_base; message.ciw = TRANSFER_DATA; message.dsp = dsp_num; message.channel = link_num; message.len = 1 + sizeof ( m_generic ) / sizeof ( int32 );; message.data_format = format; printf ("Requesting Data Transfer. \n"); fflush (stdout); if ( send_mess ( (int32 *) &message ) != SUCCESS ) printf ("Error in TRANSFER_DATA send_mess \n"); /* ----------------------------------------------------------------- */ /* now get the data back. If format is neg then data summary too. */ /* ----------------------------------------------------------------- */ m_wait (0); while ( ( status = get_mess (0) ) == ECONFLICT ) { printf ("conflict sending message, trying again\n"); } if ( status != SUCCESS ) { printf (" Error in GET transfer Data1.\n status is: %d \n", status); return NULL; } else { if ( format <= 0 ) { if ( rm->ciw == DATA_SUMMARY ) { printf (" ****Data Summary*****\n") ; printf ("Flag = %ld\n", rm->data[0]) ; printf ("Num trig records = %ld\n", rm->data[1]) ; printf ("Num data records = %ld\n", rm->data[2]) ; if ( ( status = get_mess (0) ) != SUCCESS ) printf ("Error in GET tranfer Data2, Check your format.\n"); } } printf (" CIW is: %ld \n", rm->ciw); printf (" link number %ld\n", rm->channel); printf (" Num data words %ld\n", rm->len); printf (" Data retrieved Format = %ld\n", rm->data[0]) ; for (i = 1; i < 0; i++) printf("Data Received %lx\n", rm->data[i]) ; /* for (i = 1; i <= (rm->len - HEADLEN -1 ); i++) printf("Data Received %lx\n", rm->data[i]) ; */ } return &rm->ciw; }