整体
klipper读取cfg配置
klipper根据配置,动态加载extras下模块
klipper开启socket服务,接收json
kilpper通过uart与mcu通信,不关心是什么mcu,通信格式一致就行
对象
‵‵‵
使用字典,保存对象
gcode = self.printer.lookup_object(‘gcode’)
gcode.register_command(“SAVE_CONFIG_A”, self.cmd_SAVE_CONFIG_A, desc=self.cmd_SAVE_CONFIG_help)
cmd_SAVE_CONFIG_A_help = “Overwrite config file and restart”
def cmd_SAVE_CONFIG_A(self, gcmd):
logging.info(“cmd_SAVE_CONFIG_A”)
gcode = self.printer.lookup_object(‘gcode’)
gcode.error(“cmd_SAVE_CONFIG_A”)
gcmd.respond_info(“cmd_SAVE_CONFIG_A”)
‵‵‵
事件
‵‵‵
使用字典,保存事件。事件触发,遍历
printer.register_event_handler(“klippy:disconnect”, self._handle_disconnect)
‵‵‵
模块
klipper
入口
命令行参数
get_start_args
对象
add_object
lookup_object
lookup_objects
load_object
从extras加载模块
importlib.import_module(‘extras.’ + module_name)
init_func = ‘load_config’
配置
_read_config
_parse_config
fileconfig.read_file(sbuffer, filename)
configparser.RawConfigParser()
onfig.fileconfig.has_option(section, field):
reactor
def _connect(self, eventtime):
self.send_event(“klippy:mcu_identify”)
for cb in self.event_handlers.get(“klippy:connect”, []):
if self.state_message is not message_startup:
return
cb()
def run(self):
systime = time.time()
monotime = self.reactor.monotonic()
logging.info(“Start printer at %s (%.1f %.1f)”,
time.asctime(time.localtime(systime)), systime, monotime)
# Enter main reactor loop
try:
self.reactor.run()
webhooks
socket服务器ServerSocket
server_address = start_args.get(‘apiserver’)
self.sock.bind(server_address)
printer.register_event_handler(‘klippy:disconnect’, self._handle_disconnect)
printer.register_event_handler(“klippy:shutdown”, self._handle_shutdown)
def _process_request(self, web_request):
try:
func = self.webhooks.get_callback(web_request.get_method())
func(web_request)
def register_endpoint(self, path, callback):
if path in self._endpoints:
raise WebRequestError(“Path already registered to an endpoint”)
self._endpoints[path] = callback
GCodeHelper
wh = printer.lookup_object(‘webhooks’)
wh.register_endpoint(“gcode/help”, self._handle_help)
wh.register_endpoint(“gcode/script”, self._handle_script)
wh.register_endpoint(“gcode/restart”, self._handle_restart)
wh.register_endpoint(“gcode/firmware_restart”, self._handle_firmware_restart)
wh.register_endpoint(“gcode/subscribe_output”, self._handle_subscribe_output)
gcode
gcode命令
GCodeDispatch:
printer.register_event_handler(“klippy:ready”, self._handle_ready)
printer.register_event_handler(“klippy:shutdown”, self._handle_shutdown)
printer.register_event_handler(“klippy:disconnect”, self._handle_disconnect)
handlers = [‘M110’, ‘M112’, ‘M115’, ‘RESTART’, ‘FIRMWARE_RESTART’, ‘ECHO’, ‘STATUS’, ‘HELP’]
for cmd in handlers:
func = getattr(self, ‘cmd_’ + cmd)
desc = getattr(self, ‘cmd_’ + cmd + ‘_help’, None)
self.register_command(cmd, func, True, desc)
def register_command(self, cmd, func, when_not_ready=False, desc=None):
def run_script_from_command(self, script):
def _process_commands(self, commands, need_ack=True):
def request_restart(self, result):
if self.is_printer_ready:
toolhead = self.printer.lookup_object(‘toolhead’)
print_time = toolhead.get_last_move_time()
if result == ‘exit’:
logging.info(“Exiting (print time %.3fs)” % (print_time,))
self.printer.send_event(“gcode:request_restart”, print_time)
toolhead.dwell(0.500)
toolhead.wait_moves()
self.printer.request_exit(result)
cmd_RESTART_help = “Reload config file and restart host software”
def cmd_RESTART(self, gcmd):
self.request_restart(‘restart’)
msgproto
与mcu通讯协议
serialhdl
串口
reactor
多路IO复用
poll
epoll
轻量协程
greenlet
chelper
判断so是否存在,不存在则在__init__.py中指定gcc和.c文件 py通过ffi调so
extras
添加传感器等,读取cfg文件自定义配置 设置引脚,总线,寄存器等 设置命令来调用方法等 在cfg中配置,才在获取配置时,动态加载extras下对应的模块,固定执行load_config_prefix方法;不配置不加载模块,cfg定义了参数,在py中一定要读取否则报错
自定义
在extras里创建模块,在cfg里配置,自动加载
在chelper里创建c文件,添加到列表,删掉so,再编译
在cfg里自定义配置:获取属性,引脚等