update: rtc

This commit is contained in:
JackSun-qc 2022-03-23 19:42:23 +08:00
parent 31ac94a4a3
commit 3eee47be2b
9 changed files with 312 additions and 111 deletions

View File

@ -1,6 +1,7 @@
import ure import ure
import _thread # import _thread
import osTimer
import cellLocator import cellLocator
import usr.settings as settings import usr.settings as settings
@ -35,7 +36,10 @@ def gps_data_retrieve_cb(para_list):
''' '''
global gps_data_retrieve_queue global gps_data_retrieve_queue
toRead = para_list[2] toRead = para_list[2]
log.debug('gps_data_retrieve_cb para_list: %s' % str(para_list))
if toRead: if toRead:
if gps_data_retrieve_queue.size() >= 8:
gps_data_retrieve_queue.get()
gps_data_retrieve_queue.put(toRead) gps_data_retrieve_queue.put(toRead)
@ -51,15 +55,20 @@ def gps_data_retrieve_thread(argv):
self = argv self = argv
while True: while True:
toRead = gps_data_retrieve_queue.get() current_settings = settings.settings.get()
if toRead: if current_settings['sys']['gps_mode'] & settings.default_values_sys._gps_mode.external:
self.gps_data = self.uart_read(toRead).decode() self.gps_data = self.uart_read().decode()
elif current_settings['sys']['gps_mode'] & settings.default_values_sys._gps_mode.internal:
self.gps_data = self.quecgnss_read()
class GPS(Singleton): class GPS(Singleton):
def __init__(self, gps_cfg): def __init__(self, gps_cfg):
self.gps_data = '' self.gps_data = ''
self.gps_cfg = gps_cfg self.gps_cfg = gps_cfg
self.gps_timer = osTimer()
self.gps_over_timer = osTimer()
self.break_flag = 0
current_settings = settings.settings.get() current_settings = settings.settings.get()
if current_settings['sys']['gps_mode'] & settings.default_values_sys._gps_mode.external: if current_settings['sys']['gps_mode'] & settings.default_values_sys._gps_mode.external:
self.uart_init() self.uart_init()
@ -78,90 +87,117 @@ class GPS(Singleton):
) )
self.uart_obj.set_callback(gps_data_retrieve_cb) self.uart_obj.set_callback(gps_data_retrieve_cb)
gps_data_retrieve_queue = Queue(maxsize=8) gps_data_retrieve_queue = Queue(maxsize=8)
_thread.start_new_thread(gps_data_retrieve_thread, (self,)) # _thread.start_new_thread(gps_data_retrieve_thread, (self,))
def uart_read(self, nread): def gps_timer_callback(self, args):
self.break_flag = 1
def gps_over_timer_cb(self, args):
global gps_data_retrieve_queue
gps_data_retrieve_queue.put(0)
def uart_read(self):
log.debug('start uart_read')
global gps_data_retrieve_queue
while self.break_flag == 0:
self.gps_timer.start(200, 1, self.gps_timer_callback)
self.gps_over_timer.start(20000, 1, self.gps_over_timer_cb)
nread = gps_data_retrieve_queue.get()
self.gps_timer.stop()
self.gps_over_timer.stop()
log.debug('uart_read nread')
self.break_flag = 0
return self.uart_obj.read(nread).decode() return self.uart_obj.read(nread).decode()
def quecgnss_read(self): def quecgnss_read(self):
if quecgnss.get_state() == 0: if quecgnss.get_state() == 0:
quecgnss.gnssEnable(1) quecgnss.gnssEnable(1)
data = quecgnss.read(4096) while self.break_flag == 0:
self.gps_data = data[1].decode() self.gps_timer.start(500, 1, self.gps_timer_callback)
quecgnss.read(4096)
self.gps_timer.stop()
return self.gps_data self.break_flag = 0
data = None
while not data:
data = quecgnss.read(4096)
return data[1].decode()
def read(self): def read(self):
current_settings = settings.settings.get()
if current_settings['sys']['gps_mode'] & settings.default_values_sys._gps_mode.external:
self.gps_data = self.uart_read().decode()
elif current_settings['sys']['gps_mode'] & settings.default_values_sys._gps_mode.internal:
self.gps_data = self.quecgnss_read()
return self.gps_data return self.gps_data
def read_location_GxRMC(self): def read_location_GxRMC(self, gps_data):
gps_data = self.read()
rmc_re = ure.search( rmc_re = ure.search(
r"\$G[NP]RMC,[0-9]+\.[0-9]+,A,[0-9]+\.[0-9]+,[NS],[0-9]+\.[0-9]+,[EW],[0-9]+\.[0-9]+,[0-9]+\.[0-9]+,[0-9]+,,,[ADE],[SCUV]\*[0-9]+", r"\$G[NP]RMC,[0-9]+\.[0-9]+,A,[0-9]+\.[0-9]+,[NS],[0-9]+\.[0-9]+,[EW],[0-9]+\.[0-9]+,[0-9]+\.[0-9]+,[0-9]+,,,[ADE],[SCUV]\*[0-9]+",
gps_data) gps_data)
if rmc_re: if rmc_re:
return rmc_re.group(0) return rmc_re.group(0)
else: return ""
return ""
def read_location_GxGGA(self): def read_location_GxGGA(self, gps_data):
gps_data = self.read()
gga_re = ure.search( gga_re = ure.search(
r"\$G[BLPN]GGA,[0-9]+\.[0-9]+,[0-9]+\.[0-9]+,[NS],[0-9]+\.[0-9]+,[EW],[126],[0-9]+,[0-9]+\.[0-9]+,-*[0-9]+\.[0-9]+,M,-*[0-9]+\.[0-9]+,M,,\*[0-9]+", r"\$G[BLPN]GGA,[0-9]+\.[0-9]+,[0-9]+\.[0-9]+,[NS],[0-9]+\.[0-9]+,[EW],[126],[0-9]+,[0-9]+\.[0-9]+,-*[0-9]+\.[0-9]+,M,-*[0-9]+\.[0-9]+,M,,\*[0-9]+",
gps_data) gps_data)
if gga_re: if gga_re:
return gga_re.group(0) return gga_re.group(0)
else: return ""
return ""
def read_location_GxVTG(self): def read_location_GxVTG(self, gps_data):
gps_data = self.read()
vtg_re = ure.search(r"\$G[NP]VTG,[0-9]+\.[0-9]+,T,([0-9]+\.[0-9]+)??,M,[0-9]+\.[0-9]+,N,[0-9]+\.[0-9]+,K,[ADEN]\*\w*", gps_data) vtg_re = ure.search(r"\$G[NP]VTG,[0-9]+\.[0-9]+,T,([0-9]+\.[0-9]+)??,M,[0-9]+\.[0-9]+,N,[0-9]+\.[0-9]+,K,[ADEN]\*\w*", gps_data)
if vtg_re: if vtg_re:
return vtg_re.group(0) return vtg_re.group(0)
else: return ""
return ""
def read_location_GxVTG_speed(self): def read_location_GxVTG_speed(self, gps_data):
vtg_data = self.read_location_GxVTG() vtg_data = self.read_location_GxVTG(gps_data)
if vtg_data: if vtg_data:
speed_re = ure.search(r",N,[0-9]+\.[0-9]+,K,", vtg_data) speed_re = ure.search(r",N,[0-9]+\.[0-9]+,K,", vtg_data)
if speed_re: if speed_re:
return speed_re.group(0)[3:-3] return speed_re.group(0)[3:-3]
return "" return ""
def read_quecIot(self): def read_quecIot(self):
data = [] data = []
r = self.read_location_GxRMC() gps_data = self.read()
log.debug('read_quecIot gps_data: %s' % gps_data)
r = self.read_location_GxRMC(gps_data)
if r: if r:
data.append(r) data.append(r)
r = self.read_location_GxGGA() r = self.read_location_GxGGA(gps_data)
if r: if r:
data.append(r) data.append(r)
r = self.read_location_GxVTG() r = self.read_location_GxVTG(gps_data)
if r: if r:
data.append(r) data.append(r)
return {'gps': data} return {'gps': data}
def read_aliyun(self): def read_aliyun(self):
gga_data = self.read_location_GxGGA() gps_data = self.read()
gps_data = {'CoordinateSystem': 1} gga_data = self.read_location_GxGGA(gps_data)
data = {'CoordinateSystem': 1}
if gga_data: if gga_data:
Latitude_re = ure.search(r",[0-9]+\.[0-9]+,[NS],", gga_data) Latitude_re = ure.search(r",[0-9]+\.[0-9]+,[NS],", gga_data)
if Latitude_re: if Latitude_re:
gps_data['Latitude'] = round(float(Latitude_re.group(0)[1:-3]), 2) data['Latitude'] = round(float(Latitude_re.group(0)[1:-3]), 2)
Longtitude_re = ure.search(r",[0-9]+\.[0-9]+,[EW],", gga_data) Longtitude_re = ure.search(r",[0-9]+\.[0-9]+,[EW],", gga_data)
if Longtitude_re: if Longtitude_re:
gps_data['Longtitude'] = round(float(Longtitude_re.group(0)[1:-3]), 2) data['Longtitude'] = round(float(Longtitude_re.group(0)[1:-3]), 2)
Altitude_re = ure.search(r"-*[0-9]+\.[0-9]+,M,", gga_data) Altitude_re = ure.search(r"-*[0-9]+\.[0-9]+,M,", gga_data)
if Altitude_re: if Altitude_re:
gps_data['Altitude'] = round(float(Altitude_re.group(0)[:-3]), 2) data['Altitude'] = round(float(Altitude_re.group(0)[:-3]), 2)
gps_info = {'GeoLocation': gps_data} gps_info = {'GeoLocation': data}
return gps_info return gps_info

View File

@ -1,5 +1,7 @@
from usr.tracker import Tracker from usr.tracker import Tracker
from usr.settings import settings
from usr.settings import default_values_sys
from usr.logging import getLogger from usr.logging import getLogger
log = getLogger(__name__) log = getLogger(__name__)
@ -10,8 +12,19 @@ PROJECT_VERSION = '2.0.0'
def main(): def main():
log.info('PROJECT_NAME: %s' % PROJECT_NAME)
log.info('PROJECT_VERSION: %s' % PROJECT_VERSION)
current_settings = settings.get()
tracker = Tracker() tracker = Tracker()
log.info(tracker.locator.read()) # Start Device Check
tracker.device_check()
# Start OTA Check
if current_settings['sys']['cloud'] == default_values_sys._cloud.quecIot and \
current_settings['app']['sw_ota'] is True:
tracker.remote.check_ota()
# Start PowerManage
tracker.power_manage.start_rtc()
if __name__ == '__main__': if __name__ == '__main__':

122
code/mpower.py Normal file
View File

@ -0,0 +1,122 @@
import pm
import utime
import modem
import _thread
from queue import Queue
from machine import RTC
from usr.common import Singleton
from usr.logging import getLogger
from usr.settings import settings
from usr.settings import LOWENERGYMAP
from usr.settings import SettingsError
from usr.settings import default_values_app
try:
from misc import USB
except ImportError:
USB = None
log = getLogger(__name__)
class PowerManage(Singleton):
def __init__(self, tracker, callback=None):
self.tracker = tracker
self.callback = callback
self.lpm_fd = None
self.low_energy_queue = Queue(maxsize=8)
self.period = None
self.low_energy_method = None
self.set_period()
self.get_low_energy_method()
self.low_energy_init()
self.rtc = RTC()
self.rtc.register_callback(self.rtc_callback)
def set_period(self, seconds=None):
if seconds is None:
current_settings = settings.get()
seconds = current_settings['app']['work_cycle_period']
self.period = seconds
def start_rtc(self):
log.debug('start PowerManage start_rtc')
current_settings = settings.get()
if current_settings['app']['work_mode'] == default_values_app._work_mode.intelligent:
if self.tracker.locator.gps:
gps_data = self.tracker.locator.gps.read()
speed = self.tracker.locator.gps.read_location_GxVTG_speed(gps_data)
if not speed:
return
elif float(speed) <= 0:
return
self.set_period()
atime = utime.localtime(utime.mktime(utime.localtime()) + self.period)
alarm_time = [atime[0], atime[1], atime[2], atime[6], atime[3], atime[4], atime[5], 0]
self.rtc.set_alarm(alarm_time)
log.debug('rtc set_alarm')
self.rtc.enable_alarm(1)
def rtc_callback(self, args):
log.debug('start rtc_callback')
self.rtc.enable_alarm(0)
if self.low_energy_method == 'PM':
self.low_energy_queue.put('wakelock_unlock')
elif self.low_energy_method == 'PSM':
pass
elif self.low_energy_method == 'POWERDOWN':
self.low_energy_queue.put('power_dwon')
def get_low_energy_method(self):
device_model = modem.getDevModel()
support_methds = LOWENERGYMAP.get(device_model)
if not support_methds:
raise SettingsError('This Model %s Not Set LOWENERGYMAP.' % device_model)
if self.period >= 3600:
if "POWERDOWN" in support_methds:
self.low_energy_method = "POWERDOWN"
elif "PSM" in support_methds:
self.low_energy_method = "PSM"
elif "PM" in support_methds:
self.low_energy_method = "PM"
elif 60 <= self.period < 3600:
if "PSM" in support_methds:
self.low_energy_method = "PSM"
elif "PM" in support_methds:
self.low_energy_method = "PM"
elif self.period < 60:
if "PM" in support_methds:
self.low_energy_method = "PM"
return self.low_energy_method
def low_energy_init(self):
if self.low_energy_method == 'POWERDOWN':
pass
elif self.low_energy_method == 'PM':
_thread.start_new_thread(self.low_energy_work, ())
self.lpm_fd = pm.create_wakelock("tracker_lock", len("tracker_lock"))
pm.autosleep(1)
elif self.low_energy_method == 'PSM':
# TODO: PSM LOW ENERGY
pass
def low_energy_work(self):
while True:
data = self.low_energy_queue.get()
if data:
if self.lpm_fd is None:
self.lpm_fd = pm.create_wakelock("tracker_lock", len("tracker_lock"))
pm.autosleep(1)
pm.wakelock_lock(self.lpm_fd)
over_speed_check_res = self.tracker.get_over_speed_check()
self.tracker.device_data_report(event_data=over_speed_check_res, msg=data)

View File

@ -113,6 +113,7 @@ class QuecThing(object):
break break
self.rm_empty_data(data) self.rm_empty_data(data)
log.info('post_data res: %s' % res)
return res return res
def eventCB(self, data): def eventCB(self, data):

View File

@ -50,7 +50,7 @@ class Controller(Singleton):
if flag is True: if flag is True:
self.tracker.device_data_report() self.tracker.device_data_report()
elif flag is False: elif flag is False:
self.tracker.device_data_report(power_switch=False, callback='power_down') self.tracker.device_data_report(power_switch=False, msg='power_down')
else: else:
raise ControllerError('Controller switch permission error %s.' % perm) raise ControllerError('Controller switch permission error %s.' % perm)
@ -180,12 +180,13 @@ def uplink_process(argv):
while True: # Put all data in uplink_queue to hist-dictionary. while True: # Put all data in uplink_queue to hist-dictionary.
if self.uplink_queue.size(): if self.uplink_queue.size():
data = self.uplink_queue.get() data = self.uplink_queue.get()
if data[1]: if data:
if hist.get('hist_data') is None: if data[1]:
hist['hist_data'] = [] if hist.get('hist_data') is None:
hist['hist_data'].append(data[1]) hist['hist_data'] = []
need_refresh = True hist['hist_data'].append(data[1])
sys_bus.publish(data[0], 'false') need_refresh = True
sys_bus.publish(data[0], 'false')
else: else:
break break
finally: finally:
@ -208,7 +209,7 @@ def uplink_process(argv):
if data: if data:
if data[1]: if data[1]:
if not self.cloud.post_data(data[1]): if not self.cloud.post_data(data[1]):
self.add_history(data) self.add_history(data[1])
sys_bus.publish(data[0], 'false') sys_bus.publish(data[0], 'false')
else: else:
sys_bus.publish(data[0], 'true') sys_bus.publish(data[0], 'true')

View File

@ -42,6 +42,23 @@ DRIVE_BEHAVIOR_CODE = {
40004: 'quick_turn_right', 40004: 'quick_turn_right',
} }
LOWENERGYMAP = {
"EC200U": [
"POWERDOWN",
"PM",
],
"EC200U": [
"POWERDOWN",
"PM",
],
"EC600N": [
"PM",
],
"EC800G": [
"PM"
],
}
tracker_settings_file = '/usr/tracker_settings.json' tracker_settings_file = '/usr/tracker_settings.json'
_settings_lock = _thread.allocate_lock() _settings_lock = _thread.allocate_lock()
@ -89,7 +106,6 @@ class default_values_app(object):
none = 0x0 none = 0x0
cycle = 0x1 cycle = 0x1
intelligent = 0x2 intelligent = 0x2
lowenergy = 0x3
class _drive_behavior(object): class _drive_behavior(object):
suddenly_start = 0 suddenly_start = 0
@ -105,9 +121,9 @@ class default_values_app(object):
loc_method = _loc_method.gps loc_method = _loc_method.gps
work_mode = _work_mode.lowenergy work_mode = _work_mode.cycle
work_cycle_period = 10 work_cycle_period = 60
low_power_alert_threshold = 20 low_power_alert_threshold = 20
@ -325,7 +341,7 @@ class Settings(Singleton):
elif opt == 'work_mode': elif opt == 'work_mode':
if not isinstance(val, int): if not isinstance(val, int):
return False return False
if val > default_values_app._work_mode.lowenergy: if val > default_values_app._work_mode.intelligent:
return False return False
self.current_settings['app'][opt] = val self.current_settings['app'][opt] = val
return True return True

View File

@ -4,7 +4,9 @@ import utime
import _thread import _thread
from queue import Queue from queue import Queue
from machine import RTC
from machine import UART from machine import UART
# from misc import Power
import usr.settings as settings import usr.settings as settings
@ -102,16 +104,20 @@ def test_tracker():
log.info('[.] sleep 3') log.info('[.] sleep 3')
utime.sleep(3) utime.sleep(3)
log.info('[.] test tracker.device_check()') # log.info('[.] test tracker.device_data_report()')
device_check_res = tracker.device_check() # device_data_report_res = tracker.device_data_report()
log.info('[.] device_check_res:', device_check_res) # log.info('[.] device_data_report_res:', device_data_report_res)
# log.info('[.] sleep 3') # log.info('[.] sleep 3')
# utime.sleep(3) # utime.sleep(3)
# log.info('[.] test tracker.loc_report()') log.info('[.] test tracker.power_manage.start_rtc()')
# loc_report_res = tracker.loc_report() tracker.power_manage.start_rtc()
# log.info('[.] loc_report_res:', loc_report_res) log.info('[.] end tracker.power_manage.start_rtc()')
# log.info('[.] test tracker.device_check()')
# device_check_res = tracker.device_check()
# log.info('[.] device_check_res:', device_check_res)
# log.info('[.] test tracker.remote.check_ota()') # log.info('[.] test tracker.remote.check_ota()')
# tracker.remote.check_ota() # tracker.remote.check_ota()
@ -200,6 +206,31 @@ def test_pm():
pm.delete_wakelock(lpm_fd) pm.delete_wakelock(lpm_fd)
def test_rtc():
rtc_queue = Queue(maxsize=8)
def rtc_cb(df):
global rtc_queue
print('rtc call back test. [%s]' % df)
rtc_queue.put('rtc')
rtc = RTC()
log.debug('rtc.datatime: %s' % str(rtc.datetime()))
rtc.register_callback(rtc_cb)
atime = utime.localtime(utime.mktime(utime.localtime()) + 10)
alarm_time = (atime[0], atime[1], atime[2], 0, atime[3], atime[4], atime[5], 0)
log.debug('rtc.set_alarm alarm_time: %s' % str(alarm_time))
rtc.set_alarm(alarm_time)
log.debug('rtc.enable_alarm')
rtc.enable_alarm(1)
rtc_data = rtc_queue.get()
log.debug('rtc_data: %s' % rtc_data)
# log.debug('Power.powerDown')
# Power.powerDown()
def main(): def main():
# test_quecthing() # test_quecthing()
# test_settings() # test_settings()
@ -210,6 +241,7 @@ def main():
# test_aliyuniot() # test_aliyuniot()
test_tracker() test_tracker()
# test_pm() # test_pm()
# test_rtc()
if __name__ == '__main__': if __name__ == '__main__':
main() main()

View File

@ -47,29 +47,17 @@ class TrackerTimer(Singleton):
self.gnss_count = 0 self.gnss_count = 0
self.gnss_timer() self.gnss_timer()
if current_settings['app']['sw_ota'] is False:
self.quec_ota = 0
if current_settings['sys']['cloud'] == settings.default_values_sys._cloud.quecIot and \
self.quec_ota >= 3600:
self.quec_ota = 0
self.quecthing_ota_timer()
def loc_timer(self): def loc_timer(self):
current_settings = settings.settings.get() current_settings = settings.settings.get()
if current_settings['app']['work_mode'] == settings.default_values_app._work_mode.intelligent: if current_settings['app']['work_mode'] == settings.default_values_app._work_mode.intelligent:
if not self.tracker.locator.gps: if self.tracker.locator.gps:
if not self.tracker.locator.gps.read_location_GxVTG_speed(): if not self.tracker.locator.gps.read_location_GxVTG_speed():
return return
elif float(self.tracker.locator.gps.read_location_GxVTG_speed()) <= 0: elif float(self.tracker.locator.gps.read_location_GxVTG_speed()) <= 0:
return return
else: else:
return return
elif current_settings['app']['work_mode'] == settings.default_values_app._work_mode.lowenergy: self.tracker.low_energy_queue.put(True)
self.tracker.low_energy_queue.put(True)
return
over_speed_check_res = self.tracker.get_over_speed_check()
self.tracker.device_data_report(event_data=over_speed_check_res)
def battery_timer(self): def battery_timer(self):
current_settings = settings.settings.get() current_settings = settings.settings.get()
@ -82,16 +70,13 @@ class TrackerTimer(Singleton):
alert_data = self.tracker.get_alert_data(30002, {'local_time': utime.mktime(utime.localtime())}) alert_data = self.tracker.get_alert_data(30002, {'local_time': utime.mktime(utime.localtime())})
self.tracker.device_data_report(event_data=alert_data) self.tracker.device_data_report(event_data=alert_data)
if energy <= current_settings['app']['low_power_shutdown_threshold']: if energy <= current_settings['app']['low_power_shutdown_threshold']:
self.tracker.device_data_report(power_switch=False, callback='power_down') self.tracker.device_data_report(power_switch=False, msg='power_down')
elif is_charge == 1: elif is_charge == 1:
self.tracker.energy_led_show(energy) self.tracker.energy_led_show(energy)
def gnss_timer(self): def gnss_timer(self):
self.tracker.locator.gps.quecgnss_read() self.tracker.locator.gps.quecgnss_read()
def quecthing_ota_timer(self):
self.tracker.remote.check_ota()
class LEDTimer(Singleton): class LEDTimer(Singleton):
def __init__(self, tracker): def __init__(self, tracker):

View File

@ -6,7 +6,6 @@ import checkNet
import dataCall import dataCall
from misc import Power from misc import Power
from queue import Queue
import usr.settings as settings import usr.settings as settings
@ -16,9 +15,11 @@ from usr.remote import Remote
from usr.battery import Battery from usr.battery import Battery
from usr.common import numiter from usr.common import numiter
from usr.common import Singleton from usr.common import Singleton
from usr.mpower import PowerManage
from usr.logging import getLogger from usr.logging import getLogger
from usr.location import Location, GPS from usr.location import Location, GPS
from usr.timer import TrackerTimer, LEDTimer # from usr.timer import TrackerTimer
from usr.timer import LEDTimer
try: try:
from misc import USB from misc import USB
@ -42,17 +43,14 @@ class Tracker(Singleton):
self.locator = Location() self.locator = Location()
self.battery = Battery() self.battery = Battery()
self.remote = Remote(self) self.remote = Remote(self)
self.power_manage = PowerManage(self)
self.tracker_timer = TrackerTimer(self) # self.tracker_timer = TrackerTimer(self)
self.led_timer = LEDTimer(self) self.led_timer = LEDTimer(self)
self.low_energy_queue = Queue(maxsize=8)
self.num_iter = numiter() self.num_iter = numiter()
self.num_lock = _thread.allocate_lock() self.num_lock = _thread.allocate_lock()
self.lpm_fd = None
_thread.start_new_thread(self.low_energy_work, ())
if PowerKey is not None: if PowerKey is not None:
self.power_key = PowerKey() self.power_key = PowerKey()
self.power_key.powerKeyEventRegister(self.pwk_callback) self.power_key.powerKeyEventRegister(self.pwk_callback)
@ -76,22 +74,29 @@ class Tracker(Singleton):
return alert_data return alert_data
def get_device_data(self, power_switch=True): def get_device_data(self, power_switch=True):
log.debug('start get_device_data')
device_data = {} device_data = {}
loc_info = self.locator.read() loc_info = self.locator.read()
log.debug('loc_info: %s' % str(loc_info))
if loc_info: if loc_info:
device_data.update(loc_info[1]) device_data.update(loc_info[1])
# TODO: Other Machine Info.
current_settings = settings.settings.get() current_settings = settings.settings.get()
energy = self.battery.energy()
if energy <= current_settings['app']['low_power_alert_threshold']:
alert_data = self.get_alert_data(30002, {'local_time': utime.mktime(utime.localtime())})
device_data.update(alert_data)
# TODO: Other Machine Info.
device_data.update({ device_data.update({
'power_switch': power_switch, 'power_switch': power_switch,
'energy': self.battery.energy(), 'energy': energy,
'local_time': utime.mktime(utime.localtime()), 'local_time': utime.mktime(utime.localtime()),
'ota_status': current_settings['sys']['ota_status'], 'ota_status': current_settings['sys']['ota_status'],
}) })
device_data.update(current_settings['app']) device_data.update(current_settings['app'])
return device_data return device_data
def get_device_check(self): def get_device_check(self):
@ -126,12 +131,11 @@ class Tracker(Singleton):
def get_over_speed_check(self): def get_over_speed_check(self):
alert_data = {} alert_data = {}
current_settings = settings.settings.get()
if self.locator.gps: if current_settings['app']['work_mode'] == settings.default_values_app._work_mode.intelligent:
speed = self.locator.gps.read_location_GxVTG_speed() if self.locator.gps:
if speed: speed = self.locator.gps.read_location_GxVTG_speed()
current_settings = settings.settings.get() if speed and float(speed) >= current_settings['app']['over_speed_threshold']:
if float(speed) > current_settings['app']['over_speed_threshold']:
alert_code = 30003 alert_code = 30003
alert_info = {'local_time': utime.mktime(utime.localtime())} alert_info = {'local_time': utime.mktime(utime.localtime())}
alert_data = self.get_alert_data(alert_code, alert_info) alert_data = self.get_alert_data(alert_code, alert_info)
@ -149,25 +153,31 @@ class Tracker(Singleton):
return str(num) return str(num)
def data_report_cb(self, topic, msg): def data_report_cb(self, topic, msg):
if topic.startswith('wakelock_unlock'): sys_bus.unsubscribe(topic)
pm.wakelock_unlock(self.lpm_fd)
elif topic.startswith('power_down'): if topic.endswith('/wakelock_unlock'):
pm.wakelock_unlock(self.power_manage.lpm_fd)
elif topic.endswith('/power_down'):
self.energy_led.period = None self.energy_led.period = None
self.energy_led.switch(0) self.energy_led.switch(0)
self.running_led.period = None self.running_led.period = None
self.running_led.switch(0) self.running_led.switch(0)
Power.powerDown() Power.powerDown()
sys_bus.unsubscribe(topic) if self.power_manage.callback:
self.power_manage.callback()
self.power_manage.start_rtc()
def device_data_report(self, power_switch=True, event_data={}, callback=''): def device_data_report(self, power_switch=True, event_data={}, msg=''):
log.debug('start device_data_report')
device_data = self.get_device_data(power_switch) device_data = self.get_device_data(power_switch)
if event_data: if event_data:
device_data.update(event_data) device_data.update(event_data)
num = self.get_num() num = self.get_num()
topic = callback + '_' + num if callback else num topic = num + '/' + msg if msg else num
sys_bus.subscribe(topic, self.data_report_cb) sys_bus.subscribe(topic, self.data_report_cb)
log.debug("topic: %s, device_data: %s" % (topic, device_data))
self.remote.post_data(topic, device_data) self.remote.post_data(topic, device_data)
def device_check(self): def device_check(self):
@ -210,30 +220,15 @@ class Tracker(Singleton):
def nw_callback(self, args): def nw_callback(self, args):
net_check_res = self.check.net_check() net_check_res = self.check.net_check()
if args[1] != 1: if args[1] != 1:
# TODO: Check Internet disconected then do something
if net_check_res[0] == 0 or (net_check_res[0] == 1 and net_check_res[1] == 0): if net_check_res[0] == 0 or (net_check_res[0] == 1 and net_check_res[1] == 0):
alert_code = 30004 alert_code = 30004
alert_info = {'local_time': utime.mktime(utime.localtime())} alert_info = {'local_time': utime.mktime(utime.localtime())}
alert_data = self.get_alert_data(alert_code, alert_info) alert_data = self.get_alert_data(alert_code, alert_info)
self.device_data_report(event_data=alert_data) self.device_data_report(event_data=alert_data)
else:
def low_energy_work(self): # TODO: Check Internet conected then do something
while True: pass
data = self.low_energy_queue.get()
if data:
current_settings = settings.settings.get()
if current_settings['app']['work_mode'] == settings.default_values_app._work_mode.lowenergy:
if self.lpm_fd is None:
self.lpm_fd = pm.create_wakelock("tracker_lock", len("tracker_lock"))
pm.autosleep(1)
pm.wakelock_lock(self.lpm_fd)
over_speed_check_res = self.get_over_speed_check()
self.device_data_report(event_data=over_speed_check_res, callback='wakelock_unlock')
else:
if self.lpm_fd is not None:
pm.autosleep(0)
pm.delete_wakelock(self.lpm_fd)
self.lpm_fd = None
class SelfCheck(object): class SelfCheck(object):