Ejemplo n.º 1
0
def make_frame(cmd, addr, data=""):
    """Pack the info in the format it likes"""
    ts = struct.pack(">BHB", ord(cmd), addr, 8)
    if data == "":
        return ts
    else:
        if len(data) == 8:
            return ts + data
        else:
            raise errors.InvalidValueError("Data length of unexpected length")
Ejemplo n.º 2
0
    def set_memory(self, mem):
        _mem, _nam = self._get_memobjs(mem.number)

        if mem.empty:
            if _nam is None:
                raise errors.InvalidValueError("VFO channels can not be empty")
            _mem.set_raw("\xFF" * 16)
            return

        if _mem.get_raw() == ("\xFF" * 16):
            _mem.set_raw("\x00" * 13 + "\xFF" * 3)

        _mem.freq = mem.freq / 10

        if mem.duplex == "off":
            _mem.duplex = DUPLEX.index("-")
            _mem.offset = _mem.freq
        elif mem.duplex == "split":
            diff = mem.offset - mem.freq
            _mem.duplex = DUPLEX.index("-") if diff < 0 else DUPLEX.index("+")
            _mem.offset = abs(diff) / 10
        else:
            _mem.offset = mem.offset / 10
            _mem.duplex = DUPLEX.index(mem.duplex)

        tx, rx = chirp_common.split_tone_encode(mem)
        self._encode_tone(_mem, 'tx', *tx)
        self._encode_tone(_mem, 'rx', *rx)

        _mem.isnarrow = mem.mode == "NFM"
        _mem.scanadd = mem.skip == ""
        _mem.highpower = mem.power == POWER_LEVELS[1]

        if _nam:
            for i in range(0, 5):
                try:
                    _nam[i] = CHARSET.index(mem.name[i])
                except IndexError:
                    _nam[i] = 0xFF

        for setting in mem.extra:
            setattr(_mem, setting.get_name(), setting.value)
Ejemplo n.º 3
0
    def get_memory(self, number):
        if isinstance(number, str):
            try:
                number = IC9X_SPECIAL[self.vfo][number]
            except KeyError:
                raise errors.InvalidMemoryLocation("Unknown channel %s" %
                                                   number)

        if number < -2 or number > 999:
            raise errors.InvalidValueError("Number must be between 0 and 999")

        if number in self.__memcache:
            return self.__memcache[number]

        self._lock.acquire()
        try:
            self._maybe_send_magic()
            mem = ic9x_ll.get_memory(self.pipe, self.vfo, number)
        except errors.InvalidMemoryLocation:
            mem = chirp_common.Memory()
            mem.number = number
            if number < self._upper:
                mem.empty = True
        except:
            self._lock.release()
            raise

        self._lock.release()

        if number > self._upper or number < 0:
            mem.extd_number = util.get_dict_rev(IC9X_SPECIAL,
                                                [self.vfo][number])
            mem.immutable = [
                "number", "skip", "bank", "bank_index", "extd_number"
            ]

        self.__memcache[mem.number] = mem

        return mem
Ejemplo n.º 4
0
    def set_settings(self, settings):
        """Translate the settings in the UI into bit in the mem_struct
        I don't understand well the method used in many drivers
        so, I used mine, ugly but works ok"""
        def _get_shift(obj):
            """Get the amount of offset in the memmap"""
            shift = 0
            sf = str(obj.settings.vfo_shift)
            if sf[0] != "\xFF":
                shift = int(mobj.settings.vfo_shift) * 10
            return shift

        def _get_vrx(obj):
            """Get the vfo rx freq"""
            return int(obj.vfo.vrx_freq) * 10

        def _update_vtx(o, rx, offset):
            """Update the Vfo TX mem from the value of rx & the offset"""
            # check the shift sign
            plus = bool(getattr(o, "shift_plus"))
            minus = bool(getattr(o, "shift_minus"))

            if plus:
                o.vtx_freq = (rx + offset) / 10
            elif minus:
                o.vtx_freq = (rx - offset) / 10
            else:
                o.vtx_freq = rx / 10

        mobj = self._memobj
        flag = False
        for element in settings:
            if not isinstance(element, RadioSetting):
                self.set_settings(element)
                continue

            # Let's roll the ball
            if "." in element.get_name():
                # real properties, more or less mapeable
                inter, setting = element.get_name().split(".")
                obj = getattr(mobj, inter)
                value = element.value

                # test on this cases .......
                if setting in ["sql", "tot", "powerrank", "active_ch",
                        "ani_mode"]:
                    value = int(value)

                # test on this cases .......
                if setting in ["lamp", "lamp_auto", "bs", "warning",
                        "monitor"]:
                    value = bool(value)
                    # warning and bs have a sister setting in LCD
                    if setting == "warning" or setting == "bs":
                        # aditional setting
                        setattr(obj, setting + "1", value)

                    # monitorval: monitor = 0 > monitorval = 0
                    # monitorval: monitor = 1 > monitorval = x30
                    if setting == "monitor":
                        # sister setting in LCD
                        if value:
                            setattr(obj, "monitorval", 0x30)
                        else:
                            setattr(obj, "monitorval", 0)

                # case power
                if setting == "power":
                    value = str(value) == "High" and True or False

                # case key
                # key => auto = 0, manu = 1
                if setting == "key":
                    value = str(value) == "Manual" and True or False

                # case bandwidth
                # bw: 0 = nar, 1 = Wide & must equal bw1
                if setting == "bw":
                    value = str(value) == "Wide" and True or False
                    # sister attr
                    setattr(obj, "bw1", value)

                # work mem wmem/wvfo
                if setting == "wmem":
                    if str(value) == "Memory":
                        value = True
                        # sister attr
                        setattr(obj, "wvfo", not value)
                    else:
                        value = False
                        # sister attr
                        setattr(obj, "wvfo", not value)

                # case step
                # STEPF = ["5", "10", "6.25", "12.5", "25"]
                if setting == "step":
                    value = STEPF.index(str(value))

                # case vrx_freq
                if setting == "vrx_freq":
                    value = chirp_common.parse_freq(str(value)) / 10
                    # you must calculate the apropiate txfreq from
                    # shift and offset
                    shift = _get_shift(mobj)
                    # update the tx vfo freq
                    _update_vtx(obj, value * 10, shift)

                # vfo_shift = offset
                if setting == "vfo_shift":
                    value = chirp_common.parse_freq(str(value)) / 10
                    # you must calculate the apropiate txfreq from
                    # shift and offset
                    # get vfo rx
                    vrx = _get_vrx(mobj)
                    # update the tx vfo freq
                    _update_vtx(mobj.vfo, vrx, value * 10)

                # at least for FD-268A/B it doesn't work as stated, so disabled
                # by now, does this work on the fd-288s?

                ## case scramble & busy_lock
                #if setting == "scramble" or setting == "busy_lock":
                    #value = bool(ONOFF.index(str(value)))

                # ani value, only for FD-288
                if setting == "ani":
                    if "FD-268" in self.MODEL:
                        # 268 doesn't have ani setting
                        continue
                    else:
                        # 288 models, validate the input [200-999] | ""
                        # we will left adjust and zero pad to avoid errors
                        # between inputs in the UI
                        value = str(value).strip().ljust(3, "0")
                        value = int(value)
                        if value == 0:
                            value = 200
                        else:
                            if value > 999 or value < 200:
                                raise errors.InvalidValueError(
                                    "The ANI value must be between \
                                    200 and 999, not %03i" % value)

                        value = str(value)

            else:
                # Others that are artifact for real values, not than mapeables
                # selecting the values to work
                setting = str(element.get_name())
                value = str(element.value)

                # vfo_shift
                if setting == "shift":
                    # get shift
                    offset = _get_shift(mobj)
                    # get vfo rx
                    vrx = _get_vrx(mobj)

                    # VSHIFT = ["None", "-", "+"]
                    if value == "+":
                        mobj.vfo.shift_plus = True
                        mobj.vfo.shift_minus = False
                    elif value == "-":
                        mobj.vfo.shift_plus = False
                        mobj.vfo.shift_minus = True
                    else:
                        mobj.vfo.shift_plus = False
                        mobj.vfo.shift_minus = False

                    # update the tx vfo freq
                    _update_vtx(mobj.vfo, vrx, offset)

            if setting != "shift":
                setattr(obj, setting, value)