# # This module contains the action (command window) setup # # mjk, 5/jan/2006 # # # This window allows the observer to define an action # # Items : define the antennas affected (east, west, or both) # define the obstype. This in turn will define the # data input window # enter the control parameters for the action # #------------------------------------------------------------- wrk := [=] wrk.epoch1 := 'azel' wrk.crd1 := '0.' wrk.crd2 := '45.' wrk.crd3 := '0.' wrk.epoch2 := 'azel' wrk.erd1 := '0.1' wrk.erd2 := '1.' wrk.erd3 := '1.' wrk.edef := 'start-end' wrk.dur := '30.' wrk.obstype := 'track' wrk.scantyp := 'scan' wrk.mxepoch := 'azel' wrk.sched := 'xx' wrk.sep := '0.5' wrk.nscan := '45' wrk.rdur := '30' wrk.dwell := '5' wrk.axis := 'lon' wrk.epochr := 'azel' wrk.pol := 'antpol' wrk.polf1 := 'antpol' wrk.polf2 := 'antpol' title_fr := frame (command_fr, side='left') tit_l := label (title_fr, width=50, text=' COMMAND WINDOW ') ## panic_b := button (title_fr, 'STOP ALL', background='red') # ----------- controller ## ctrl_fr := frame (command_fr, side='left') ## ctrl_sp1 := label (ctrl_fr, width=20, text='ntd controller') ## ctrl_id := label (ctrl_fr, width=10, relief='ridge') ## ctrl_id->text ('gui') # ----------- antenna select set1_fr := frame (command_fr, side='left') set1_sp1 := label (set1_fr, width=45, text=' ') pwr_b := button (set1_fr, 'SHUTDOWN', relief='raised', background='light green') ## set1_sp2 := label (set1_fr, text=' State') ## state_b := button (set1_fr, 'STANDBY', type='check', relief='raised') pwr_b->state (F) state_b->state (F) whenever pwr_b->press do { ctrl->['shutdown'](' ') } ## whenever state_b->press do { ## wrk.state := state_b->state() ## if (wrk.state) { ## ctrl->['operate']('on') ## } ## else { ## ctrl->['standby']('off') ## } ## do_state () ## } # ------------ obstype select c3_fr := frame (command_fr, side='left') c3_ep_l := label (c3_fr, width=5, text='action') c3_ep_b := button (c3_fr, wrk.obstype, type='menu', relief='ridge', fill='x') c3_track := button (c3_ep_b, 'track') c3_scan := button (c3_ep_b, 'scan') c3_spot := button (c3_ep_b, 'spot') c3_sched := button (c3_ep_b, 'sched') c3_stow := button (c3_ep_b, 'stow') c3_maint := button (c3_ep_b, 'maintenance') c3_rast := button (c3_ep_b, 'raster') c3_shutdn := button (c3_ep_b, 'shutdown') whenever c3_track->press do { c3_ep_b->text('TRACK') wrk.obstype := 'track' c1_fr->map() scp_fr->unmap() sch_fr->unmap() rast_fr->unmap() } whenever c3_scan->press do { c3_ep_b->text('SCAN') wrk.obstype := 'scan' c1_fr->map() scp_fr->map() sch_fr->unmap() rast_fr->unmap() } whenever c3_spot->press do { c3_ep_b->text('SPOT') wrk.obstype := 'spot' c1_fr->map() scp_fr->map() sch_fr->unmap() rast_fr->unmap() } whenever c3_sched->press do { c3_ep_b->text('SCHED') wrk.obstype := 'sched' sch_fr->map() c1_fr->unmap() scp_fr->unmap() rast_fr->unmap() } whenever c3_stow->press do { c3_ep_b->text('STOW') wrk.obstype := 'stow' c1_fr->unmap() sch_fr->unmap() scp_fr->unmap() rast_fr->unmap() } whenever c3_maint->press do { c3_ep_b->text('Maintenance') wrk.obstype := 'maint' c1_fr->unmap() sch_fr->unmap() scp_fr->unmap() rast_fr->unmap() } whenever c3_rast->press do { c3_ep_b->text('RASTER') wrk.obstype := 'raster' rast_fr->map() c1_fr->map() sch_fr->unmap() scp_fr->unmap() } c3_spc1 := label (c3_fr, width=1, text=' ') c3_go_b := button (c3_fr, 'start obs', background='light green') c3_spc2 := label (c3_fr, width=24, text=' ') c3_stop_b := button (c3_fr, 'stop', background='light green') whenever c3_go_b->press do { wrk.crd1 := c1_lon_e->get() wrk.crd2 := c1_lat_e->get() wrk.crd3 := c1_pol_e->get() wrk.erd1 := c2_lon_e->get() wrk.erd2 := c2_lat_e->get() wrk.erd3 := c2_pol_e->get() wrk.dur := dur_en->get() wrk.sched := sch_e->get() wrk.sep := ra1_e->get() wrk.nscan := ra3_e->get() wrk.rdur := rb1_e->get() wrk.dwell := rb3_e->get() if (wrk.obstype == 'track') { v1 := setparm (wrk.crd1) if (wrk.epoch1 != 'azel') v1 *:= 15.0 v1 := as_string (v1) v2 := as_string (setparm (wrk.crd2)) v3 := as_string (wrk.epoch1) v4 := as_string (setparm (wrk.crd3)) v5 := as_string (wrk.polf1) cmd_str := paste (v1, v2, v3, " FPA ", v4, v5) } else if (wrk.obstype == 'scan') { wrk.scantyp := 'scan' wrk.mxepoch := wrk.epoch1 vd := as_string ('ENDP') if (wrk.edef == 'centre-range') { wrk.scantyp := 'mxscan' wrk.mxepoch := wrk.epoch2 vd := as_string ('MIDP') } # ENDP/MIDP no longer used --- signalled by the scan/mxscan key # format : c1 c2 frame1 e1 e2 eframe duration fpa p1 p2 pframe v1 := setparm (wrk.crd1) if (wrk.epoch1 != 'azel') v1 *:= 15.0 v1 := as_string (v1) v2 := as_string (setparm (wrk.crd2)) v3 := as_string (wrk.epoch1) v4 := setparm (wrk.erd1) if (wrk.mxepoch != 'azel') v4 *:= 15.0 v4 := as_string (v4) v5 := as_string (setparm (wrk.erd2)) v6 := as_string (wrk.mxepoch) v7 := as_string (wrk.dur) vp1 := as_string (wrk.crd3) vp2 := as_string (wrk.erd3) vp3 := as_string (wrk.polf1) ## cmd_str := paste (v1, v2, v3, v4, v5, v6, vd, v7, " FPA ", vp1, vp2, vp3) cmd_str := paste (v1, v2, v3, v4, v5, v6, v7, " fpa ", vp1, vp2, vp3) } else { cmd_str := ' ' } if (wrk.obstype == 'scan') { ctrl->[wrk.scantyp](cmd_str) } else { ctrl->[wrk.obstype](cmd_str) } } whenever c3_stop_b->press do { ctrl->['obs_stop'](wrk) } #--------------- create a window for the obstype parameters param_fr := frame (command_fr, height=30, side='top', relief='ridge') #---------------- field centre c1_fr := frame (param_fr, side='left') c1_ep_l := label (c1_fr, width=8, text='target ') c1_ep_b := button (c1_fr, wrk.epoch1, type='menu', relief='ridge', fill='x') c1_azel := button (c1_ep_b, 'azel') c1_date := button (c1_ep_b, 'date') c1_hadec := button (c1_ep_b, 'hadec') c1_j2000 := button (c1_ep_b, 'j2000') whenever c1_j2000->press do { c1_ep_b->text('J2000') wrk.epoch1 := 'J2000' c1_lon_l->text('ra') c1_lat_l->text('dec') } whenever c1_date->press do { c1_ep_b->text('date') wrk.epoch1 := 'date' c1_lon_l->text('ra') c1_lat_l->text('dec') } whenever c1_azel->press do { c1_ep_b->text('azel') wrk.epoch1 := 'azel' c1_lon_l->text('az') c1_lat_l->text('el') } whenever c1_hadec->press do { c1_ep_b->text('hadec') wrk.epoch1 := 'hadec' c1_lon_l->text('ha') c1_lat_l->text('dec') } c1_lon_l := label (c1_fr, width=8, text='az') c1_lon_e := entry (c1_fr, width=10, relief='sunken') c1_lon_e->insert ('0.0') c1_lat_l := label (c1_fr, width=3, text='el') c1_lat_e := entry (c1_fr, width=10, relief='sunken') c1_lat_e->insert ('45.') c1_blk1 := label (c1_fr, width=4, text=' ') c1_pol_b := button (c1_fr, wrk.pol, type='menu', relief='ridge', fill='x') c1_apol := button (c1_pol_b, 'antpol') c1_spol := button (c1_pol_b, 'skypol') c1_blnk := label (c1_fr, width=2, text=' ') c1_pol_e := entry (c1_fr, width=4, relief='sunken') c1_pol_e->insert ('0.') whenever c1_apol->press do { c1_pol_b->text('antpol') wrk.polf1 := 'antpol' } whenever c1_spol->press do { c1_pol_b->text('skypol') wrk.polf1 := 'skypol' } #--------------- scan window scp_fr := frame (param_fr, side='top') c2_fr := frame (scp_fr, side='left') c2_ep_l := label (c2_fr, width=8, text=' ') c2_ep_b := button (c2_fr, wrk.epoch2, type='menu', relief='ridge', fill='x') c2_azel := button (c2_ep_b, 'azel') c2_date := button (c2_ep_b, 'date') c2_hadec := button (c2_ep_b, 'hadec') c2_j2000 := button (c2_ep_b, 'j2000') whenever c2_j2000->press do { c2_ep_b->text('J2000') wrk.epoch2 := 'J2000' c2_lon_l->text('ra') c2_lat_l->text('dec') } whenever c2_azel->press do { c2_ep_b->text('azel') wrk.epoch2 := 'azel' c2_lon_l->text('az') c2_lat_l->text('el') } whenever c2_date->press do { c2_ep_b->text('date') wrk.epoch2 := 'date' c2_lon_l->text('ra') c2_lat_l->text('dec') } whenever c2_hadec->press do { c2_ep_b->text('hadec') wrk.epoch2 := 'hadec' c2_lon_l->text('ha') c2_lat_l->text('dec') } ### c2_spc2 := label (c2_fr, width=5, text=' ') c2_lon_l := label (c2_fr, width=8, text='az') c2_lon_e := entry (c2_fr, width=10, relief='sunken') c2_lon_e->insert ('0.0') c2_lat_l := label (c2_fr, width=3, text='el') c2_lat_e := entry (c2_fr, width=10, relief='sunken') c2_lat_e->insert ('1.0') c2_blk1 := label (c2_fr, width=4, text=' ') ##c2_pol_b := button (c2_fr, wrk.pol, type='menu', relief='ridge', fill='x') ## c2_apol := button (c2_pol_b, 'antpol') ## c2_spol := button (c2_pol_b, 'skypol') c2_blk2 := label (c2_fr, width=9, text=' ') c2_pol_e := entry (c2_fr, width=4, relief='sunken') c2_pol_e->insert ('0.') ##whenever c2_apol->press do { ## c2_pol_b->text('antpol') ## wrk.polf2 := 'antpol' ##} ##whenever c2_spol->press do { ## c2_pol_b->text('skypol') ## wrk.polf2 := 'skypol' ##} scp1_fr := frame (scp_fr, side='left') scp1_l1 := label (scp1_fr, 'end-pt def') scp1_b1 := button (scp1_fr, wrk.edef, type='menu', relief='ridge', fill='x') scp_sf_b := button (scp1_b1, 'start-end') scp_cr_b := button (scp1_b1, 'centre-range') whenever scp_sf_b->press do { scp1_b1->text('start-end') wrk.edef := 'start-end' } whenever scp_cr_b->press do { scp1_b1->text('centre-range') wrk.edef := 'centre-range' } dur_spc := label (scp1_fr, width=8, text=' ') dur_l1 := label (scp1_fr, 'duration') dur_en := entry (scp1_fr, width=8, relief='sunken') dur_l2 := label (scp1_fr, ' seconds') dur_en->insert ('30.') scp_fr->unmap() #--------------- sched window sch_fr := frame (param_fr, side='left') sch_l := label (sch_fr, width=10, text='sched file') sch_e := entry (sch_fr, width=70, relief='sunken') sch_fr->unmap() #--------------- raster window rast_fr := frame (param_fr, side='top') ra_fr := frame (rast_fr, side='left') ra1_l := label (ra_fr, width=12, text='scan spacing') ra1_e := entry (ra_fr, width=10, relief='sunken') ra1_e->insert('0.25') ra2_l := label (ra_fr, width=7, text='(degs)') ra3_l := label (ra_fr, width=15, text='number scans') ra3_e := entry (ra_fr, width=5, relief='sunken') ra3_e->insert('45') rb_fr := frame (rast_fr, side='left') rb1_l := label (rb_fr, width=12, text='scan duration') rb1_e := entry (rb_fr, width=10, relief='sunken') rb1_e->insert('30') rb2_l := label (rb_fr, width=7, text='(secs)') rb3_l := label (rb_fr, width=15, text='boresight dwell') rb3_e := entry (rb_fr, width=5, relief='sunken') rb3_e->insert('10') rb4_l := label (rb_fr, width=10, text='(sec)') rc_fr := frame (rast_fr, side='left') rc1_l := label (rc_fr, width=12, text='scan PA') rc1_e := entry (rc_fr, width=10, relief='sunken') rc1_e->insert('0') rc2_l := label (rc_fr, width=7, text='(degs)') rc3_l := label (rc_fr, width=15, text='scan coord frame') rc3_b := button (rc_fr, wrk.epochr, type='menu', width=5, relief='ridge') rc3_b1 := button (rc3_b, 'hadec') rc3_b2 := button (rc3_b, 'azel') rc3_b3 := button (rc3_b, 'J2000') whenever rc3_b1->press do { wrk.epochr := 'hadec' rc3_b->text('hadec') } whenever rc3_b2->press do { wrk.epochr := 'azel' rc3_b->text('azel') } whenever rc3_b3->press do { wrk.epochr := 'j2000' rc3_b->text('J2000') } rast_fr->unmap() ## util_fr := frame (command_fr, height=10, side='left', relief='groove') ## quit_b := button (util_fr, 'QUIT', relief='raised') cmd_l := label (util_fr, text='command') cmd_e := entry (util_fr, width=40, relief='sunken') #----------------------------------------------------------------- # functions ##const do_pwr := function () { ## if (pwr_b->state()) { ## pwr_b->background('yellow') ## pwr_b->text('ON') ## } ## else { ## pwr_b->background('green') ## pwr_b->text('OFF') ## } ## wrk.pwr := pwr_b->state() ##} const do_state := function () { if (runstate_l->text() == 'STANDBY') { runstate_l->background('green') } else { runstate_l->background('yellow') } ## wrk.state := state_b->state() } const setparm := function (crd) { # crd has been read from an entry box. we convert it to # degrees, taking into account formatting issues : it could # be entered either in either decimal or sexadecimal format. # print "crd : ", crd sn := 1. c := as_string (crd) s := split (crd, ':') # print "len (s) : ", len (s) v := as_double (s[1]) if (len(s) == 1) { # decimal format if (v < 0.) { sn := -1. v := -v } } else { # sexidecimal formatting if (v < 0.) { sn := -1. v := -v } else if (v == 0.) { if (c ~ m|-|) sn := -1 } } if (len(s) > 1) { v := v + as_double (s[2])/60. } if (len(s) > 2) { v := v + as_double (s[3])/3600. } v := sn*v return v }