def updateState():

  if (config.DEBUG):
      print "Attempt UpdateStateLock acquired"
  UpdateStateLock.acquire()
  if (config.DEBUG):
      print "UpdateStateLock acquired"


  # catch Exceptions and MAKE SURE THE LOCK is released!
  try:
    if (state.SGS_State == state.SGS_States.Monitor):  
            state.SGS_State =state.SGS_States.Sampling
            if (config.USEBLYNK):
                updateBlynk.blynkStatusUpdate()
	    if (config.DEBUG):
            	print "----------------- "
            	print "Update State"
            	print "----------------- "
            if (config.Sunlight_Present == True):
        			if (config.DEBUG):
                                	print " Sunlight Vi/state.Sunlight_IR/UV Sensor"
            else:
        			if (config.DEBUG):
                                	print " Sunlight Vi/state.Sunlight_IR/UV Sensor Not Present"
            if (config.DEBUG):
            	print "----------------- "
    
            if (config.Sunlight_Present == True):
                    ################
                    state.Sunlight_Vis = SI1145Lux.SI1145_VIS_to_Lux(Sunlight_Sensor.readVisible())
                    state.Sunlight_IR = SI1145Lux.SI1145_IR_to_Lux(Sunlight_Sensor.readIR())
                    state.Sunlight_UV = Sunlight_Sensor.readUV()
                    state.Sunlight_UVIndex = state.Sunlight_UV / 100.0

            	    if (config.DEBUG):
                    	print 'Sunlight Visible:  ' + str(state.Sunlight_Vis)
                    	print 'Sunlight state.Sunlight_IR:       ' + str(state.Sunlight_IR)
                    	print 'Sunlight UV Index (RAW): ' + str(state.Sunlight_UV)
                    	print 'Sunlight UV Index: ' + str(state.Sunlight_UVIndex)
                    ################
    
    
            if (config.ADS1115_Present):
                state.Moisture_Humidity  = extendedPlants.readExtendedMoisture(1, None, ads1115, None, None) 
                state.Moisture_Humidity_Array[0] =  state.Moisture_Humidity 

                for i in range(2,config.plant_number+1):     
                    state.Moisture_Humidity_Array[i-1] = extendedPlants.readExtendedMoisture(i,GDE_Ext1, ads1115_ext1, GDE_Ext2, ads1115_ext2)

                if (config.DEBUG):
                    print ("From Moisture Array")
                    for i in range(0,config.plant_number):     
                        print "plant #%i: Moisture: %0.2f" % (i+1, state.Moisture_Humidity_Array[i])
                    print ("From RAW Moisture Array")
                    for i in range(0,config.plant_number):     
                        print "plant #%i: Moisture: %0.2f" % (i+1, state.Raw_Moisture_Humidity_Array[i])

                state.AirQuality_Sensor_Value =  AirQualitySensorLibrary.readAirQualitySensor(ads1115)
    
                sensorList = AirQualitySensorLibrary.interpretAirQualitySensor(state.AirQuality_Sensor_Value)
            	if (config.DEBUG):
                	print "Sensor Value=%i --> %s  | %i"% (state.AirQuality_Sensor_Value, sensorList[0], sensorList[1])

                state.AirQuality_Sensor_Number = sensorList[1] 
                state.AirQuality_Sensor_Text = sensorList[0] 

            # update water Level
            percentFull = ultrasonicRanger.returnPercentFull()
            # check for abort
            if (percentFull < 0.0):
                if (config.DEBUG):
                    print "---->Bad Measurement from Ultrasonic Sensor for Tank Level"
                # leave the previous value
            else:
                state.Tank_Percentage_Full = percentFull
        
            if (state.Tank_Percentage_Full > config.Tank_Pump_Level):
                state.Pump_Water_Full = True
            else:
                state.Pump_Water_Full = False

            # read temp humidity
   
            if (config.hdc1000_Present):
                state.Temperature= hdc1000.readTemperature()
                state.Humidity = hdc1000.readHumidity()
    
           	if (config.DEBUG):
            		print 'Temp             = {0:0.3f} deg C'.format(state.Temperature)
            		print 'Humidity         = {0:0.2f} %'.format(state.Humidity)
    
            state.SGS_State =state.SGS_States.Monitor
            if (config.USEBLYNK):
                updateBlynk.blynkStatusUpdate()

            if (config.USE_MQTT):
                try:
                    updateMqtt.updateMqtt(
                        moisture=state.Moisture_Humidity,
                        temperature=util.returnTemperatureCF(state.Temperature),
                        humidity=state.Humidity,
                        air_quality=state.AirQuality_Sensor_Value,
                        light=state.Sunlight_Vis
                    )
                except Exception as e:
                    print('Could not publish to MQTT: ' + e.message)
          

            if (config.OLED_Present) and (state.SGS_State == state.SGS_States.Monitor) :


                    if (config.DEBUG):
                          print "Attempt OLEDLock acquired"
		    OLEDLock.acquire()
                    if (config.DEBUG):
                          print "OLEDLock acquired"
                    Scroll_SSD1306.addLineOLED(display,  ("----------"))
                    Scroll_SSD1306.addLineOLED(display,  ("Plant #1 Moisture = \t%0.2f %%")%(state.Moisture_Humidity))
                    Scroll_SSD1306.addLineOLED(display,  ("Temperature = \t%0.2f %s")%(util.returnTemperatureCF(state.Temperature), util.returnTemperatureCFUnit()))
                    Scroll_SSD1306.addLineOLED(display,  ("Humidity =\t%0.2f %%")%(state.Humidity))
                    Scroll_SSD1306.addLineOLED(display,  ("Air Qual = %d/%s")%(state.AirQuality_Sensor_Value, state.AirQuality_Sensor_Text))
                    Scroll_SSD1306.addLineOLED(display,  ("Sunlight = \t%0.2f Lux")%(state.Sunlight_Vis))
                    # Now display other plants
                    if (config.plant_number >1):
                        # print 2-4
                        time.sleep(2.0)
                        Scroll_SSD1306.addLineOLED(display,  ("----------"))
                        Scroll_SSD1306.addLineOLED(display,  ("Plant #2 Moisture = \t%0.2f %%")%(state.Moisture_Humidity_Array[1]))
                        Scroll_SSD1306.addLineOLED(display,  ("Plant #3 Moisture = \t%0.2f %%")%(state.Moisture_Humidity_Array[2]))
                        Scroll_SSD1306.addLineOLED(display,  ("Plant #4 Moisture = \t%0.2f %%")%(state.Moisture_Humidity_Array[3]))
                        Scroll_SSD1306.addLineOLED(display,  ("Plant #5 Moisture = \t%0.2f %%")%(state.Moisture_Humidity_Array[4]))
                        if (config.plant_number >5):
                            time.sleep(2.0)
                            Scroll_SSD1306.addLineOLED(display,  ("----------"))
                            Scroll_SSD1306.addLineOLED(display,  ("Plant #6 Moisture = \t%0.2f %%")%(state.Moisture_Humidity_Array[5]))
                            Scroll_SSD1306.addLineOLED(display,  ("Plant #7 Moisture = \t%0.2f %%")%(state.Moisture_Humidity_Array[6]))
                            Scroll_SSD1306.addLineOLED(display,  ("Plant #8 Moisture = \t%0.2f %%")%(state.Moisture_Humidity_Array[7]))
                            Scroll_SSD1306.addLineOLED(display,  ("Plant #9 Moisture = \t%0.2f %%")%(state.Moisture_Humidity_Array[8]))
                        
                    if (config.DEBUG):
                        print "Attempt OLEDLock released"
		    OLEDLock.release()
                    if (config.DEBUG):
 
                        print "OLEDLock released"

  except Exception as e:
    if (config.DEBUG):
        print "Exception Raised in Update State"
    print e 
    traceback.print_exc(file=sys.stdout)
  finally:
    pass 
  if (config.DEBUG):
    print "Attempt UpdateStateLock released"
  UpdateStateLock.release()
  if (config.DEBUG):
          print "UpdateStateLock released"
          print ">>>>>>>>>>>>>>"
          print "Exiting Update State"
          print ">>>>>>>>>>>>>>"

  if (config.USEBLYNK):
     updateBlynk.blynkStateUpdate()
    print returnStatusLine("GPIO Extender 1",config.GroveDigital_Ext1_Present)
    print returnStatusLine("GPIO Extender 2",config.GroveDigital_Ext2_Present)
    print


    print "----------------------"
    print "Future Smart Garden System Expansions"
    print "----------------------"
    print returnStatusLine("SunAirPlus",config.SunAirPlus_Present)
    print returnStatusLine("Lightning Mode",config.Lightning_Mode)
    print returnStatusLine("Solar Power Mode",config.SolarPower_Mode)

    print returnStatusLine("MySQL Logging Mode",config.enable_MySQL_Logging)
    print
    print "----------------------"
    value = extendedPlants.readExtendedMoisture(1, None, ads1115, None, None)
    if (value <= state.Alarm_Moisture_Sensor_Fault):
    	 print "Moisture Sensor Fault:   Not In Plant or not Present. Value %0.2f%%" % value 
    else:
    	print returnStatusLine("Moisture Sensor",True)
    print "----------------------"



    scheduler = BackgroundScheduler()

    '''
    ##############
    # state persistance
    # if pickle file present, read it in
    ##############