import time, system, gc
import rgb, consts, default_icons
import mpu6050

# Constants
N_MEASUREMENTS = 20
TEMP_FAILURE_VALUE = 36.53
ERROR_SLEEP_TIME = 6  # Time in seconds before retrying on error
INFO_FIRMWARE_THRESHOLD = 21
TEMP_ADJUSTMENT = 2.5  # Degrees to subtract from the measured temperature

# Initial setup check
def check_firmware():
    if int(consts.INFO_FIRMWARE_BUILD) < INFO_FIRMWARE_THRESHOLD:
        rgb.scrolltext('Newer firmware needed')
        time.sleep(8)
        system.reboot()

def check_sensor():
    if not mpu6050.has_sensor():
        rgb.scrolltext('Addon required')
        time.sleep(ERROR_SLEEP_TIME)
        system.reboot()

def get_measurements():
    measurements = []
    for _ in range(N_MEASUREMENTS):
        try:
            measurement = mpu6050.get_temp()
            if measurement == TEMP_FAILURE_VALUE:
                mpu6050.init()  # Reinitialize in case of failure
                raise OSError('Probably bad result')
            measurements.append(measurement)
            time.sleep(0.1)
        except OSError:
            continue
    return measurements

def noisy_average(measurements):
    if len(measurements) < 5:
        return 0.0
    sorted_measurements = sorted(measurements)
    total = sum(sorted_measurements[2:-2])  # Exclude outliers (2 on each side)
    return total / (len(sorted_measurements) - 4)

def display_temperature(average_temp):
    adjusted_temp = average_temp - TEMP_ADJUSTMENT  # Adjust temperature by -2.5 degrees
    rgb.clear()
    rgb.text('%.1f' % adjusted_temp, pos=(1, 1))
    rgb.text('C', pos=(26, 1))

# Check firmware version and sensor availability
check_firmware()
check_sensor()

# Display loading animation
data, size, frames = default_icons.animation_loading
rgb.gif(data, (13, 1), size, frames)

# Main loop
while True:
    measurements = get_measurements()
    if measurements:
        average_temp = noisy_average(measurements)
        display_temperature(average_temp)
        gc.collect()