663 def __call__(self, *args):
664 """Parse arguments, allocate any required storage, and execute the call."""
665
666 c_args = []
667 i = 0
668 ret = []
669
670 if self.buf_size_arg_pos >= 0:
671 try:
672 bs = args[self.buf_size_arg_pos]
673 except:
674 bs = 255
675 else:
676 bs = 255
677
678 i = 0
679 for farg in self.fargs:
680 if isinstance(farg, OUTPUT):
681 if isinstance(farg, OUTARR):
682 size = args[self.arr_size_arg_pos]
683 else:
684 size = bs
685 r, c_arg = farg.getVar(size)
686 c_args.append(c_arg)
687 ret.append(r)
688 elif isinstance(farg, _OUTSTRLEN):
689 c_args.append(bs)
690 elif isinstance(args[i], Enum):
691 c_args.append(args[i].value)
692 i += 1
693 else:
694 c_args.append(args[i])
695 i += 1
696
697
698 status = DRV_ERROR_ACK
699 ack_err_count = -1
700 while status == DRV_ERROR_ACK and ack_err_count < 3:
701 ack_err_count += 1
702 status = self.f(*c_args)
703 ret = [extract_value(r) for r in ret]
704 if len(ret) == 1:
705 ret = ret[0]
706 elif len(ret) == 0:
707 ret = None
708
709
710 if self.rstatus:
711 if status == DRV_SUCCESS:
712 return True
713 elif status in [
714 DRV_INVALID_AMPLIFIER,
715 DRV_INVALID_MODE,
716 DRV_INVALID_COUNTCONVERT_MODE,
717 DRV_INVALID_FILTER,
718 ]:
719 return False
720 elif status in [
721 DRV_TEMP_OFF,
722 DRV_TEMP_STABILIZED,
723 DRV_TEMP_NOT_REACHED,
724 DRV_TEMP_DRIFT,
725 DRV_TEMP_NOT_STABILIZED,
726 ]:
727 return (status, ret)
728 else:
729 raise AtmcdException(status)
730
731 if not status == DRV_SUCCESS:
732 raise AtmcdException(status)
733 return ret
734
735