2022-03-11 09:49:24 +08:00
|
|
|
# import _thread
|
2022-03-09 16:51:21 +08:00
|
|
|
|
2022-03-11 09:49:24 +08:00
|
|
|
# from queue import Queue
|
2022-03-09 16:51:21 +08:00
|
|
|
from machine import Timer
|
2022-03-11 09:49:24 +08:00
|
|
|
from misc import USB
|
|
|
|
from misc import Power
|
|
|
|
from misc import PowerKey
|
2022-03-09 16:51:21 +08:00
|
|
|
|
|
|
|
import usr.settings as settings
|
2022-03-03 09:53:51 +08:00
|
|
|
|
2022-03-11 09:49:24 +08:00
|
|
|
from usr.led import LED
|
|
|
|
from usr.sensor import Sensor
|
2022-03-09 16:51:21 +08:00
|
|
|
from usr.remote import Remote
|
2022-03-11 09:49:24 +08:00
|
|
|
from usr.battery import Battery
|
|
|
|
from usr.common import Singleton, Controller
|
2022-03-09 16:51:21 +08:00
|
|
|
from usr.location import Location
|
2022-03-08 17:12:38 +08:00
|
|
|
from usr.alert import AlertMonitor
|
2022-03-11 09:49:24 +08:00
|
|
|
from usr.logging import getLogger
|
|
|
|
from usr.selfcheck import net_check, gps_check, sensor_check
|
2022-03-03 09:53:51 +08:00
|
|
|
|
2022-03-09 16:51:21 +08:00
|
|
|
log = getLogger(__name__)
|
2022-03-04 13:21:48 +08:00
|
|
|
|
2022-03-09 16:51:21 +08:00
|
|
|
|
2022-03-11 09:49:24 +08:00
|
|
|
class Tracker(Singleton):
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
self.led = LED()
|
|
|
|
self.sensor = Sensor()
|
|
|
|
self.locator = Location(self.loc_read_cb)
|
|
|
|
self.alert = AlertMonitor(self.alert_read_cb)
|
|
|
|
self.battery = Battery(self.batter_read_cb)
|
|
|
|
self.controller = Controller(self.remote)
|
2022-03-11 09:57:19 +08:00
|
|
|
self.remote = Remote(self, self.remote_read_cb)
|
2022-03-11 09:49:24 +08:00
|
|
|
|
|
|
|
current_settings = settings.settings.get()
|
|
|
|
self.loc_timer = Timer(current_settings['sys']['loc_timern'])
|
|
|
|
self.loc_timer_init()
|
2022-03-09 16:51:21 +08:00
|
|
|
|
2022-03-11 09:49:24 +08:00
|
|
|
self.power_key = PowerKey()
|
|
|
|
self.power_key.powerKeyEventRegister(self.pwk_callback)
|
|
|
|
self.usb = USB()
|
|
|
|
self.usb.setCallback(self.usb_callback)
|
2022-03-09 16:51:21 +08:00
|
|
|
|
2022-03-11 09:49:24 +08:00
|
|
|
def remote_read_cb(self, *data):
|
|
|
|
if data:
|
|
|
|
if data[0] == 'object_model':
|
|
|
|
for item in data[1]:
|
|
|
|
if item[0] == 'loc_mode':
|
|
|
|
self.loc_timer_init()
|
2022-03-09 16:51:21 +08:00
|
|
|
|
2022-03-11 09:49:24 +08:00
|
|
|
def loc_read_cb(self, data):
|
|
|
|
if data:
|
|
|
|
loc_method = data[0]
|
|
|
|
loc_data = data[1]
|
|
|
|
log.info("loc_method:", loc_method)
|
|
|
|
log.info("loc_data:", loc_data)
|
|
|
|
if loc_method == settings.default_values_app._loc_method.gps:
|
|
|
|
data_type = self.remote.DATA_LOCA_GPS
|
|
|
|
else:
|
|
|
|
data_type = self.remote.DATA_LOCA_NON_GPS
|
|
|
|
self.remote.post_data(data_type, loc_data)
|
2022-03-09 16:51:21 +08:00
|
|
|
|
2022-03-11 09:49:24 +08:00
|
|
|
def alert_read_cb(self, *data):
|
|
|
|
if data:
|
|
|
|
data_type = self.remote.DATA_NON_LOCA
|
|
|
|
alert_data = {data[0]: data[1]}
|
|
|
|
self.remote.post_data(data_type, alert_data)
|
|
|
|
|
|
|
|
def batter_read_cb(self, *data):
|
|
|
|
current_settings = settings.settings.get()
|
|
|
|
energy = data[0]
|
|
|
|
is_charge = USB.getStatus()
|
|
|
|
if is_charge == 0:
|
|
|
|
self.energy_led_show(energy)
|
|
|
|
if current_settings['app']['sw_low_power_alert']:
|
|
|
|
if energy <= current_settings['app']['low_power_alert_threshold']:
|
|
|
|
# TODO: low_power_alert
|
|
|
|
pass
|
|
|
|
if energy <= current_settings['app']['low_power_shutdown_threshold']:
|
|
|
|
# TODO: low_power_shutdown
|
|
|
|
self.led.off()
|
|
|
|
Power.powerDown()
|
|
|
|
elif is_charge == 1:
|
|
|
|
if energy == 100:
|
|
|
|
self.led.flashing_mode('energy_led', 0, 'green')
|
|
|
|
|
|
|
|
def machine_info_report(self):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def energy_led_show(self, energy):
|
|
|
|
color = None
|
|
|
|
if energy <= 5:
|
|
|
|
self.led.off()
|
|
|
|
elif 5 < energy <= 20:
|
|
|
|
color = 'red'
|
|
|
|
elif 20 < energy <= 40:
|
|
|
|
color = 'orange'
|
|
|
|
elif 40 < energy <= 70:
|
|
|
|
color = 'yellow'
|
|
|
|
elif 70 < energy <= 100:
|
|
|
|
color = 'green'
|
|
|
|
if color:
|
|
|
|
self.led.flashing_mode('energy_led', 0, color)
|
2022-03-09 16:51:21 +08:00
|
|
|
|
|
|
|
def loc_timer_cb(self, args):
|
|
|
|
self.locator.trigger()
|
|
|
|
|
|
|
|
def loc_timer_init(self):
|
|
|
|
current_settings = settings.settings.get()
|
|
|
|
if (current_settings['app']['loc_mode'] & settings.default_values_app._loc_mode.cycle) \
|
|
|
|
and current_settings['app']['loc_cycle_period']:
|
|
|
|
log.debug('[.] loc_timer to restart.')
|
|
|
|
self.loc_timer.stop()
|
|
|
|
log.debug('[.] loc_timer stop.')
|
|
|
|
self.loc_timer.start(period=current_settings['app']['loc_cycle_period'] * 1000, mode=self.loc_timer.PERIODIC, callback=self.loc_timer_cb)
|
|
|
|
log.debug('[.] loc_timer start.')
|
|
|
|
else:
|
|
|
|
self.loc_timer.stop()
|
|
|
|
log.debug('[.] loc_timer stop forever.')
|
2022-03-11 09:49:24 +08:00
|
|
|
|
|
|
|
def pwk_callback(self, status):
|
|
|
|
if status == 0:
|
|
|
|
# TODO: Power On SelfCheck
|
|
|
|
log.info('PowerKey Release.')
|
|
|
|
net_check_res = net_check()
|
|
|
|
gps_check_res = gps_check()
|
|
|
|
sensor_check_res = sensor_check()
|
|
|
|
if net_check_res and gps_check_res and sensor_check_res:
|
|
|
|
self.led.flashing_mode('operating_led', 2000)
|
|
|
|
else:
|
|
|
|
self.led.flashing_mode('operating_led', 500)
|
|
|
|
# TODO: Post Fault Error Info
|
|
|
|
elif status == 1:
|
|
|
|
log.info('PowerKey Press.')
|
|
|
|
else:
|
|
|
|
log.warn('Unknown PowerKey Status:', status)
|
|
|
|
|
|
|
|
def usb_callback(self, status):
|
|
|
|
energy = self.battery.energy()
|
|
|
|
if status == 0:
|
|
|
|
log.info('USB is disconnected.')
|
|
|
|
self.energy_led_show(energy)
|
|
|
|
elif status == 1:
|
|
|
|
log.info('USB is connected.')
|
|
|
|
if energy <= 5:
|
|
|
|
self.led.flashing_mode('energy_led', 1000, 'red')
|
|
|
|
elif 5 < energy < 100:
|
|
|
|
self.led.flashing_mode('energy_led', 1000, 'yellow')
|
|
|
|
elif energy == 100:
|
|
|
|
self.led.flashing_mode('energy_led', 0, 'green')
|
|
|
|
else:
|
|
|
|
log.warn('Unknown USB Stauts:', status)
|