548 def handle(self, command):
549 if len(command) != 16 and (
550 len(command) != 7 and self.state != self.State.S2
551 ):
552
553
554
555 raise RuntimeError("invalid Omicron Deepstar command")
556 elif command[-2:] != b"\r\n":
557
558
559 raise RuntimeError("command does not end in '\\r\\n'")
560
561 command = command[:-2].rstrip(b" ")
562 answer = None
563
564 if command == b"S?":
565 answer = self.state.name.encode()
566 elif command == b"STAT0":
567
568 answer = (
569 b"MC"
570 + b" 488"
571 + b" "
572 + b" %3d" % (self.max_power)
573 + b" TA "
574 )
575 elif command == b"STAT1":
576 answer = (
577 b"SL"
578 + b" 6AB"
579 + b" 600"
580 + b" 868"
581 + b" T249"
582 + b" V117"
583 )
584 elif command == b"STAT2":
585 answer = (
586 b"R111"
587 + b" N02"
588 + b" SNP131056"
589 + b" SNC131056"
590 + b" WH 04667"
591 + b" SLS B9C 500"
592 )
593 elif command == b"STAT3":
594
595 answer = (
596 b"OC "
597 + b"AS1"
598 + b"TH0"
599 + b"AP0"
600 + b"FK0"
601 + b"AC0"
602 + b"AM0"
603 + b"SU0"
604 + b"CO0"
605 + b"FO0"
606 + b"MO0"
607 + b"US0"
608 + b"LA1"
609 + b"FA0"
610 )
611
612
613 elif command in self.command2mode.keys():
614 if self.state == self.State.S2:
615 self.mode = self.command2mode[command]
616 answer = b">"
617 else:
618 answer = b"UK"
619
620
621 elif command == b"L?":
622 if self.state == self.State.S2:
623 answer = self.mode2answer[self.mode]
624 else:
625 answer = b"UK"
626
627
628 elif command == b"LON":
629 if self.state == self.State.S1:
630 self.state = self.State.S2
631 answer = b"LONOK"
632 elif self.mode == self.Mode.S2:
633 answer = b"UK"
634 else:
635
636
637 answer = b"INT"
638
639
640 elif command == b"LF":
641 if self.state == self.State.S2:
642 self.state = self.State.S1
643 answer = b"LOFFOK"
644 else:
645 answer = b"UK"
646
647
648 elif command.startswith(b"PP"):
649
650
651
652
653 if command == b"PP?":
654 level = self.power / self.max_power
655 answer = b"PP%03X" % round(float(0xFFF) * level)
656 elif len(command) == 5:
657 level = int(command[2:], 16) / float(0xFFF)
658 self.power = level * self.max_power
659 answer = command
660 else:
661 raise RuntimeError("invalid command '%'" % command)
662
663
664 elif command == b"P?":
665
666
667
668
669
670
671
672
673 level = self.power / self.max_power
674 answer = b"P%04X" % round(float(0xCCC) * level)
675
676
677 elif command == b"IPO":
678 self.internal_peak_power = True
679 answer = command
680 elif command == b"IPF":
681 self.internal_peak_power = False
682 answer = command
683 elif command == b"IP?":
684 answer = b"IPO" if self.internal_peak_power else b"IPF"
685
686
687
688 elif command == b"A2DO":
689 self.analog2digital = True
690 answer = b"A2D ON"
691 elif command == b"A2DF":
692 self.analog2digital = False
693 answer = b"A2D OFF"
694 elif command == b"A2D?":
695 answer = b"A2D ON" if self.analog2digital else b"A2D OFF"
696
697
698 elif command == b"MF":
699 self.bias_modulation = False
700 self.digital_modulation = False
701 answer = command
702 elif command == b"MO1":
703 self.bias_modulation = True
704 self.digital_modulation = False
705 answer = command
706 elif command == b"MO2":
707 self.bias_modulation = False
708 self.digital_modulation = True
709 answer = command
710 elif command == b"MO3":
711 self.bias_modulation = True
712 self.digital_modulation = True
713 answer = command
714
715 else:
716 raise NotImplementedError(
717 "no handling for command '%s'" % command.decode("utf-8")
718 )
719
720 self.in_buffer.write(answer + self.eol)