Changeset 902
- Timestamp:
- Jun 11, 2012 3:41:50 PM (11 years ago)
- Location:
- specdomain/src/test
- Files:
-
- 2 added
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
specdomain/src/test/attributes.mac
r901 r902 1 1 2 2 # $Id$ 3 # from Christian Schlepuetz (formatted for RoboDoc) 4 5 #============================================================================== 6 #%+H* common/shutter 7 # ============== 8 # 9 # NAME 10 # shutter.mac 11 # 12 # SUMMARY 13 # Commands to control a fast photon shutter. 14 # 15 # DESCRIPTION 16 # The macro causes the fast photon shutter to be opened immediately prior to 17 # any count command, and closed again upon its completion. A configurable 18 # delay time assures that the shutter is fully open before issuing the 19 # count command. 20 # The photon shutter is controlled via an EPICS binary output channel, and 21 # the shutter status is optionally monitored via a binary input channel (in 22 # which case the delay time is not used, but the monitor signal is used to 23 # check for completion of the opening process). 24 # 25 # AUTHOR 26 # Christian M. Schlepuetz (CS, cschlep) 27 # 28 # CREATION DATE 29 # 2004/11/06 30 # 31 # COPYRIGHT 32 # Copyright 2006-2011 by the above authors (see AUTHOR/AUTHORS) 33 # 34 # This program is free software: you can redistribute it and/or modify 35 # it under the terms of the GNU General Public License as published by 36 # the Free Software Foundation, either version 3 of the License, or 37 # (at your option) any later version. 38 # 39 # This program is distributed in the hope that it will be useful, 40 # but WITHOUT ANY WARRANTY; without even the implied warranty of 41 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 42 # GNU General Public License for more details. 43 # 44 # You should have received a copy of the GNU General Public License 45 # along with this program. If not, see http://www.gnu.org/licenses/. 46 # 47 # VERSION 48 # $Date: 2010-11-04 19:06:06 -0400 (Thu, 04 Nov 2010) $ 49 # $Author: cschlep $ 50 # $URL: file:///data/svn/software/spec/trunk/common/shutter.mac $ 51 # $Revision: 17 $ 52 # 53 # DEPENDENCIES 54 # Chained macro definitions affected by this macro: 55 # - user_precount 56 # - user_getcounts 57 # - cleanup_always 58 # 59 # HISTORY 60 # 2004/11/06 (CS): 61 # - modified the first original version to comply with naming and format 62 # conventions 63 # - implemented help-file support and wrote help texts. 64 # 65 # 2010/03/30 (CS): 66 # - added the following global variables to make macro more easily portable: 67 # 68 # SHUTTER_CONTROL_PV # EPICS PV name for the shutter control (bo) 69 # SHUTTER_CONTROL_OPEN # EPICS control value for open shutter 70 # SHUTTER_CONTROL_CLOSED # EPICS control value for closed shutter 71 # SHUTTER_STATUS_PV # EPICE PV name for the shutter status (bi) 72 # SHUTTER_STATUS_OPEN # EPICS status value for open shutter 73 # SHUTTER_STATUS_CLOSED # EPICS status value for closed shutter 74 # SHUTTER_IS_ON # flag for automatic shutter control 75 # SHUTTER_SLEEP_TIME # SPEC sleep time after opening shutter 76 # 77 # 2010/07/23 (CS): 78 # - added SVN keywords (replacing CVS keywords) 79 # 80 # 2011/12/19 (CS): 81 # - reformatted code documentation to work with ROBODoc 82 # - added shutter_setup with following internal macros: 83 # * _shutter_print_setup 84 # * _shutter_set_option 85 # * _clear_screen 86 # - replaced SHUTTER_STATUS* with SHUTTER_MONITOR* 87 # - replaced global variables _OPEN with _OPEN_VAL and 88 # _CLOSED with _CLOSED_VAL 89 # 90 #%- 91 #============================================================================== 92 93 #============================================================================== 94 # Define some global variables 95 # ---------------------------- 96 97 global SHUTTER_MAC 98 SHUTTER_MAC = DOFILE 99 100 # EPICS PV of the binary output which controls the shutter 3 # from ESRF (http://www.esrf.eu/blissdb/macros/getsource.py?macname=attributes.mac) 4 5 #%TITLE% ATTRIBUTES.MAC 6 #%NAME% ATTRIBUTES.MAC - TANGO attribute macro counters. 7 # 8 #%DESCRIPTION% 9 # The macro set offers the possibility to set-up a TANGO attribute 10 # as macro motor or as macro counter. 11 # Only read/write TANGO attributes can be used as macro motor. 12 # The macro motor controller defined is called "attr_mot" and 13 # The macro counter controller defined is called "attr_ct". 14 # 15 #%SETUP% 16 #Motor and Counter Device Configuration (Not CAMAC) 17 # ... 18 #SCALERS DEVICE ADDR <>MODE NUM <>TYPE 19 # YES POLL 1 Software Timer 20 # YES attr_c - 2 Macro Counter 21 # 22 # take care to set the NUM field to the good number of macro_counters you need. 23 # 24 #%EXAMPLE% 25 #%DL% 26 # 27 # 28 #%DT% attr_mot_setup tilt id14/eh3-motor/mono_tile/Position %DD% 29 # Set-up the TANGO attribute macro motor with the mnemonic "tilt" 30 # 31 #%DT% attr_ct_setup det id14/pindiode/eh3/Intensity %DD% 32 # Set-up the TANGO attribute macro counter with the mnemonic "det" 33 # 34 #%XDL% 35 # 36 #%END% 37 38 39 # General parameters for attributes macros. 40 global ATTR_PAR[] 41 #ATTR_PAR["tango_aware"] 42 ATTR_PAR["mot_error"] = "ATTR : WARNING, error on reading attribute macro motor." 43 ATTR_PAR["ct_error"] = "ATTR : WARNING, error on reading attribute macro counter." 44 45 46 # Macro-COUNTERS parameters. 47 global ATTR_CT 48 list_test ATTR_CT 49 # ATTR_CT[mne]["dev_name"] 50 # ATTR_CT[mne]["attr_name"] 51 52 53 # Macro-MOTORS parameters. 54 global ATTR_MOT 55 list_test ATTR_MOT 56 # ATTR_MOT[mne]["dev_name"] 57 # ATTR_MOT[mne]["attr_name"] 58 59 global ESRF_ERR 60 61 62 ###################################################################### 63 ############################## ############################# 64 ############################## General ############################# 65 ############################## ############################# 66 ###################################################################### 67 68 #%UU% 69 #%MDESC% 70 # Removes everythings about attributes.mac 71 def attr_unsetup '{ 72 unglobal ATTR_MOT 73 unglobal ATTR_CT 74 unglobal ATTR_PAR 75 76 # no cdef ? 77 }' 78 79 80 #%UU% 81 #%MDESC% 82 # Displays information about counters managed by attributes macros. 83 def attr_show '{ 84 attr_ct_show 85 print "" 86 attr_mot_show 87 }' 88 89 ###################################################################### 90 ########################## ########################## 91 ########################## Macro counters ########################## 92 ########################## ########################## 93 ###################################################################### 94 95 #%UU% <mne> <dev> <attribute> | <mne> <dev/attribute> 96 #%MDESC% 97 # Configures counter <mne> to read <attribute> of tango device <dev>. 98 # 99 # example: attr_ct_setup bpm2x id22eh2/bpmccd/1 X 100 # or attr_ct_setup bpm2x id22eh2/bpmccd/1/X 101 # 102 # example2: attr_ct_setup sstate sys/Database/2 State 103 # attr_ct_setup toto id22/refillsim/1/Refill_time 104 # 105 def attr_ct_setup '{ 106 global ATTR_PAR 107 global ATTR_CT 108 109 local _args_strings _mne _nbarg 110 111 _nbarg = $# 112 113 _mne = "$1" 114 115 list_test ATTR_CT 116 list_test ATTR_PAR 117 118 list_add(ATTR_CT, _mne) 119 120 # Checks if you spec version can use "tango_get". 121 # ??? what happens in case of an old SPEC ??? 122 # test on VERSION ??? 123 if (tango_io("sys/Database/2", "State") != -1){ 124 ATTR_PAR["tango_aware"] = 1 125 } 126 else { 127 ATTR_PAR["tango_aware"] = 0 128 } 129 130 # Parses arguments to extract device and attribute names. 131 # 2 or 3 arguments ? 132 if (_nbarg == 2){ 133 # print "2 parameters given." 134 _args_strings[0] = 0 135 split ("$2", _args_strings, "/") 136 137 list_setpar(ATTR_CT, _mne, "dev_name", \ 138 sprintf("%s/%s/%s", _args_strings[0], \ 139 _args_strings[1], _args_strings[2])) 140 141 list_setpar(ATTR_CT, _mne, "attr_name", _args_strings[3]) 142 } 143 else if (_nbarg == 3){ 144 # print "3 parameters given." 145 list_setpar(ATTR_CT, _mne, "dev_name", "$2") 146 list_setpar(ATTR_CT, _mne, "attr_name", "$3") 147 } 148 else { 149 print "error : $0 requires 2 or 3 arguments." 150 print "usage -> $0 <mne> <device> <attribute>" 151 print " or $0 <mne> <device/attribute>" 152 exit 153 } 154 155 # Informative message. 156 printf("Configuring counter ") 157 tty_cntl("md") 158 printf ("%s", "$1") 159 tty_cntl("me") 160 printf (" to reflect attribute ") 161 tty_cntl("md") 162 printf ("%s", ATTR_CT["$1"]["attr_name"]) 163 tty_cntl("me") 164 printf (" of device ") 165 tty_cntl("md") 166 printf ("%s", ATTR_CT["$1"]["dev_name"]) 167 tty_cntl("me") 168 print "." 169 170 if (cnt_num(_mne) < 0){ 171 printf("Warning: counter \"%s\" is not defined\n", _mne) 172 } 173 174 }' 175 176 #%UU% <mne> 177 #%MDESC% 178 # Removes reading of attribute linked to <mne> counter. 179 # ex: attr_ct_unsetup sstate 180 def attr_ct_unsetup '{ 181 local nb_param 182 183 nb_param =$# 184 185 if (nb_param < 1){ 186 print "usage : $0 <counter_mnemonic>" 187 } 188 else{ 189 list_remove(ATTR_CT, "$1") 190 } 191 }' 192 193 #%UU% 194 #%MDESC% 195 # Removes reading of all attributes. 196 def attr_ct_unsetup_all '{ 197 unglobal ATTR_CT 198 }' 199 200 201 #%UU% 202 #%MDESC% 203 # Displays informations about macro counters. 204 def attr_ct_show '{ 205 local _mne 206 207 print "-------=== macro counters ===------------" 208 print "mnemonic device attribute " 209 print "-----------------------------------------" 210 211 for (i=0; i< list_n(ATTR_CT); i++){ 212 _mne = ATTR_CT[i+1] 213 print ATTR_CT[i+1]" " ATTR_CT[_mne]["dev_name"]" "\ 214 ATTR_CT[_mne]["attr_name"] 215 } 216 print "-----------------------------------------" 217 218 }' 219 220 221 #%IU% 222 #%MDESC% 223 # Main function for macro counter. 224 def attr_ct_cmd(cntnum, what, p1, p2) '{ 225 global ATTR_CT 226 local _cntr _dev _attr 227 228 _cntr_mne = cnt_mne(cntnum) 229 230 # print "_cntr_mne=" _cntr_mne " \t what=" what 231 232 # "counts" read the attribute value as counter 233 # parameters: none 234 if (cntnum == ".."){ 235 # for key applying to all counters 236 #print "--" 237 } 238 else{ 239 if (what == "counts") { 240 # print "what == \"counts\"" 241 local _ans _num _dev _attr 242 243 # Tests if _cntr_mne is really an attr_ct macro counter. 244 if (list_check(ATTR_CT, _cntr_mne)){ 245 _dev = list_getpar(ATTR_CT, _cntr_mne, "dev_name") 246 _attr = list_getpar(ATTR_CT, _cntr_mne, "attr_name") 247 248 if(ATTR_PAR["tango_aware"]){ 249 250 _ans = tango_get(_dev, _attr) 251 252 if (TANGO_ERR){ 253 tty_cntl("md") 254 print "\n" ATTR_CT_ERROR " " _cntr_mne 255 printf ("TANGO_ERR_MSG = \"%s\" \n\n", TANGO_ERR) 256 print TANGO_ERR_STACK 257 tty_cntl("me") 258 exit 259 } 260 } 261 else{ 262 # print "esrf_io() VERSION" 263 # esrf_io version. 264 local _target 265 ESRF_ERR = -1 266 267 _target = _dev "/" _attr 268 _ans = esrf_io (_target, "DevRead") 269 270 if (ESRF_ERR) { 271 tty_cntl("md") 272 print "\n" ATTR_CT_ERROR " " _cntr_mne " <- " _target "\n" 273 print "\n" ESRF_ERR_MSG "\n\n" 274 tty_cntl("me") 275 } 276 } 277 278 return (_ans) 279 } 280 else{ 281 # print "Counter \"" _cntr_mne "\" not set up in ATTR_CT." 282 return (-1) 283 } 284 } 285 } 286 }' 287 288 289 # def ct '{ 290 # _cols = 0 291 # p "1" 292 # waitmove 293 # p "2" 294 # count_em $* 295 # p "3" 296 # rdef cleanup \' 297 # undef cleanup 298 # onp; show_cnts; offp 299 # user_handlecounts 300 # \' 301 # p "4" 302 # waitcount 303 # p "5" 304 # undef cleanup 305 # p "6" 306 # onp; show_cnts; offp 307 # p "7" 308 # user_handlecounts 309 # p "8" 310 # }' 311 # 312 # 374.CYRIL> ct 313 # 1 314 # 2 315 # what == "counts" 316 # what == "counts" 317 # 3 318 # 4 319 # what == "counts" 320 # what == "counts" 321 # 5 322 # 6 323 # what == "counts" 324 # what == "counts" 325 # 326 # Thu Jan 22 17:09:38 2009 327 # 328 # Seconds = 1.003 329 # Monitor = 0 (0/s) 330 # Detector = 0 (0/s) 331 # toto = -1 (-0.997009/s) 332 # sstate = 0 (0/s) 333 # 7 334 # 8 335 # 336 # 375.CYRIL> what == "counts" 337 # what == "counts" 338 # 339 # 340 # 375.CYRIL> 341 342 343 344 345 ###################################################################### 346 ########################### ########################### 347 ########################### Macro motors ########################### 348 ########################### ########################### 349 ###################################################################### 350 351 ##%UU% <mne> <dev> <attribute> | <mne> <dev/attribute> 352 #%MDESC% 353 # Configures counter <mne> to read <attribute> of tango device <dev>. 354 # 355 # example: attr_mot_setup at1 id22eh2/machin/1 X 356 # or attr_mot_setup at2 id22eh2/machin/1/X 357 # 358 # example 2 attr_mot_setup rft1 id22/refillsim/1 Refill_time 359 # or attr_mot_setup rft1 id22/refillsim/1/Refill_time 360 # 361 def attr_mot_setup '{ 362 local _fields _dev_name _nbarg 363 local _args_strings _mne 364 365 # Checks if you spec version can use "tango_put/tango_get". 366 # ??? what happens in case of an old SPEC ??? 367 # test on VERSION ??? 368 if (tango_io("sys/Database/2", "State") != -1){ 369 ATTR_PAR["tango_aware"] = 1 370 } 371 else { 372 ATTR_PAR["tango_aware"] = 0 373 } 374 375 _mne = "$1" 376 377 list_test ATTR_MOT 378 list_test ATTR_PAR 379 380 list_add(ATTR_MOT, _mne) 381 382 _nbarg = $# 383 384 385 # Parses arguments to extract device and attribute names. 386 # 2 or 3 arguments ? 387 if (_nbarg == 2){ 388 # print "2 parameters given." 389 _args_strings[0] = 0 390 split ("$2", _args_strings, "/") 391 392 list_setpar(ATTR_MOT, _mne, "dev_name", \ 393 sprintf("%s/%s/%s", _args_strings[0], \ 394 _args_strings[1], _args_strings[2])) 395 396 list_setpar(ATTR_MOT, _mne, "attr_name", _args_strings[3]) 397 } 398 else if (_nbarg == 3){ 399 # print "3 parameters given." 400 list_setpar(ATTR_MOT, _mne, "dev_name", "$2") 401 list_setpar(ATTR_MOT, _mne, "attr_name", "$3") 402 } 403 else { 404 print "error : $0 requires 2 or 3 arguments." 405 print "usage -> $0 <mne> <device> <attribute>" 406 print " or $0 <mne> <device/attribute>" 407 exit 408 } 409 410 411 # Informative message. 412 printf("Configuring macro motor ") 413 tty_cntl("md") 414 printf ("%s", "$1") 415 tty_cntl("me") 416 printf (" to reflect attribute ") 417 tty_cntl("md") 418 printf ("%s", ATTR_MOT["$1"]["attr_name"]) 419 tty_cntl("me") 420 printf (" of device ") 421 tty_cntl("md") 422 printf ("%s", ATTR_MOT["$1"]["dev_name"]) 423 tty_cntl("me") 424 print "." 425 426 if (motor_num(_mne) < 0){ 427 printf("Warning: motor \"%s\" is not defined\n", _mne) 428 } 429 }' 430 431 432 433 #%UU% <mne> 434 #%MDESC% 435 # Removes reading of attribute linked to <mne> motor. 436 # ex: attr_mot_unsetup at1 437 def attr_mot_unsetup '{ 438 local _nb_param 439 440 _nb_param =$# 441 442 if (_nb_param < 1){ 443 print "usage : $0 <motor_mnemonic>" 444 } 445 else{ 446 list_remove(ATTR_MOT, "$1") 447 } 448 }' 449 450 #%UU% 451 #%MDESC% 452 # Removes reading of all attributes. 453 def attr_mot_unsetup_all '{ 454 unglobal ATTR_MOT 455 }' 456 457 #%UU% 458 #%MDESC% 459 # Displays informations about attributes macro motors. 460 def attr_mot_show '{ 461 local _mne 462 463 print "--------==== macro motors ====-----------" 464 print "mnemonic device attribute " 465 print "-----------------------------------------" 466 467 for (i=0; i< list_n(ATTR_MOT); i++){ 468 _mne = ATTR_MOT[i+1] 469 print ATTR_MOT[i+1]" " ATTR_MOT[_mne]["dev_name"]" " \ 470 ATTR_MOT[_mne]["attr_name"] 471 } 472 print "-----------------------------------------" 473 474 }' 475 476 477 #%IU% 478 #%MDESC% 479 # 480 def attr_mot_cmd(motnum, what, p1, p2) '{ 481 482 local _mot_mne _dev _attr 483 484 _mot_mne = motor_mne(motnum) 485 486 # Tests if _mot_mne is really an attr_ macro motor. 487 if (list_check(ATTR_MOT, _mot_mne)){ 488 _dev = list_getpar(ATTR_MOT, _mot_mne, "dev_name") 489 _attr = list_getpar(ATTR_MOT, _mot_mne, "attr_name") 490 _target = _dev "/" _attr 491 } 492 else{ 493 # print "Motor \"" _mot_mne "\" not set up in ATTR_MOT." 494 return (-1) 495 } 496 497 498 499 if(motnum == ".."){ 500 # key applying to all motors 501 # print "--" 502 } 503 504 #------------------------------------- 505 # "position" must return dial position (in integer steps) 506 # parameters: none 507 if (what == "position") { 508 local _pos 509 510 if(ATTR_PAR["tango_aware"]){ 511 _pos = tango_get(_dev, _attr) 512 513 if (TANGO_ERR){ 514 tty_cntl("md") 515 print "\n" ATTR_MOT_ERROR " " _mot_mne " " _dev "/" _attr 516 printf ("TANGO_ERR_MSG = \"%s\" \n\n", TANGO_ERR) 517 print TANGO_ERR_STACK 518 tty_cntl("me") 519 exit 520 } 521 } 522 else{ 523 _pos = esrf_io (_target, "DevRead") 524 525 if (ESRF_ERR) { 526 tty_cntl("md") 527 print "\n" ATTR_MOT_ERROR " " _mot_mne " <- " _target "\n" 528 print "\n" ESRF_ERR_MSG "\n\n" 529 tty_cntl("me") 530 } 531 } 532 return (_pos) 533 } 534 535 #------------------------------------- 536 # "get_status" called during the motion, must return a bit mask 537 # bits meaning: 0 if motor idle 538 # 2 if motor moving 539 # 4 if negative limit on 540 # 8 if positive limit on 541 # parameters: none 542 if (what == "get_status"){ 543 local _state 544 local _ret 545 546 if(ATTR_PAR["tango_aware"]){ 547 _state = tango_io(_dev, "State") 548 549 if (TANGO_ERR){ 550 tty_cntl("md") 551 print "\n" ATTR_MOT_ERROR " " _mot_mne " " _dev "/" _attr 552 printf ("TANGO_ERR_MSG = \"%s\" \n\n", TANGO_ERR) 553 print TANGO_ERR_STACK 554 tty_cntl("me") 555 exit 556 } 557 } 558 else{ 559 ESRF_ERR = -1 560 _state = esrf_io (_target, "DevState") 561 562 if (ESRF_ERR){ 563 tty_cntl("md") 564 print "\n" MOT_ERROR " " _mot_mne "\n" 565 print "\n" ESRF_ERR_MSG"\n\n" 566 tty_cntl("me") 567 } 568 } 569 570 # 571 # DEVMOVING 572 # 573 if (_state == 9) { 574 _ret |= 2 575 return _ret 576 } 577 # 578 # DEVFAULT 579 # 580 if (_state == 23) { 581 local _status 582 583 print "" 584 585 if(ATTR_PAR["tango_aware"]){ 586 _status = tango_io(_dev, "DevStatus") 587 } 588 else{ 589 ESRF_ERR = -1 590 print esrf_io (_target, "DevStatus") 591 } 592 593 print "Status= " _status 594 595 print "" 596 return 0 597 } 598 599 return 0 600 } 601 602 #------------------------------------- 603 # "start_one" 604 # parameters: p2 is relative motion, p1 is absolute requested position 605 if (what == "start_one") { 606 if(ATTR_PAR["tango_aware"]){ 607 608 tango_put(_dev, _attr, p1) 609 610 if (TANGO_ERR){ 611 tty_cntl("md") 612 print "\n" ATTR_MOT_ERROR " " _mot_mne " " _dev "/" _attr 613 printf ("TANGO_ERR_MSG = \"%s\" \n\n", TANGO_ERR) 614 print TANGO_ERR_STACK 615 tty_cntl("me") 616 exit 617 } 618 } 619 else{ 620 ESRF_ERR = -1 621 622 esrf_io (_target, "DevWrite", p1) 623 if (ESRF_ERR) { 624 tty_cntl("md") 625 print "\n" MOT_ERROR " " _mot_mne "\n" 626 print "\n" ESRF_ERR_MSG"\n\n" 627 tty_cntl("me") 628 } 629 } 630 } 631 632 #------------------------------------- 633 # "set_position" called on "set_dial motor newpos" 634 # parameters: p1 is the new position (in steps) 101 635 # 102 global SHUTTER_CONTROL_PV 103 SHUTTER_CONTROL_PV = "X04SA-ES3-SC:FPS" 104 105 global SHUTTER_CONTROL_OPEN_VAL 106 SHUTTER_CONTROL_OPEN_VAL = "On" 107 108 global SHUTTER_CONTROL_CLOSED_VAL 109 SHUTTER_CONTROL_CLOSED_VAL = "Off" 110 111 # EPICS PV of the binary input which monitors the state of the shutter 112 # if SHUTTER_MONITOR_PV = "", no monitoring is performed 636 if (what == "set_position") { 637 if(ATTR_PAR["tango_aware"]){ 638 tango_put(_dev, _attr, p1) 639 640 if (TANGO_ERR){ 641 tty_cntl("md") 642 print "\n" ATTR_MOT_ERROR " " _mot_mne " " _dev "/" _attr 643 printf ("TANGO_ERR_MSG = \"%s\" \n\n", TANGO_ERR) 644 print TANGO_ERR_STACK 645 tty_cntl("me") 646 exit 647 } 648 } 649 else{ 650 ESRF_ERR = -1 651 652 esrf_io (_target, "DevWrite", p1) 653 654 if (ESRF_ERR) { 655 tty_cntl("md") 656 print "\n" MOT_ERROR " " _mot_mne "\n" 657 print "\n" ESRF_ERR_MSG"\n\n" 658 tty_cntl("me") 659 } 660 } 661 } 662 663 #------------------------------------- 664 # "abort_one" called on <Ctrl-C> 113 665 # 114 global SHUTTER_MONITOR_PV 115 SHUTTER_MONITOR_PV = "" 116 117 global SHUTTER_MONITOR_OPEN_VAL 118 SHUTTER_MONITOR_OPEN_VAL = "open" 119 120 global SHUTTER_MONITOR_CLOSED_VAL 121 SHUTTER_MONITOR_CLOSED_VAL = "closed" 122 123 global SHUTTER_IS_ON 124 SHUTTER_IS_ON = 0 125 126 global SHUTTER_SLEEP_TIME 127 SHUTTER_SLEEP_TIME = 0.1 128 129 130 #============================================================================== 131 # This macro file contains the following commands: 132 #============================================================================== 133 134 #------------------------------------------------------------------------------ 135 #%+M* shutter/sh_help, shutter_help 136 # =============== 137 # 138 # SUMMARY 139 # Displays the shutter help text. 140 # 141 # USAGE 142 # > sh_help 143 # 144 # NOTE 145 # The help text is generated by simply displaying the text file 146 # shutter_mac.txt, which should reside in the same directory as shutter.mac. 147 # If the file does not exist, a generic help text is shown. 148 #%- 149 150 def shutter_help 'sh_help' 151 152 def sh_help '{ 153 # ======= 154 155 unix (sprintf ("dirname %s", SHUTTER_MAC), _1) 156 ll = length (_1) 157 if (substr (_1, ll, 1) == "\n") _1 = substr (_1, 1, (ll - 1)) 158 file = sprintf ("%s/shutter_mac.txt", _1) 159 if (file_info (file, "-e")) { 160 unix (sprintf ("cat %s", file)) 161 } else { 162 printf("\n Macros available in file shutter.mac:\n") 163 printf( " ===========\n") 164 printf("\n") 165 printf(" sh_help - creates this help text\n") 166 printf(" shop - opens the fast shutter\n") 167 printf(" shcl - closes the fast shutter\n") 168 printf(" shon - activate automatic shutter opening and closing\n") 169 printf(" shoff - turn automatic shutter opening and closing off\n") 170 printf(" sh_status - display whether the shutter is open or closed\n") 171 printf(" sh_show - display shutter configuration and status\n") 172 printf(" sh_setup - modify the shutter configuration\n") 173 printf("\n") 174 } 175 }' 176 177 178 #------------------------------------------------------------------------------ 179 #%+M* shutter/shop, shutter_open 180 # ============ 181 # 182 # USAGE 183 # > shop 184 # 185 # SUMMARY 186 # Open the fast photon shutter 187 #%- 188 189 def shutter_open 'shop' 190 191 def shop'{ 192 # ==== 193 194 epics_put (SHUTTER_CONTROL_PV, SHUTTER_CONTROL_OPEN_VAL) 195 if (SHUTTER_MONITOR_PV == ""){ 196 sleep(SHUTTER_SLEEP_TIME) 197 } else { 198 while(epics_get(SHUTTER_MONITOR_PV) != SHUTTER_MONITOR_OPEN_VAL){ 199 sleep(0.01) 200 } 201 } 202 }' 203 204 205 #------------------------------------------------------------------------------ 206 #%+M* shutter/shcl, shutter_close 207 # ============ 208 # 209 # USAGE 210 # > shcl 211 # 212 # SUMMARY 213 # Close the fast photon shutter 214 #%- 215 216 def shutter_close 'shcl' 217 218 def shcl'{ 219 # ==== 220 221 epics_put (SHUTTER_CONTROL_PV, SHUTTER_CONTROL_CLOSED_VAL) 222 if (SHUTTER_MONITOR_PV != ""){ 223 while(epics_get(SHUTTER_MONITOR_PV) != SHUTTER_MONITOR_CLOSED_VAL){ 224 sleep(0.01) 225 } 226 } 227 }' 228 229 230 #------------------------------------------------------------------------------ 231 #%+M* shutter/shon, shutter_on 232 # ============ 233 # 234 # SUMMARY 235 # Activate automatic shutter opening and closing. 236 # 237 # DESCRIPTION 238 # If automatic shutter control is enabled, the shutter is opened just before 239 # an actual count command is executed and immediately closed again thereafter 240 # to prevent unnecessary sample and detector irradiation. 241 # 242 # USAGE 243 # > shon [<flag>] 244 # 245 # When called with no <flag> argument, shon enables automatic shutter 246 # control. <flag> can be one of the following 247 # flag = 1 --> enable automatic shutter control (default) 248 # flag = 0 --> disable automatic shutter control 249 # 250 # NOTES 251 # When automatic shutter control is enabled, the fast photon shutter is 252 # always closed in a case of any error (this includes also Ctrl-C 253 # interrupts). 254 #%- 255 256 def shutter_on 'shon' 257 258 def shon '{ 259 # ==== 260 261 if($# == 0){ 262 _status = 1 263 } else if($# == 1){ 264 _status = $1 265 } else { 266 printf("Error: wrong number of arguments in \'shon\'. Exiting...\n") 267 printf("Usage:\n") 268 printf(" shon <flag>\n") 269 printf("flag = 1 --> enable\n") 270 printf("flag = 0 --> disable\n") 271 exit 272 } 273 274 if(_status){ 275 276 SHUTTER_IS_ON = 1 277 278 # add to user_precount (opening) and user_getcounts (closing) 279 cdef("user_precount","shop; ","aaa_shutter_user_precount_key",0x10) 280 cdef("user_getcounts","shcl; ","zzz_shutter_user_getcounts_key",0x20) 281 282 # add shcl to cleanup_always to close in case of errors 283 cdef("cleanup_always","shcl; ","aaa_shutter_cleanup_key",0x10) 284 printf("Automatic shutter opening is ON\n") 285 } else { 286 287 SHUTTER_IS_ON = 0 288 289 # remove from user_precount and getcounts 290 cdef("user_precount","","aaa_shutter_user_precount_key","delete") 291 cdef("user_getcounts","","zzz_shutter_user_getcounts_key","delete") 292 cdef("cleanup_always","","aaa_shutter_cleanup_key","delete") 293 printf("Automatic shutter opening is OFF\n") 294 } 295 296 }' 297 298 299 #------------------------------------------------------------------------------ 300 #%+M* shutter/shoff, shutter_off 301 # ============= 302 # 303 # USAGE 304 # > shoff 305 # 306 # SUMMARY 307 # Turn automatic shutter opening and closing OFF. 308 #%- 309 310 def shutter_off 'shoff' 311 312 def shoff '{ 313 # ====== 314 315 shon 0 316 317 }' 318 319 320 #------------------------------------------------------------------------------ 321 #%+M* shutter/sh_show, shutter_show 322 # =============== 323 # 324 # USAGE 325 # > sh_show 326 # 327 # SUMMARY 328 # Display the fast photon shutter setup and status 329 # 330 # OUTPUT 331 # This is a sample output: 332 # 333 # Shutter setup: 334 # 335 # 1) Shutter control PV name : X04SA-ES3-SC:FPS 336 # 2) Control PV value for shutter OPEN : On 337 # 3) Control PV value for shutter CLOSED : Off 338 # 4) Shutter monitor PV name ("" if none) : 339 # 5) Monitor PV value for shutter OPEN : open 340 # 6) Monitor PV value for shutter CLOSED : closed 341 # 7) Shutter delay time : 0.10 sec 342 # 8) Auto shutter enable(1) / disable(0) : 0 343 # 344 # Shutter is OPEN 345 # Automatic shutter opening is ON 346 #%- 347 348 def shutter_show 'sh_show' 349 350 def sh_show'{ 351 # ======= 352 353 _shutter_print_setup 354 sh_status 355 356 }' 357 358 359 #------------------------------------------------------------------------------ 360 #%+M* shutter/sh_status, shutter_status 361 # ================= 362 # 363 # USAGE 364 # > sh_status 365 # 366 # SUMMARY 367 # Display the fast photon shutter status (OPEN or CLOSED) 368 # 369 # OUTPUT 370 # This is a sample output: 371 # 372 # Shutter is OPEN 373 # Automatic shutter opening is ON 374 #%- 375 376 def shutter_status 'sh_status' 377 378 def sh_status'{ 379 # ========= 380 381 if (SHUTTER_MONITOR_PV != ""){ 382 if (epics_get(SHUTTER_MONITOR_PV)==SHUTTER_MONITOR_OPEN_VAL){ 383 printf("Shutter is OPEN\n") 384 } else { 385 printf("Shutter is CLOSED\n") 386 } 387 } else { 388 if (epics_get(SHUTTER_CONTROL_PV)==SHUTTER_CONTROL_OPEN_VAL){ 389 printf("Shutter is OPEN\n") 390 } else { 391 printf("Shutter is CLOSED\n") 392 } 393 } 394 395 if (SHUTTER_IS_ON == 1){ 396 printf("Automatic shutter opening is ON\n") 397 } else { 398 printf("Automatic shutter opening is OFF\n") 399 } 400 401 }' 402 403 404 #------------------------------------------------------------------------------ 405 #%+M* shutter/sh_setup, shutter_setup 406 # ================ 407 # 408 # USAGE 409 # > sh_setup 410 # 411 # Then modify the dialog options 412 # 413 # SUMMARY 414 # Modify the shutter configuration. 415 #%- 416 417 def shutter_setup 'sh_setup' 418 419 def sh_setup '{ 420 # ======== 421 422 local _setup_numitems, _setup_option, _tmp_option, _str1 423 424 # total number of setup items 425 _setup_numitems = 8 426 427 _clear_screen 428 429 _setup_option = 0 430 _tmp_option = -1 431 while (_tmp_option) { 432 _tmp_option = -1 433 while (_tmp_option < 0 || _tmp_option > _setup_numitems){ 434 _shutter_print_setup 435 _str1 = sprintf("Enter 1-%d to change the parameters, 0 to quit",\ 436 _setup_numitems) 437 _tmp_option = getval(_str1, _setup_option) 438 if(index(_tmp_option, "q") == 1 || index(_tmp_option, "Q") == 1){ 439 _tmp_option = 0 440 } 441 } 442 _setup_option = _tmp_option 443 if (_setup_option != 0){ 444 _shutter_set_option _setup_option 445 } 446 _setup_option = (_tmp_option + 1)%(_setup_numitems + 1) 447 } 448 }' 449 450 451 #============================================================================== 452 # Internal macros 453 #============================================================================== 454 455 #------------------------------------------------------------------------------ 456 #%+iM* shutter/_shutter_print_setup 457 # ============================ 458 # 459 # SUMMARY 460 # Prints the configuration options and current values to screen 461 # 462 # NOTE 463 # The option numbers must be kept in sync between _shutter_set_option and 464 # _shutter_print_setup 465 #%- 466 467 def _shutter_print_setup '{ 468 # ==================== 469 470 tty_cntl("ho") # home cursor on left upper corner of screen 471 tty_cntl("cd") # clear the rest of the screen 472 473 tty_cntl("so") # highlight font 474 printf("Shutter setup:\n") 475 tty_cntl("se") # turn off font highlighting 476 477 printf("\n 1) Shutter control PV name \t: %s", \ 478 SHUTTER_CONTROL_PV) 479 printf("\n 2) Control PV value for shutter OPEN \t: %s", \ 480 SHUTTER_CONTROL_OPEN_VAL) 481 printf("\n 3) Control PV value for shutter CLOSED \t: %s", \ 482 SHUTTER_CONTROL_CLOSED_VAL) 483 printf("\n 4) Shutter monitor PV name (\"\" if none) \t: %s", \ 484 SHUTTER_MONITOR_PV) 485 printf("\n 5) Monitor PV value for shutter OPEN \t: %s", \ 486 SHUTTER_MONITOR_OPEN_VAL) 487 printf("\n 6) Monitor PV value for shutter CLOSED \t: %s", \ 488 SHUTTER_MONITOR_CLOSED_VAL) 489 printf("\n 7) Shutter delay time \t: %.2f sec", \ 490 SHUTTER_SLEEP_TIME) 491 printf("\n 8) Auto shutter enable(1) / disable(0) \t: %d", \ 492 SHUTTER_IS_ON) 493 printf("\n\n") 494 }' 495 496 #------------------------------------------------------------------------------ 497 #%+iM* shutter/_shutter_set_option 498 # =========================== 499 # 500 # SUMMARY 501 # Sets a new value for a given option 502 # 503 # DESCRIPTION 504 # Sets a new value for a given option from the options menu that was created 505 # with the _shutter_print_setup command. 506 # 507 # NOTE 508 # The option numbers must be kept in sync between _shutter_set_option and 509 # _shutter_print_setup 510 #%- 511 512 def _shutter_set_option '{ 513 # =================== 514 515 if ($1==1) { 516 SHUTTER_CONTROL_PV = getsval("Enter shutter control PV name",\ 517 SHUTTER_CONTROL_PV) 518 } else if ($1==2) { 519 SHUTTER_CONTROL_OPEN_VAL = \ 520 getsval("Control PV value for shutter OPEN",\ 521 SHUTTER_CONTROL_OPEN_VAL) 522 } else if ($1==3) { 523 SHUTTER_CONTROL_CLOSED_VAL = \ 524 getsval("Control PV value for shutter CLOSED",\ 525 SHUTTER_CONTROL_CLOSED_VAL) 526 } else if ($1==4) { 527 _str = "Enter shutter monitor PV name"\ 528 "(leave blank if shutter is not actively monitored)" 529 SHUTTER_MONITOR_PV = \ 530 getsval(_str, SHUTTER_MONITOR_PV) 531 } else if ($1==5) { 532 SHUTTER_MONITOR_OPEN_VAL = \ 533 getsval("Monitor PV value for shutter OPEN",\ 534 SHUTTER_MONITOR_OPEN_VAL) 535 } else if ($1==6) { 536 SHUTTER_MONITOR_CLOSED_VAL = \ 537 getsval("Monitor PV value for shutter CLOSED",\ 538 SHUTTER_MONITOR_CLOSED_VAL) 539 } else if ($1==7) { 540 SHUTTER_SLEEP_TIME = getsval("Enter shutter delay time [seconds]",\ 541 SHUTTER_SLEEP_TIME) 542 } else if ($1==8) { 543 _status = yesno("Enable the automatic shutter control?",\ 544 SHUTTER_IS_ON) 545 shon _status 546 } 547 }' 548 549 #------------------------------------------------------------------------------ 550 #%+iM* shutter/_clear_screen 551 # ===================== 552 # 553 # SUMMARY 554 # Clears the terminal screen 555 # 556 # DESCRIPTION 557 # Clears the screen without losing the screen history or messing up the 558 # scrolling capabilities (this has been a problem for certain terminals) 559 # by blanking out the entire height of the screen and returning the cursor to 560 # the top left corner. 561 #%- 562 563 def _clear_screen '{ 564 # ============= 565 566 # update the ROWS and COLS variables in case the terminal has been resized 567 tty_cntl("resized?") 568 569 # print as many newlines as there are ROWS in terminal 570 cl_text = "" 571 for (i=0;i<ROWS;i++){ 572 cl_text = cl_text "\n" 573 } 574 printf(cl_text) 575 576 # move back to the top of the screen and clear to end of the screen 577 tty_move(0,0) 578 tty_cntl("cd") 579 580 }' 581 582 #============================================================================== 583 # End of $Id$ 584 #============================================================================== 666 if (what == "abort_one") { 667 if(ATTR_PAR["tango_aware"]){ 668 tango_put(_dev, "DevAbort") 669 670 if (TANGO_ERR){ 671 tty_cntl("md") 672 print "\n" ATTR_MOT_ERROR " " _mot_mne " " _dev "/" _attr 673 printf ("TANGO_ERR_MSG = \"%s\" \n\n", TANGO_ERR) 674 print TANGO_ERR_STACK 675 tty_cntl("me") 676 exit 677 } 678 } 679 else{ 680 ESRF_ERR = -1 681 esrf_io (_target, "DevAbort") 682 if (ESRF_ERR) { 683 tty_cntl("md") 684 print "\n" MOT_ERROR " " _mot_mne "\n" 685 print "\n" ESRF_ERR_MSG"\n\n" 686 tty_cntl("me") 687 } 688 } 689 } 690 }' 691 692 693 #%MACROS% 694 #%IMACROS% 695 #%AUTHOR% 696 -
specdomain/src/test/index.rst
- Property svn:eol-style set to native
- Property svn:keywords set to Id
r898 r902 1 .. $Id :$1 .. $Id$ 2 2 3 3 Welcome to sphinxcontrib-specdomain-acceptancetest's documentation! … … 10 10 11 11 test_doc 12 autodoc 12 13 13 14 Indices and tables -
specdomain/src/test/move.mac
r900 r902 1 1 2 2 # $Id$ 3 # from Christian Schlepuetz (formatted for RoboDoc) 4 5 #============================================================================== 6 #%+H* common/move 7 # =========== 8 # 9 # NAME 10 # move.mac 11 # 12 # SUMMARY 13 # Commands to move motors. 14 # 15 # DESCRIPTION 16 # Collection of helpful move commands for synchronized motor movements or 17 # reciprocal space moves. 18 # 19 # AUTHOR 20 # C. M. Schlepuetz (CS, cschlep) 21 # 22 # CREATION DATE 23 # 2005/06/06 24 # 25 # COPYRIGHT 26 # Copyright 2006-2011 by the above authors (see AUTHOR/AUTHORS) 27 # 28 # This program is free software: you can redistribute it and/or modify 29 # it under the terms of the GNU General Public License as published by 30 # the Free Software Foundation, either version 3 of the License, or 31 # (at your option) any later version. 32 # 33 # This program is distributed in the hope that it will be useful, 34 # but WITHOUT ANY WARRANTY; without even the implied warranty of 35 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 36 # GNU General Public License for more details. 37 # 38 # You should have received a copy of the GNU General Public License 39 # along with this program. If not, see http://www.gnu.org/licenses/. 40 # 41 # VERSION 42 # $Date: 2011-06-29 12:21:58 -0400 (Wed, 29 Jun 2011) $ 43 # $Author: cschlep $ 44 # $URL: file:///data/svn/software/spec/trunk/common/move.mac $ 45 # $Revision: 28 $ 46 # 47 # DEPENDENCIES 48 # - none 49 # 50 # HISTORY 51 # 2005/06/06 (CS): 52 # - created first version of this file 53 # 54 # 2010/07/23 (CS): 55 # - added SVN keywords 56 # - removed all non-general definitions (particular to a certain instrument) 57 # 58 # 2011/04/19 (CS): 59 # - added "multi-move" commands, which allow to move multiple motors in one 60 # command (based on the standard mv command structure): 61 # * mmv # multi-move 62 # * ummv # updated multi-move 63 # * mmvr # relative multi-move 64 # * ummvr # updated relative multi-move 65 # * _mmv # low-level multi-move command 66 # * _mmvr # low-level relative multi-move command 67 # * uwmm # updated display of motor positions 68 # 69 # 2011/12/21 (CS): 70 # - reformatted code documentation to work with ROBODoc 71 #%- 72 #============================================================================== 73 74 75 #============================================================================== 76 # Define some global variables 77 # ---------------------------- 78 79 # Save the name of this macro file. 80 global MOVE_MAC 81 MOVE_MAC = DOFILE 82 83 #============================================================================== 84 # This macro file contains the following commands: 85 #============================================================================== 86 87 #------------------------------------------------------------------------------ 88 #%+M* move/move_help 89 # ============== 90 # 91 # SUMMARY 92 # Generates the help text. 93 # 94 # NOTE 95 # This help text is obtained by displaying the file move_mac.txt, which 96 # should reside in the same directory as move.mac. If the file does not 97 # exist, a generic help text is shown. 98 #%- 99 100 def helpmove 'move_help' 101 def movehelp 'move_help' 102 103 def move_help '{ 104 # ========= 105 106 unix (sprintf ("dirname %s", MOVE_MAC), _1) 107 ll = length (_1) 108 if (substr (_1, ll, 1) == "\n") _1 = substr (_1, 1, (ll - 1)) 109 file = sprintf ("%s/move_mac.txt", _1) 110 if (file_info (file, "-e")) { 111 unix (sprintf ("cat %s", file)) 112 } 113 else { 114 printf ("\n Macros available in file move.mac ($$Revision: 28 $$):") 115 printf ("\n ========\n") 116 printf ("\n mmv - move multiple motors at once") 117 printf ("\n ummv - multi-move showing updated positions") 118 printf ("\n mmvr - relative move of multiple motors at once") 119 printf ("\n ummvr - relative multi-move showing updated pos.") 120 printf ("\n mvhkl - like \'br\' but displays angles first") 121 printf ("\n umvhkl - like \'ubr\' but displays angles first") 122 printf ("\n rtw - reciprocal space tweak (like \'tw\')") 123 } 124 }' 125 126 127 128 #------------------------------------------------------------------------------ 129 #%+M* move/mmv 130 # ======== 131 # 132 # SUMMARY 133 # Multi-move command, moves multiple motors at once 134 # 135 # USAGE 136 # > mmv <mot1> <pos1> <mot2> <pos2> ... 137 # 138 # EXAMPLE 139 # > mmv del 10 nu 5 phi 90 140 #%- 141 142 def mmv '_mmv $*; move_poll' 143 # === 144 145 146 #------------------------------------------------------------------------------ 147 #%+M* move/ummv 148 # ========= 149 # 150 # SUMMARY 151 # Multi-move command, moves multiple motors at once and displays updated 152 # motor positions at regular intervals until move has finished. 153 # 154 # USAGE 155 # > ummv <mot1> <pos1> <mot2> <pos2> ... 156 # 157 # EXAMPLE 158 # > ummv del 10 nu 5 phi 90 159 #%- 160 161 def ummv '_mmv $*; uwmm $*' 162 # ==== 163 164 165 #------------------------------------------------------------------------------ 166 #%+M* move/mmvr 167 # ========= 168 # 169 # SUMMARY 170 # Relative multi-move command 171 # 172 # DESCRIPTION 173 # Moves multiple motors at once by a relative amount 174 # 175 # USAGE 176 # > mmvr <mot1> <dist1> <mot2> <dist2> ... 177 # 178 # EXAMPLE 179 # > mmvr del -1 nu -2 phi 3 180 #%- 181 182 def mmvr '_mmvr $*; move_poll' 183 # ==== 184 185 186 #------------------------------------------------------------------------------ 187 #%+M* move/ummvr 188 # ========== 189 # 190 # SUMMARY 191 # Relative multi-move command 192 # 193 # DESCRIPTION 194 # Moves multiple motors at once by a relative amount and displays updated 195 # motor positions at regular intervals until move has finished. 196 # 197 # USAGE 198 # > ummvr <mot1> <dist1> <mot2> <dist2> ... 199 # 200 # EXAMPLE 201 # > ummvr del -1 nu -2 phi 3 202 #%- 203 204 def ummvr '_mmvr $*; uwmm $*' 205 # ===== 206 207 208 #------------------------------------------------------------------------------ 209 #%+M* move/mvhkl 210 # ========== 211 # 212 # SUMMARY 213 # Reciprocal space move with user confirmation 214 # 215 # DESCRIPTION 216 # Modified version of br which displays the angle positions of the requested 217 # hkl-position first and asks for the users confirmation to move there before 218 # the movement is started. 219 # 220 # USAGE 221 # > mvhkl <H> <K> <L> 222 # 223 # EXAMPLE 224 # > mvhkl 3 1 2 225 #%- 226 227 def mvhkl '{ 228 # ===== 229 230 local old_A, possible, ok, s 231 232 getangles 233 old_A = A 234 235 if ($# != 3) { 236 print "\aUsage:" 237 print " mvhkl <H> <K> <L>" 238 exit 239 } 240 241 H = $1; K = $2; L = $3 242 243 # calcA returns 0 for success, -1 for unobtainable reflection 244 possible = !(-(calcA)) 245 246 if(possible) { 247 for (i=0;i<_numgeo;i++) { 248 s = motor_name(mA[i]) 249 printf ("%7s = %9.4f --> %9.4f\n", s, old_A[mA[i]], A[mA[i]]) 250 } 251 ok = yesno ("Move to these values? ", 1) 252 if (ok) { 253 br $1 $2 $3 254 } else{ 255 print "Move cancelled." 256 exit 257 } 258 } 259 }' 260 261 262 #------------------------------------------------------------------------------ 263 #%+M* move/umvhkl 264 # =========== 265 # 266 # SUMMARY 267 # updated reciprocal space move with user confirmation 268 # 269 # DESCRIPTION 270 # Modified version of ubr which displays the angle positions of the 271 # requested hkl-position first and asks for the users confirmation to move 272 # there before the movement is started. 273 # 274 # USAGE 275 # > umvhkl <H> <K> <L> 276 #%- 277 278 def umvhkl '{ 279 # ====== 280 281 local old_A, possible, ok, s 282 283 getangles 284 old_A = A 285 286 if ($# != 3) { 287 print "\aUsage:" 288 print " mvhkl <H> <K> <L>" 289 print " or mvhkl <H> <K> <L> auto" 290 exit 291 } 292 293 H = $1; K = $2; L = $3 294 295 # calcA returns 0 for success, -1 for unobtainable reflection 296 possible = !(-(calcA)) 297 298 if(possible) { 299 for (i=0;i<_numgeo;i++) { 300 s = motor_name(mA[i]) 301 printf ("%7s = %9.4f --> %9.4f\n", s, old_A[mA[i]], A[mA[i]]) 302 } 303 ok = yesno ("Move to these values? ", 1) 304 if (ok) { 305 ubr $1 $2 $3 306 } else { 307 print "Move cancelled." 308 exit 309 } 310 } 311 }' 312 313 314 #------------------------------------------------------------------------------ 315 #%+M* move/rtw 316 # ======== 317 # 318 # SUMMARY 319 # Reciprocal space tweak 320 # 321 # DESCRIPTION 322 # rtw works just like the normal tw command for individual motors, but tweaks 323 # in the reciprocal space coordinates H, K, L. 324 # 325 # USAGE 326 # > rtw <coord1> [<coord2> ...] <delta1> [<delta2> ...] [<count_time>] 327 # where <coordN> = "H", "K", or "L" 328 # 329 # EXAMPLE 330 # > rtw H K 0.1 0.2 331 # simultaneously tweaks H in steps of +0.1 and K in steps of +0.2 332 #%- 333 334 def rtw'{ 335 # ==== 336 337 local i, n, m[], dh, dk, dl, p[], t, ct, dir, d0, done, d[],c[],Q_mne[] 338 339 Q_mne[0] = "H" 340 Q_mne[1] = "K" 341 Q_mne[2] = "L" 342 343 n = split("$*", m) 344 if ((n < 2) || (n > 7)) { 345 print "Usage: rtw coord1 [coord2 ...] delta1 [delta2 ...] [count_time]" 346 print " where coord = H, K, or L" 347 exit 348 } 349 350 # check if count_time was given 351 if (n&1){ 352 ct = m[n-1] 353 } 354 355 n = int(n/2) 356 dh = 0; dk = 0; dl = 0; 357 for (i = 0; i < n; i++) { 358 if (m[i] == "h" || m[i] == "H"){ 359 d[i] = m[n+i] 360 c[i] = 0 361 dh = d[i] 362 } else if (m[i] == "k" || m[i] == "K"){ 363 d[i] = m[n+i] 364 c[i] = 1 365 dk = d[i] 366 } else if (m[i] == "l" || m[i] == "L"){ 367 d[i] = m[n+i] 368 c[i] = 2 369 dl = d[i] 370 } else{ 371 printf("Bad coordinate for tweak: %s.\n", m[i]) 372 exit 373 } 374 } 375 376 get_angles 377 rt = "get_angles; printf(\"\n\")\n" 378 for (i = 0; i < n; i++) { 379 p[i] = Q[c[i]] 380 rt = rt sprintf("printf(\"Tweaked %s from %g to %%g\n\",Q[%d])\n",\ 381 Q_mne[c[i]], p[i], c[i]) 382 } 383 cdef("cleanup_once", rt, "rtweak") 384 385 print "Indicate direction with + (or p) or - (or n) or enter" 386 print "new step size. Type something else (or ^C) to quit.\n\n" 387 388 t = "+" 389 dir = 1 390 for (;;) { 391 waitmove; get_angles; calcHKL 392 if (ct) { 393 if (!set_sim(-1) && _sleep) 394 do_sleep _sleep 395 count_em ct; 396 if (!TW_UPDATE) { 397 waitcount 398 done = 1 399 } else 400 done = 0 401 for (;;) { 402 get_counts 403 if (dh != 0){ 404 printf("H = %.4f ",H) 405 } 406 if (dk != 0){ 407 printf("K = %.4f ",K) 408 } 409 if (dl != 0){ 410 printf("L = %.4f ",L) 411 } 412 if (ct < 0) 413 printf("%s = %g, ", cnt_mne(sec), S[sec]) 414 else if (MON >= 0) 415 printf("%s = %g, ", cnt_mne(MON), S[MON]) 416 printf("%s = %g, ", cnt_mne(DET), S[det]) 417 tty_cntl("ce") 418 if (done) 419 break 420 sleep(UPDATE) 421 printf("\r") 422 done = !chk_count 423 } 424 } else { 425 if (dh != 0){ 426 printf("H = %.4f ",H) 427 } 428 if (dk != 0){ 429 printf("K = %.4f ",K) 430 } 431 if (dl != 0){ 432 printf("L = %.4f ",L) 433 } 434 } 435 436 if (TW_BEEP) beep 437 t = getval("which way", t) 438 if (t+0 != 0) { 439 d0 = fabs(t / d[0]) 440 for (i = 0; i < n; i++) 441 d[i] *= d0 442 t = t<0? "-":"+" 443 } 444 if (t == "+" || t == "p") 445 dir = 1 446 else if (t == "-" || t == "n") 447 dir = -1 448 else 449 break 450 for (i = 0; i < n; i++){ 451 Q[c[i]] += dir * d[i] 452 } 453 calcA 454 calcHKL 455 move_em 456 if (!TW_UPDATE) { 457 waitmove 458 } else for (done = 0;;) { 459 get_angles 460 for (i = 0; i < n; i++) 461 printf("%s = %.3f, ", Q_mne[c[i]], Q[c[i]]) 462 tty_cntl("ce") 463 printf("\r") 464 if (done) 465 break 466 sleep(UPDATE) 467 done = !chk_move 468 } 469 } 470 471 cdef("cleanup_once", "", "rtweak", "delete") 472 for (i = 0, rt = "\n"; i < n; i++) 473 rt = rt sprintf("Tweaked %s from %g to %g\n", \ 474 Q_mne[c[i]], p[i], Q[c[i]]) 475 printf(rt) 476 }' 477 478 479 #============================================================================== 480 # Internal macros 481 #============================================================================== 482 483 #------------------------------------------------------------------------------ 484 #%+iM* move/_mmv 485 # 486 # SUMMARY 487 # Low-level multi-move command 488 # 489 # DESCRIPTION 490 # This is the equivalent to the _mv command for single motor moves. 491 # 492 #%- 493 494 def _mmv '{ 495 # ==== 496 497 local _ntokens, _tokens 498 499 _ntokens = split("$*", _tokens) 500 501 if (_ntokens&1){ 502 eprint "Wrong number of arguments!" 503 eprint " Usage: (u)mmv <mot1> <pos1> <mot2> <pos2> ..." 504 exit 505 } 506 507 for(_ii=0; _ii<_ntokens; _ii=_ii+2){ 508 eval(sprintf("_check0 %s", _tokens[_ii])) 509 } 510 waitmove; get_angles; 511 for(_ii=0; _ii<_ntokens; _ii=_ii+2){ 512 if(motor_num(_tokens[_ii]) < 0) {exit} 513 A[motor_num(_tokens[_ii])] = _tokens[_ii+1] 514 } 515 ifp{ 516 fprintf(PRINTER,"\nmmv ") 517 for(_ii=0; _ii<_ntokens; _ii=_ii+2){ 518 fprintf(PRINTER,"%s %g", _tokens[_ii], A[motor_num(_tokens[_ii+1])]) 519 } 520 fprintf(PRINTER,"\n") 521 } 522 move_em 523 }' 524 525 526 #------------------------------------------------------------------------------ 527 #%+iM* move/_mmvr 528 # ========== 529 # 530 # SUMMARY 531 # Low-level relative multi-move command 532 # 533 # DESCRIPTION 534 # This is the equivalent to the _mvr command for single motor moves. 535 #%- 536 537 def _mmvr '{ 538 # ===== 539 540 local _ntokens, _tokens 541 542 _ntokens = split("$*", _tokens) 543 544 if (_ntokens&1){ 545 eprint "Wrong number of arguments!" 546 eprint " Usage: (u)mmvr <mot1> <dist1> <mot2> <dist2> ..." 547 exit 548 } 549 550 for(_ii=0; _ii<_ntokens; _ii=_ii+2){ 551 eval(sprintf("_check0 %s", _tokens[_ii])) 552 } 553 waitmove; get_angles; 554 for(_ii=0; _ii<_ntokens; _ii=_ii+2){ 555 if(motor_num(_tokens[_ii]) < 0) {exit} 556 A[motor_num(_tokens[_ii])] += _tokens[_ii+1] 557 } 558 ifp{ 559 fprintf(PRINTER,"\nmmv ") 560 for(_ii=0; _ii<_ntokens; _ii=_ii+2){ 561 fprintf(PRINTER,"%s %g", _tokens[_ii], A[motor_num(_tokens[_ii+1])]) 562 } 563 fprintf(PRINTER,"\n") 564 } 565 move_em 566 }' 567 568 569 #------------------------------------------------------------------------------ 570 #%+iM* move/uwmm 571 # ========= 572 # 573 # SUMMARY 574 # Low-level macro to show updated positions during motor movements. 575 # 576 # DESCRIPTION 577 # This is the equivalent to the uwm command for single motor moves. 578 #%- 579 580 def uwmm '{ 581 # ==== 582 583 local _ntokens, _tokens, _str 584 585 _ntokens = split("$*", _tokens) 586 587 if (_ntokens&1){ 588 eprint "Wrong number of arguments!" 589 eprint " Usage: uwmm <mot1> <pos1> <mot2> <pos2>...<motN> <posN>" 590 exit 591 } 592 593 _str = "" 594 for(_ii=0; _ii<_ntokens; _ii=_ii+2){ 595 _str += _tokens[_ii] 596 } 597 _update(_str) 598 }' 599 600 601 #============================================================================== 602 # End of $Id$ 603 #============================================================================== 3 # from ESRF (http://www.esrf.eu/blissdb/macros/getsource.py?macname=attributes.mac) 4 5 #%TITLE% ATTRIBUTES.MAC 6 #%NAME% ATTRIBUTES.MAC - TANGO attribute macro counters. 7 # 8 #%DESCRIPTION% 9 # The macro set offers the possibility to set-up a TANGO attribute 10 # as macro motor or as macro counter. 11 # Only read/write TANGO attributes can be used as macro motor. 12 # The macro motor controller defined is called "attr_mot" and 13 # The macro counter controller defined is called "attr_ct". 14 # 15 #%SETUP% 16 #Motor and Counter Device Configuration (Not CAMAC) 17 # ... 18 #SCALERS DEVICE ADDR <>MODE NUM <>TYPE 19 # YES POLL 1 Software Timer 20 # YES attr_c - 2 Macro Counter 21 # 22 # take care to set the NUM field to the good number of macro_counters you need. 23 # 24 #%EXAMPLE% 25 #%DL% 26 # 27 # 28 #%DT% attr_mot_setup tilt id14/eh3-motor/mono_tile/Position %DD% 29 # Set-up the TANGO attribute macro motor with the mnemonic "tilt" 30 # 31 #%DT% attr_ct_setup det id14/pindiode/eh3/Intensity %DD% 32 # Set-up the TANGO attribute macro counter with the mnemonic "det" 33 # 34 #%XDL% 35 # 36 #%END% 37 38 39 # General parameters for attributes macros. 40 global ATTR_PAR[] 41 #ATTR_PAR["tango_aware"] 42 ATTR_PAR["mot_error"] = "ATTR : WARNING, error on reading attribute macro motor." 43 ATTR_PAR["ct_error"] = "ATTR : WARNING, error on reading attribute macro counter." 44 45 46 # Macro-COUNTERS parameters. 47 global ATTR_CT 48 list_test ATTR_CT 49 # ATTR_CT[mne]["dev_name"] 50 # ATTR_CT[mne]["attr_name"] 51 52 53 # Macro-MOTORS parameters. 54 global ATTR_MOT 55 list_test ATTR_MOT 56 # ATTR_MOT[mne]["dev_name"] 57 # ATTR_MOT[mne]["attr_name"] 58 59 global ESRF_ERR 60 61 62 ###################################################################### 63 ############################## ############################# 64 ############################## General ############################# 65 ############################## ############################# 66 ###################################################################### 67 68 #%UU% 69 #%MDESC% 70 # Removes everythings about attributes.mac 71 def attr_unsetup '{ 72 unglobal ATTR_MOT 73 unglobal ATTR_CT 74 unglobal ATTR_PAR 75 76 # no cdef ? 77 }' 78 79 80 #%UU% 81 #%MDESC% 82 # Displays information about counters managed by attributes macros. 83 def attr_show '{ 84 attr_ct_show 85 print "" 86 attr_mot_show 87 }' 88 89 ###################################################################### 90 ########################## ########################## 91 ########################## Macro counters ########################## 92 ########################## ########################## 93 ###################################################################### 94 95 #%UU% <mne> <dev> <attribute> | <mne> <dev/attribute> 96 #%MDESC% 97 # Configures counter <mne> to read <attribute> of tango device <dev>. 98 # 99 # example: attr_ct_setup bpm2x id22eh2/bpmccd/1 X 100 # or attr_ct_setup bpm2x id22eh2/bpmccd/1/X 101 # 102 # example2: attr_ct_setup sstate sys/Database/2 State 103 # attr_ct_setup toto id22/refillsim/1/Refill_time 104 # 105 def attr_ct_setup '{ 106 global ATTR_PAR 107 global ATTR_CT 108 109 local _args_strings _mne _nbarg 110 111 _nbarg = $# 112 113 _mne = "$1" 114 115 list_test ATTR_CT 116 list_test ATTR_PAR 117 118 list_add(ATTR_CT, _mne) 119 120 # Checks if you spec version can use "tango_get". 121 # ??? what happens in case of an old SPEC ??? 122 # test on VERSION ??? 123 if (tango_io("sys/Database/2", "State") != -1){ 124 ATTR_PAR["tango_aware"] = 1 125 } 126 else { 127 ATTR_PAR["tango_aware"] = 0 128 } 129 130 # Parses arguments to extract device and attribute names. 131 # 2 or 3 arguments ? 132 if (_nbarg == 2){ 133 # print "2 parameters given." 134 _args_strings[0] = 0 135 split ("$2", _args_strings, "/") 136 137 list_setpar(ATTR_CT, _mne, "dev_name", \ 138 sprintf("%s/%s/%s", _args_strings[0], \ 139 _args_strings[1], _args_strings[2])) 140 141 list_setpar(ATTR_CT, _mne, "attr_name", _args_strings[3]) 142 } 143 else if (_nbarg == 3){ 144 # print "3 parameters given." 145 list_setpar(ATTR_CT, _mne, "dev_name", "$2") 146 list_setpar(ATTR_CT, _mne, "attr_name", "$3") 147 } 148 else { 149 print "error : $0 requires 2 or 3 arguments." 150 print "usage -> $0 <mne> <device> <attribute>" 151 print " or $0 <mne> <device/attribute>" 152 exit 153 } 154 155 # Informative message. 156 printf("Configuring counter ") 157 tty_cntl("md") 158 printf ("%s", "$1") 159 tty_cntl("me") 160 printf (" to reflect attribute ") 161 tty_cntl("md") 162 printf ("%s", ATTR_CT["$1"]["attr_name"]) 163 tty_cntl("me") 164 printf (" of device ") 165 tty_cntl("md") 166 printf ("%s", ATTR_CT["$1"]["dev_name"]) 167 tty_cntl("me") 168 print "." 169 170 if (cnt_num(_mne) < 0){ 171 printf("Warning: counter \"%s\" is not defined\n", _mne) 172 } 173 174 }' 175 176 #%UU% <mne> 177 #%MDESC% 178 # Removes reading of attribute linked to <mne> counter. 179 # ex: attr_ct_unsetup sstate 180 def attr_ct_unsetup '{ 181 local nb_param 182 183 nb_param =$# 184 185 if (nb_param < 1){ 186 print "usage : $0 <counter_mnemonic>" 187 } 188 else{ 189 list_remove(ATTR_CT, "$1") 190 } 191 }' 192 193 #%UU% 194 #%MDESC% 195 # Removes reading of all attributes. 196 def attr_ct_unsetup_all '{ 197 unglobal ATTR_CT 198 }' 199 200 201 #%UU% 202 #%MDESC% 203 # Displays informations about macro counters. 204 def attr_ct_show '{ 205 local _mne 206 207 print "-------=== macro counters ===------------" 208 print "mnemonic device attribute " 209 print "-----------------------------------------" 210 211 for (i=0; i< list_n(ATTR_CT); i++){ 212 _mne = ATTR_CT[i+1] 213 print ATTR_CT[i+1]" " ATTR_CT[_mne]["dev_name"]" "\ 214 ATTR_CT[_mne]["attr_name"] 215 } 216 print "-----------------------------------------" 217 218 }' 219 220 221 #%IU% 222 #%MDESC% 223 # Main function for macro counter. 224 def attr_ct_cmd(cntnum, what, p1, p2) '{ 225 global ATTR_CT 226 local _cntr _dev _attr 227 228 _cntr_mne = cnt_mne(cntnum) 229 230 # print "_cntr_mne=" _cntr_mne " \t what=" what 231 232 # "counts" read the attribute value as counter 233 # parameters: none 234 if (cntnum == ".."){ 235 # for key applying to all counters 236 #print "--" 237 } 238 else{ 239 if (what == "counts") { 240 # print "what == \"counts\"" 241 local _ans _num _dev _attr 242 243 # Tests if _cntr_mne is really an attr_ct macro counter. 244 if (list_check(ATTR_CT, _cntr_mne)){ 245 _dev = list_getpar(ATTR_CT, _cntr_mne, "dev_name") 246 _attr = list_getpar(ATTR_CT, _cntr_mne, "attr_name") 247 248 if(ATTR_PAR["tango_aware"]){ 249 250 _ans = tango_get(_dev, _attr) 251 252 if (TANGO_ERR){ 253 tty_cntl("md") 254 print "\n" ATTR_CT_ERROR " " _cntr_mne 255 printf ("TANGO_ERR_MSG = \"%s\" \n\n", TANGO_ERR) 256 print TANGO_ERR_STACK 257 tty_cntl("me") 258 exit 259 } 260 } 261 else{ 262 # print "esrf_io() VERSION" 263 # esrf_io version. 264 local _target 265 ESRF_ERR = -1 266 267 _target = _dev "/" _attr 268 _ans = esrf_io (_target, "DevRead") 269 270 if (ESRF_ERR) { 271 tty_cntl("md") 272 print "\n" ATTR_CT_ERROR " " _cntr_mne " <- " _target "\n" 273 print "\n" ESRF_ERR_MSG "\n\n" 274 tty_cntl("me") 275 } 276 } 277 278 return (_ans) 279 } 280 else{ 281 # print "Counter \"" _cntr_mne "\" not set up in ATTR_CT." 282 return (-1) 283 } 284 } 285 } 286 }' 287 288 289 # def ct '{ 290 # _cols = 0 291 # p "1" 292 # waitmove 293 # p "2" 294 # count_em $* 295 # p "3" 296 # rdef cleanup \' 297 # undef cleanup 298 # onp; show_cnts; offp 299 # user_handlecounts 300 # \' 301 # p "4" 302 # waitcount 303 # p "5" 304 # undef cleanup 305 # p "6" 306 # onp; show_cnts; offp 307 # p "7" 308 # user_handlecounts 309 # p "8" 310 # }' 311 # 312 # 374.CYRIL> ct 313 # 1 314 # 2 315 # what == "counts" 316 # what == "counts" 317 # 3 318 # 4 319 # what == "counts" 320 # what == "counts" 321 # 5 322 # 6 323 # what == "counts" 324 # what == "counts" 325 # 326 # Thu Jan 22 17:09:38 2009 327 # 328 # Seconds = 1.003 329 # Monitor = 0 (0/s) 330 # Detector = 0 (0/s) 331 # toto = -1 (-0.997009/s) 332 # sstate = 0 (0/s) 333 # 7 334 # 8 335 # 336 # 375.CYRIL> what == "counts" 337 # what == "counts" 338 # 339 # 340 # 375.CYRIL> 341 342 343 344 345 ###################################################################### 346 ########################### ########################### 347 ########################### Macro motors ########################### 348 ########################### ########################### 349 ###################################################################### 350 351 ##%UU% <mne> <dev> <attribute> | <mne> <dev/attribute> 352 #%MDESC% 353 # Configures counter <mne> to read <attribute> of tango device <dev>. 354 # 355 # example: attr_mot_setup at1 id22eh2/machin/1 X 356 # or attr_mot_setup at2 id22eh2/machin/1/X 357 # 358 # example 2 attr_mot_setup rft1 id22/refillsim/1 Refill_time 359 # or attr_mot_setup rft1 id22/refillsim/1/Refill_time 360 # 361 def attr_mot_setup '{ 362 local _fields _dev_name _nbarg 363 local _args_strings _mne 364 365 # Checks if you spec version can use "tango_put/tango_get". 366 # ??? what happens in case of an old SPEC ??? 367 # test on VERSION ??? 368 if (tango_io("sys/Database/2", "State") != -1){ 369 ATTR_PAR["tango_aware"] = 1 370 } 371 else { 372 ATTR_PAR["tango_aware"] = 0 373 } 374 375 _mne = "$1" 376 377 list_test ATTR_MOT 378 list_test ATTR_PAR 379 380 list_add(ATTR_MOT, _mne) 381 382 _nbarg = $# 383 384 385 # Parses arguments to extract device and attribute names. 386 # 2 or 3 arguments ? 387 if (_nbarg == 2){ 388 # print "2 parameters given." 389 _args_strings[0] = 0 390 split ("$2", _args_strings, "/") 391 392 list_setpar(ATTR_MOT, _mne, "dev_name", \ 393 sprintf("%s/%s/%s", _args_strings[0], \ 394 _args_strings[1], _args_strings[2])) 395 396 list_setpar(ATTR_MOT, _mne, "attr_name", _args_strings[3]) 397 } 398 else if (_nbarg == 3){ 399 # print "3 parameters given." 400 list_setpar(ATTR_MOT, _mne, "dev_name", "$2") 401 list_setpar(ATTR_MOT, _mne, "attr_name", "$3") 402 } 403 else { 404 print "error : $0 requires 2 or 3 arguments." 405 print "usage -> $0 <mne> <device> <attribute>" 406 print " or $0 <mne> <device/attribute>" 407 exit 408 } 409 410 411 # Informative message. 412 printf("Configuring macro motor ") 413 tty_cntl("md") 414 printf ("%s", "$1") 415 tty_cntl("me") 416 printf (" to reflect attribute ") 417 tty_cntl("md") 418 printf ("%s", ATTR_MOT["$1"]["attr_name"]) 419 tty_cntl("me") 420 printf (" of device ") 421 tty_cntl("md") 422 printf ("%s", ATTR_MOT["$1"]["dev_name"]) 423 tty_cntl("me") 424 print "." 425 426 if (motor_num(_mne) < 0){ 427 printf("Warning: motor \"%s\" is not defined\n", _mne) 428 } 429 }' 430 431 432 433 #%UU% <mne> 434 #%MDESC% 435 # Removes reading of attribute linked to <mne> motor. 436 # ex: attr_mot_unsetup at1 437 def attr_mot_unsetup '{ 438 local _nb_param 439 440 _nb_param =$# 441 442 if (_nb_param < 1){ 443 print "usage : $0 <motor_mnemonic>" 444 } 445 else{ 446 list_remove(ATTR_MOT, "$1") 447 } 448 }' 449 450 #%UU% 451 #%MDESC% 452 # Removes reading of all attributes. 453 def attr_mot_unsetup_all '{ 454 unglobal ATTR_MOT 455 }' 456 457 #%UU% 458 #%MDESC% 459 # Displays informations about attributes macro motors. 460 def attr_mot_show '{ 461 local _mne 462 463 print "--------==== macro motors ====-----------" 464 print "mnemonic device attribute " 465 print "-----------------------------------------" 466 467 for (i=0; i< list_n(ATTR_MOT); i++){ 468 _mne = ATTR_MOT[i+1] 469 print ATTR_MOT[i+1]" " ATTR_MOT[_mne]["dev_name"]" " \ 470 ATTR_MOT[_mne]["attr_name"] 471 } 472 print "-----------------------------------------" 473 474 }' 475 476 477 #%IU% 478 #%MDESC% 479 # 480 def attr_mot_cmd(motnum, what, p1, p2) '{ 481 482 local _mot_mne _dev _attr 483 484 _mot_mne = motor_mne(motnum) 485 486 # Tests if _mot_mne is really an attr_ macro motor. 487 if (list_check(ATTR_MOT, _mot_mne)){ 488 _dev = list_getpar(ATTR_MOT, _mot_mne, "dev_name") 489 _attr = list_getpar(ATTR_MOT, _mot_mne, "attr_name") 490 _target = _dev "/" _attr 491 } 492 else{ 493 # print "Motor \"" _mot_mne "\" not set up in ATTR_MOT." 494 return (-1) 495 } 496 497 498 499 if(motnum == ".."){ 500 # key applying to all motors 501 # print "--" 502 } 503 504 #------------------------------------- 505 # "position" must return dial position (in integer steps) 506 # parameters: none 507 if (what == "position") { 508 local _pos 509 510 if(ATTR_PAR["tango_aware"]){ 511 _pos = tango_get(_dev, _attr) 512 513 if (TANGO_ERR){ 514 tty_cntl("md") 515 print "\n" ATTR_MOT_ERROR " " _mot_mne " " _dev "/" _attr 516 printf ("TANGO_ERR_MSG = \"%s\" \n\n", TANGO_ERR) 517 print TANGO_ERR_STACK 518 tty_cntl("me") 519 exit 520 } 521 } 522 else{ 523 _pos = esrf_io (_target, "DevRead") 524 525 if (ESRF_ERR) { 526 tty_cntl("md") 527 print "\n" ATTR_MOT_ERROR " " _mot_mne " <- " _target "\n" 528 print "\n" ESRF_ERR_MSG "\n\n" 529 tty_cntl("me") 530 } 531 } 532 return (_pos) 533 } 534 535 #------------------------------------- 536 # "get_status" called during the motion, must return a bit mask 537 # bits meaning: 0 if motor idle 538 # 2 if motor moving 539 # 4 if negative limit on 540 # 8 if positive limit on 541 # parameters: none 542 if (what == "get_status"){ 543 local _state 544 local _ret 545 546 if(ATTR_PAR["tango_aware"]){ 547 _state = tango_io(_dev, "State") 548 549 if (TANGO_ERR){ 550 tty_cntl("md") 551 print "\n" ATTR_MOT_ERROR " " _mot_mne " " _dev "/" _attr 552 printf ("TANGO_ERR_MSG = \"%s\" \n\n", TANGO_ERR) 553 print TANGO_ERR_STACK 554 tty_cntl("me") 555 exit 556 } 557 } 558 else{ 559 ESRF_ERR = -1 560 _state = esrf_io (_target, "DevState") 561 562 if (ESRF_ERR){ 563 tty_cntl("md") 564 print "\n" MOT_ERROR " " _mot_mne "\n" 565 print "\n" ESRF_ERR_MSG"\n\n" 566 tty_cntl("me") 567 } 568 } 569 570 # 571 # DEVMOVING 572 # 573 if (_state == 9) { 574 _ret |= 2 575 return _ret 576 } 577 # 578 # DEVFAULT 579 # 580 if (_state == 23) { 581 local _status 582 583 print "" 584 585 if(ATTR_PAR["tango_aware"]){ 586 _status = tango_io(_dev, "DevStatus") 587 } 588 else{ 589 ESRF_ERR = -1 590 print esrf_io (_target, "DevStatus") 591 } 592 593 print "Status= " _status 594 595 print "" 596 return 0 597 } 598 599 return 0 600 } 601 602 #------------------------------------- 603 # "start_one" 604 # parameters: p2 is relative motion, p1 is absolute requested position 605 if (what == "start_one") { 606 if(ATTR_PAR["tango_aware"]){ 607 608 tango_put(_dev, _attr, p1) 609 610 if (TANGO_ERR){ 611 tty_cntl("md") 612 print "\n" ATTR_MOT_ERROR " " _mot_mne " " _dev "/" _attr 613 printf ("TANGO_ERR_MSG = \"%s\" \n\n", TANGO_ERR) 614 print TANGO_ERR_STACK 615 tty_cntl("me") 616 exit 617 } 618 } 619 else{ 620 ESRF_ERR = -1 621 622 esrf_io (_target, "DevWrite", p1) 623 if (ESRF_ERR) { 624 tty_cntl("md") 625 print "\n" MOT_ERROR " " _mot_mne "\n" 626 print "\n" ESRF_ERR_MSG"\n\n" 627 tty_cntl("me") 628 } 629 } 630 } 631 632 #------------------------------------- 633 # "set_position" called on "set_dial motor newpos" 634 # parameters: p1 is the new position (in steps) 635 # 636 if (what == "set_position") { 637 if(ATTR_PAR["tango_aware"]){ 638 tango_put(_dev, _attr, p1) 639 640 if (TANGO_ERR){ 641 tty_cntl("md") 642 print "\n" ATTR_MOT_ERROR " " _mot_mne " " _dev "/" _attr 643 printf ("TANGO_ERR_MSG = \"%s\" \n\n", TANGO_ERR) 644 print TANGO_ERR_STACK 645 tty_cntl("me") 646 exit 647 } 648 } 649 else{ 650 ESRF_ERR = -1 651 652 esrf_io (_target, "DevWrite", p1) 653 654 if (ESRF_ERR) { 655 tty_cntl("md") 656 print "\n" MOT_ERROR " " _mot_mne "\n" 657 print "\n" ESRF_ERR_MSG"\n\n" 658 tty_cntl("me") 659 } 660 } 661 } 662 663 #------------------------------------- 664 # "abort_one" called on <Ctrl-C> 665 # 666 if (what == "abort_one") { 667 if(ATTR_PAR["tango_aware"]){ 668 tango_put(_dev, "DevAbort") 669 670 if (TANGO_ERR){ 671 tty_cntl("md") 672 print "\n" ATTR_MOT_ERROR " " _mot_mne " " _dev "/" _attr 673 printf ("TANGO_ERR_MSG = \"%s\" \n\n", TANGO_ERR) 674 print TANGO_ERR_STACK 675 tty_cntl("me") 676 exit 677 } 678 } 679 else{ 680 ESRF_ERR = -1 681 esrf_io (_target, "DevAbort") 682 if (ESRF_ERR) { 683 tty_cntl("md") 684 print "\n" MOT_ERROR " " _mot_mne "\n" 685 print "\n" ESRF_ERR_MSG"\n\n" 686 tty_cntl("me") 687 } 688 } 689 } 690 }' 691 692 693 #%MACROS% 694 #%IMACROS% 695 #%AUTHOR% 696 -
specdomain/src/test/test_doc.rst
- Property svn:eol-style set to native
- Property svn:keywords set to Id
r899 r902 1 .. $Id$ 2 1 3 =============== 2 4 Acceptance Test … … 43 45 ================================ 44 46 47 .. note:: What should this look like? 48 45 49 Test references to ``specdomain`` objects at the global level: 46 50 … … 51 55 Single Module 'test_module' 52 56 =========================== 57 58 .. note:: What should this look like? 53 59 54 60 Test references to ``specdomain`` objects on an individual basis using inline code: … … 122 128 123 129 :spec:record:`test_module:#user_address` 130
Note: See TracChangeset
for help on using the changeset viewer.