def configure(self):
        ## Record initial state or set initial value
        ## NOTE:
        ## Subclasses should call this function only _after_ making any changes that will affect the mapping between
        ## physical values and channel voltages.

        prof = Profiler('DAQGenericTask.configure', disabled=True)
        # self.daqTasks = {}
        self.mapping = self.dev.getMapping(chans=list(
            self._DAQCmd.keys()))  ## remember the mapping so we can properly translate data after it has been returned

        self.initialState = {}
        self.holdingVals = {}
        for ch in self._DAQCmd:
            # dev = self.dev.dm.getDevice(self.dev._DGConfig[ch]['channel'][0])
            dev = self.dev.dm.getDevice(self.dev.getDAQName(ch))
            prof.mark(ch + ' get dev')
            if 'preset' in self._DAQCmd[ch]:
                with self.dev._DGLock:
                    daqChan = self.dev._DGConfig[ch]['channel']
                # dev.setChannelValue(self.dev._DGConfig[ch]['channel'][1], self._DAQCmd[ch]['preset'])
                preVal = self.mapping.mapToDaq(ch, self._DAQCmd[ch]['preset'])
                dev.setChannelValue(daqChan, preVal)
                prof.mark(ch + ' preset')
            elif 'holding' in self._DAQCmd[ch]:
                self.dev.setChanHolding(ch, self._DAQCmd[ch]['holding'])
                prof.mark(ch + ' set holding')
            if 'recordInit' in self._DAQCmd[ch] and self._DAQCmd[ch]['recordInit']:
                self.initialState[ch] = self.dev.getChannelValue(ch)
                prof.mark(ch + ' record init')
        for ch in self.dev._DGConfig:
            ## record current holding value for all output channels (even those that were not buffered for this task)
            with self.dev._DGLock:
                chanType = self.dev._DGConfig[ch]['type']
            if chanType in ['ao', 'do']:
                self.holdingVals[ch] = self.dev.getChanHolding(ch)
                prof.mark(ch + ' record holding')
        prof.finish()