from operator import itemgetter

from artiq.experiment import *


class DDSSetter(EnvExperiment):
    """DDS Setter"""
    def build(self):
        self.setattr_device("core")

        self.dds = dict()

        device_db = self.get_device_db()
        for k, v in sorted(device_db.items(), key=itemgetter(0)):
            if (isinstance(v, dict)
                    and v["type"] == "local"
                    and v["module"] == "artiq.coredevice.ad9914"
                    and v["class"] == "AD9914"):
                self.dds[k] = {
                    "driver": self.get_device(k),
                    "frequency": self.get_argument(
                        "{}_frequency".format(k),
                        NumberValue(100e6, scale=1e6, unit="MHz", precision=6))
                }

    @kernel
    def set_dds(self, dds, frequency):
        self.core.break_realtime()
        dds.set(frequency)
        delay(200*ms)

    def run(self):
        for k, v in self.dds.items():
            self.set_dds(v["driver"], v["frequency"])
