Skip to content

Commit 62f7bc3

Browse files
committed
Initial commit
0 parents  commit 62f7bc3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+7544
-0
lines changed

code/EventMesh.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import _thread
2+
import usys
3+
4+
5+
class EventStore(object):
6+
def __init__(self):
7+
self.map = dict()
8+
self.log = None
9+
self.__filters = []
10+
11+
def add_filter(self, flt):
12+
self.__filters.append(flt)
13+
14+
def append(self, event, cb):
15+
self.map[event] = cb
16+
17+
def fire_async(self, event, msg):
18+
if event in self.map:
19+
_thread.start_new_thread(self.map[event], (event, msg))
20+
if self.log:
21+
self.log.info("ASYNC executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, None))
22+
23+
def fire_sync(self, event, msg):
24+
res = None
25+
try:
26+
if event in self.map:
27+
res = self.map[event](event, msg)
28+
except Exception as e:
29+
usys.print_exception(e)
30+
if event not in self.__filters:
31+
if self.log:
32+
self.log.info("SYNC executed (event) -> {} (params) -> {} (result) -> {}".format(event, msg, res))
33+
return res
34+
35+
36+
event_store = EventStore()
37+
38+
39+
def subscribe(event, cb):
40+
"""
41+
subscribe event and cb
42+
"""
43+
return event_store.append(event, cb)
44+
45+
46+
def publish(event, msg=None):
47+
"""
48+
publish event and msg
49+
"""
50+
return publish_sync(event, msg)
51+
52+
53+
def publish_async(event, msg=None):
54+
"""
55+
异步发送
56+
"""
57+
return event_store.fire_async(event, msg)
58+
59+
60+
def publish_sync(event, msg=None):
61+
"""
62+
同步发送
63+
"""
64+
return event_store.fire_sync(event, msg)
65+
66+
67+
def set_log(log_adapter):
68+
event_store.log = log_adapter
69+
70+
71+
def add_filter(flt):
72+
event_store.add_filter(flt)

code/btn_device_600m.py

Lines changed: 173 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,173 @@
1+
import osTimer
2+
from machine import Pin, KeyPad, ExtInt
3+
from misc import PowerKey, Power
4+
from usr.common import Abstract
5+
from usr import EventMesh
6+
7+
8+
class BtnDevice(Abstract):
9+
"""物理按键类,3*2的矩阵键盘加pwk"""
10+
11+
def __init__(self):
12+
self.__keypad = KeyPad(3, 2)
13+
self.__pk = PowerKey()
14+
self.__longpress_flag = 0
15+
self.__long_timer = osTimer()
16+
self.__pwk_timer = osTimer()
17+
self.__ok_btn_timer = osTimer()
18+
self.__up_btn_timer = osTimer()
19+
self.__down_btn_timer = osTimer()
20+
self.__up_longPress_flag = False
21+
self.__down_longPress_flag = False
22+
self.__PowerDownTimeOut = 2000
23+
self.group_count = 0
24+
self.group_cur = 0
25+
self.member_count = 0
26+
self.member_cur = 0
27+
28+
def post_processor_after_instantiation(self):
29+
self.__keypad.init()
30+
self.__keypad.set_callback(self.__key_cb)
31+
self.__pk.powerKeyEventRegister(self.__pwk_callback)
32+
self.ej_ptt = ExtInt(ExtInt.GPIO19, ExtInt.IRQ_RISING_FALLING, ExtInt.PULL_PD, self.ej_ptt_cb)
33+
self.ej_ptt.enable()
34+
35+
def ej_ptt_cb(self, ext_info):
36+
if ext_info[1]:
37+
self.__speak_press_handle()
38+
else:
39+
self.__speak_release_handle()
40+
41+
def keypad_tone(self):
42+
if not EventMesh.publish("get_poc_keypad_tone") and EventMesh.publish("get_speaker_state") == 1:
43+
EventMesh.publish("audio_tone")
44+
45+
def __key_cb(self, key_list):
46+
"""矩阵键盘回调函数"""
47+
self.__key_event_manage(key_list)
48+
49+
def __key_event_manage(self, event):
50+
if event[0] == 1 and event[1] == 0 and event[2] == 0: # ok_btn按下
51+
self.keypad_tone()
52+
self.__ok_long_press_handle()
53+
elif event[0] == 0 and event[1] == 1 and event[2] == 0: # sleep_btn抬起
54+
self.keypad_tone()
55+
self.__sleep_press_handle()
56+
elif event[0] == 0 and event[1] == 0 and event[2] == 0: # ok_btn抬起
57+
self.__ok_press_handle()
58+
elif event[0] == 0 and event[1] == 1 and event[2] == 1: # up/vol+抬起
59+
self.__up_press_handle()
60+
elif event[0] == 1 and event[1] == 1 and event[2] == 1: # up/vol+按下
61+
self.keypad_tone()
62+
self.__up_long_press_handle()
63+
elif event[0] == 0 and event[1] == 0 and event[2] == 1: # down/vol-抬起
64+
self.__down_press_handle()
65+
elif event[0] == 1 and event[1] == 0 and event[2] == 1: # down/vol-长按
66+
self.keypad_tone()
67+
self.__down_long_press_handle()
68+
elif event[0] == 1 and event[1] == 2 and event[2] == 1: # ptt按下
69+
self.__speak_press_handle()
70+
elif event[0] == 0 and event[1] == 2 and event[2] == 1: # ptt抬起
71+
self.__speak_release_handle()
72+
73+
def __ok_longPress_handle(self, args):
74+
"""ok 长按锁键"""
75+
EventMesh.publish("btn_ok_long")
76+
77+
def __longPress_handle(self, args):
78+
EventMesh.publish("btn_ptt_long")
79+
80+
def __down_longPress_handle(self, args):
81+
self.__down_longPress_flag = True
82+
EventMesh.publish("btn_down_long")
83+
84+
def __sleep_press_handle(self):
85+
'''
86+
息屏键处理方法,发送息屏事件
87+
'''
88+
EventMesh.publish("btn_sleep")
89+
90+
def __ok_press_handle(self):
91+
'''
92+
KEY1:联动屏幕左下角或确认键
93+
'''
94+
self.__ok_btn_timer.stop()
95+
EventMesh.publish("btn_ok_on")
96+
97+
def __ok_long_press_handle(self):
98+
'''
99+
KEY1:联动屏幕左下角或确认键
100+
'''
101+
EventMesh.publish("btn_ok_off")
102+
self.__ok_btn_timer.start(5000, 0, self.__ok_longPress_handle)
103+
104+
def __pwk_long_press_cb(self, *args):
105+
'''KEY2:联动屏幕右下角或返回键长按关机'''
106+
EventMesh.publish("btn_back_long")
107+
108+
def __pwk_callback(self, status):
109+
'''
110+
KEY2:联动屏幕右下角或返回键
111+
'''
112+
if status == 1:
113+
self.__pwk_timer.start(self.__PowerDownTimeOut, 0, self.__pwk_long_press_cb)
114+
elif status == 0:
115+
self.__pwk_timer.stop()
116+
EventMesh.publish("btn_back")
117+
118+
def __down_press_handle(self):
119+
'''
120+
键盘S4:音量-或向右选择或向下选择 抬起
121+
'''
122+
# 主界面按下,音量-
123+
self.__down_btn_timer.stop()
124+
if not self.__down_longPress_flag:
125+
EventMesh.publish("btn_down_on")
126+
self.__down_longPress_flag = False
127+
128+
def __down_long_press_handle(self):
129+
'''
130+
键盘S4:音量-长按 按下
131+
'''
132+
# 主界面按下,音量-
133+
self.__down_btn_timer.stop()
134+
self.__down_btn_timer.start(3000, 0, self.__down_longPress_handle)
135+
136+
def __up_press_handle(self):
137+
"""
138+
音量+或向左选择或向上选择按键回调
139+
"""
140+
self.__up_btn_timer.stop()
141+
if not self.__up_longPress_flag:
142+
EventMesh.publish("btn_up")
143+
self.__up_longPress_flag = False
144+
145+
def __up_long_press_handle(self):
146+
'''
147+
up长按处理
148+
'''
149+
self.__up_btn_timer.stop()
150+
self.__up_btn_timer.start(3000, 0, self.__up_longPress_handle)
151+
152+
def __up_longPress_handle(self, *args):
153+
self.__up_longPress_flag = True
154+
EventMesh.publish("btn_up_long_press")
155+
156+
def __speak_release_handle(self, *args):
157+
"""
158+
群呼按键长按松开回调函数
159+
结束群呼
160+
"""
161+
self.__long_timer.stop()
162+
EventMesh.publish("btn_ptt_off")
163+
164+
def __speak_press_handle(self, *args):
165+
"""
166+
群呼按键长按按下回调函数
167+
长按300ms以上算长按,否则算误按
168+
"""
169+
EventMesh.publish("btn_ptt_on")
170+
self.__long_timer.start(100, 0, self.__longPress_handle)
171+
172+
def start(self):
173+
self.post_processor_after_instantiation()

code/common.py

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
import _thread
2+
import utime
3+
from event_message import Event, EventManager
4+
5+
6+
class Lock(object):
7+
8+
def __init__(self):
9+
self.lock = _thread.allocate_lock()
10+
11+
def __enter__(self, *args, **kwargs):
12+
self.lock.acquire()
13+
14+
def __exit__(self, *args, **kwargs):
15+
self.lock.release()
16+
17+
18+
class LOG_LV(object):
19+
"""日志等级"""
20+
DEBUG = "DEBUG"
21+
INFO = "INFO"
22+
WARNING = "WARNING"
23+
ERROR = "ERROR"
24+
CRITICAL = "CRITICAL"
25+
26+
27+
class Abstract(object):
28+
def post_processor_after_instantiation(self, *args, **kwargs):
29+
"""实例化后调用"""
30+
pass
31+
32+
def post_processor_before_initialization(self, *args, **kwargs):
33+
"""初始化之前调用"""
34+
pass
35+
36+
def initialization(self, *args, **kwargs):
37+
"""初始化load"""
38+
pass
39+
40+
def post_processor_after_initialization(self, *args, **kwargs):
41+
"""初始化之后调用"""
42+
pass
43+
44+
45+
class AbstractOutput(object):
46+
def open(self):
47+
pass
48+
49+
def output(self, message, **kwargs):
50+
pass
51+
52+
def close(self):
53+
pass
54+
55+
56+
class PrintLogOutput(AbstractOutput):
57+
def output(self, message, **kwargs):
58+
fmt = "{} [ {} ] {} {}"
59+
print(fmt.format(*message))
60+
61+
62+
class LogService(Abstract):
63+
"""
64+
default log is async queue
65+
you can set
66+
"""
67+
INSTANCE = None
68+
REPORTER = PrintLogOutput()
69+
LEVEL = LOG_LV.DEBUG
70+
MODE = 1
71+
LEVEL_MAP = {
72+
LOG_LV.DEBUG: 0,
73+
LOG_LV.INFO: 1,
74+
LOG_LV.WARNING: 2,
75+
LOG_LV.ERROR: 3,
76+
LOG_LV.CRITICAL: 4
77+
}
78+
79+
def __init__(self):
80+
self.__event = Event(__name__)
81+
self.__em = EventManager()
82+
self.__em.register_event(self.__event)
83+
84+
@classmethod
85+
def create(cls):
86+
if not cls.INSTANCE:
87+
cls.INSTANCE = LogService()
88+
cls.INSTANCE.start()
89+
return cls.INSTANCE
90+
91+
def log_send(self, tag, level, msg, mode):
92+
if self.MODE:
93+
mode = self.MODE
94+
if self.LEVEL_MAP[level] >= self.LEVEL_MAP.get(self.LEVEL, 0):
95+
output_format = "{ascdate} {asctime}"
96+
rt = utime.localtime()
97+
d_f = "{0:02}"
98+
send_msg = (output_format.format(
99+
ascdate=str(rt[0]) + "-" + d_f.format(rt[1]) + "-" + d_f.format(rt[2])
100+
, asctime=d_f.format(rt[3]) + ":" + d_f.format(rt[4]) + ":" + d_f.format(rt[5])
101+
), tag, level, msg)
102+
# self.REPORTER.output(send_msg)
103+
print("{} [ {} ] {} {}".format(*send_msg))
104+
# self.__event.post(send_msg)
105+
106+
def output(self, *args, **kwargs):
107+
emo = kwargs.get("event_message")
108+
self.REPORTER.output(emo.msg)
109+
110+
def start(self):
111+
self.__event.add_handler(self.output)
112+
self.__em.start()
113+
114+
115+
class LogAdapter(object):
116+
"""
117+
log adapter mode
118+
mode used : adapter proxy single LogService
119+
"""
120+
121+
def __init__(self, tag, enable=1):
122+
self.log_service = LogService.create()
123+
self.tag = tag
124+
self.enable = enable
125+
self.mode = 1
126+
127+
def critical(self, msg):
128+
if self.enable:
129+
self.log_service.log_send(self.tag, LOG_LV.CRITICAL, msg, self.mode)
130+
131+
def debug(self, msg):
132+
if self.enable:
133+
self.log_service.log_send(self.tag, LOG_LV.DEBUG, msg, self.mode)
134+
135+
def info(self, msg):
136+
if self.enable:
137+
self.log_service.log_send(self.tag, LOG_LV.INFO, msg, self.mode)
138+
139+
def warning(self, msg):
140+
if self.enable:
141+
self.log_service.log_send(self.tag, LOG_LV.WARNING, msg, self.mode)
142+
143+
def error(self, msg):
144+
if self.enable:
145+
self.log_service.log_send(self.tag, LOG_LV.ERROR, msg, self.mode)

0 commit comments

Comments
 (0)