#!/usr/bin/env python3 from flipper.app import App from flipper.storage import FlipperStorage from flipper.utils.cdc import resolve_port class Main(App): # this is basic use without sub-commands, simply to reboot flipper / power it off, not meant as a full CLI wrapper def init(self): self.parser.add_argument("-p", "--port", help="CDC Port", default="auto") self.subparsers = self.parser.add_subparsers(help="sub-command help") self.parser_power_off = self.subparsers.add_parser( "power_off", help="Power off command, won't return to CLI" ) self.parser_power_off.set_defaults(func=self.power_off) self.parser_reboot = self.subparsers.add_parser( "reboot", help="Reboot command help" ) self.parser_reboot.set_defaults(func=self.reboot) self.parser_reboot2dfu = self.subparsers.add_parser( "reboot2dfu", help="Reboot to DFU, won't return to CLI" ) self.parser_reboot2dfu.set_defaults(func=self.reboot2dfu) def _get_flipper(self): if not (port := resolve_port(self.logger, self.args.port)): return None flipper = FlipperStorage(port) flipper.start() return flipper def power_off(self): if not (flipper := self._get_flipper()): return 1 self.logger.debug("Powering off") flipper.send("power off" + "\r") flipper.stop() return 0 def reboot(self): if not (flipper := self._get_flipper()): return 1 self.logger.debug("Rebooting") flipper.send("power reboot" + "\r") flipper.stop() return 0 def reboot2dfu(self): if not (flipper := self._get_flipper()): return 1 self.logger.debug("Rebooting to DFU") flipper.send("power reboot2dfu" + "\r") flipper.stop() return 0 if __name__ == "__main__": Main()()