docs: def run(self):
          """Run the core loop of reading and writing configurations.
  
          This is where all the roaster magic occurs. On the initial run, we
          prime the roaster with some data to wake it up. Once awoke, we check
          our shared queue to identify if the user has passed any updated
          configuration. Once checked, start to read and write to the Hottop
          roaster as long as the exit signal has not been set. All steps are
          repeated after waiting for a specific time interval.
  
          There are also specialized routines built into this function that are
          controlled via events. These events are unique to the roasting process
          and pre-configure the system with a configuration, so the user doesn't
          need to do it themselves.
  
          :returns: None
          """
          self._wake_up()
  
          while not self._q.empty():
              self._config = self._q.get()
  
          while not self.exit.is_set():
              settings = self._read_settings()
              settings['valid'] = self._valid_config(settings)
              self._cb(settings)
  
              if self.cooldown.is_set():
                  self._log.debug("Cool down process triggered")
                  self._config['drum_motor'] = 1
                  self._config['heater'] = 0
                  self._config['solenoid'] = 1
                  self._config['cooling_motor'] = 1
                  self._config['main_fan'] = 10
  
              if settings['valid']:
                  self._log.debug("Settings were valid, sending...")
                  self._send_config()
              time.sleep(self._config['interval'])