3D打印:klipper简单分析

整体

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里自定义配置:获取属性,引脚等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值