from machine import UART
import utime
import log
import pm
import dataCall
import checkNet
import uping

# Initialize UART logger
log.basicConfig(log.DEBUG)
log.set_output(UART(UART.UART2, 115200, 8, 0, 1, 0))
LOG = log.getLogger()

# Initialize network
dataCall.setAutoActivate(1,1)
dataCall.setAutoConnect(1,1)
pm.set_psm_time(0)
pm.autosleep(0) 

# Method to test how long the sleep would take
def testSleep(timeout_ms):
    start = utime.ticks_ms()
    deadline = utime.ticks_add(start, timeout_ms)    
    num_sleep = 0
    len_sleep = 0

    while utime.ticks_diff(deadline, utime.ticks_ms()) > 0:  
        num_sleep += 1
        before = utime.ticks_ms()
        utime.sleep_ms(10)
        len_sleep += utime.ticks_diff(utime.ticks_ms(), before)

    LOG.info("Sleeped " + str(num_sleep) + " times with average of " + str(len_sleep / max(1, num_sleep)) + " ms")


# Main loop
while True:
    # Make sure network is connected
    stage, state = checkNet.waitNetworkReady(30)
    if stage != 3 or state != 1:
        LOG.warning("Waiting for network...")
        continue

    # Do some socket communication (when removed, the issue will not happen)
    pres = uping.ping("google.com", COUNT=5, INTERVAL=500, SIZE=64, TIMEOUT=5000, quiet=True)
    LOG.info("Ping results: " + str(pres))

    # Print sleep timings
    testSleep(500)