def main(settings):
    """ Main function for the communicatior, loops here """

    if settings.transport == "websocket":
        pebble = PebbleConnection(WebsocketTransport(settings.device), log_packet_level=logging.DEBUG)
    else: # No elif, for compatibility with older configs
        pebble = PebbleConnection(SerialTransport(settings.device), log_packet_level=logging.DEBUG)
    pebble.connect()

    # For some reason it seems to timeout for the first time, with "somebody is eating our input" error,
    # replying seems to help.
    for loop in range(5):
        try:
            pebble.run_async()
            break
        except libpebble2.exceptions.TimeoutError:
            logging.info("Pebble timeouted, retrying..")
            continue

    # Register service for app messages
    appservice = AppMessageService(pebble)
    handler = CommandHandler(settings)

    commwatch = CommunicationKeeper(settings, appservice)
    appservice.register_handler("nack", commwatch.nack_received)
    appservice.register_handler("ack", commwatch.ack_received)

    # Start the watchapp
    pebble.send_packet(AppRunState(command = 0x01, data=AppRunStateStart(uuid = uuid.UUID(settings.uuid))))

    # Send our current config
    for (id_key, id_type) in get_button_ids():
        id_full = id_key[0] + "," + id_type[0]
        if id_full in settings.key_mappings:
            status = "T"
        else:
            status = "F"

        data = id_key[0] + id_type[0] + status
        commwatch.send_message({COMMUNICATION_KEY_CONFIG: CString(data)})

        # Wait for all
        for loop in range(10):
            if len(commwatch.pending) == 0:
                break
            if commwatch.error:
                raise PebbleConnectionException("Commwatch:" + commwatch.error)
            time.sleep(0.1)
        else:
            raise PebbleConnectionException("Pebble not respoding to config")

    logging.info("Connection ok, entering to active state..")
    appservice.register_handler("appmessage", handler.message_received_event)

    while True:
        commwatch.send_message({COMMUNICATION_KEY_PING: Uint8(0)})
        time.sleep(10)
Beispiel #2
0
class PebbleManager(object):
    def __init__(self, qemu):
        self.qemu = qemu.split(":")
        print self.qemu
        self.pebble = PebbleConnection(QemuTransport(*self.qemu), log_packet_level=logging.DEBUG)
        self.handle_start = None
        self.handle_stop = None
        self.blobdb = None
        self.launcher = None

    def connect(self):
        self.pebble.connect()
        greenlet = gevent.spawn(self.pebble.run_sync)
        self.pebble.fetch_watch_info()
        self.register_endpoints()
        self.pebble.transport.send_packet(QemuBluetoothConnection(connected=True), target=MessageTargetQemu())
        self.blobdb = BlobDBClient(self.pebble)
        self.request_running_app()
        logger.info("connected to %s", self.qemu)
        return greenlet

    def disconnect(self):
        if self.launcher is not None:
            self.launcher.shutdown()

    def register_endpoints(self):
        self.pebble.register_endpoint(AppRunState, self.handle_lifecycle)
        self.launcher = AppMessageService(self.pebble, message_type=LegacyAppLaunchMessage)
        self.launcher.register_handler("appmessage", self.handle_launcher)

    def request_running_app(self):
        if self.pebble.firmware_version.major >= 3:
            self.pebble.send_packet(AppRunState(data=AppRunStateRequest()))
        else:
            self.launcher.send_message(uuid.UUID(int=0), {LegacyAppLaunchMessage.Keys.StateFetch: Uint8(1)})

    def handle_lifecycle(self, packet):
        if isinstance(packet.data, AppRunStateStart):
            if callable(self.handle_start):
                self.handle_start(packet.data.uuid)
        elif isinstance(packet.data, AppRunStateStop):
            if callable(self.handle_stop):
                self.handle_stop(packet.data.uuid)

    def handle_launcher(self, txid, uuid, message):
        state = message[LegacyAppLaunchMessage.Keys.RunState]
        if state == LegacyAppLaunchMessage.States.Running:
            if callable(self.handle_start):
                self.handle_start(uuid)
        elif state == LegacyAppLaunchMessage.States.NotRunning:
            if callable(self.handle_stop):
                self.handle_stop(uuid)

    @property
    def timeline_is_supported(self):
        return self.pebble.firmware_version.major >= 3
Beispiel #3
0
 def _connect_emulator(self, platform, sdk):
     connection = PebbleConnection(ManagedEmulatorTransport(platform, sdk), **self._get_debug_args())
     connection.connect()
     connection.run_async()
     # Make sure the timezone is set usefully.
     if connection.firmware_version.major >= 3:
         ts = time.time()
         tz_offset = -time.altzone if time.localtime(ts).tm_isdst and time.daylight else -time.altzone
         tz_offset_minutes = tz_offset // 60
         tz_name = "UTC%+d" % (tz_offset_minutes / 60)
         connection.send_packet(TimeMessage(message=SetUTC(unix_time=ts, utc_offset=tz_offset_minutes, tz_name=tz_name)))
     return connection
Beispiel #4
0
 def _connect_emulator(self, platform, sdk):
     connection = PebbleConnection(ManagedEmulatorTransport(platform, sdk), **self._get_debug_args())
     connection.connect()
     connection.run_async()
     # Make sure the timezone is set usefully.
     if connection.firmware_version.major >= 3:
         ts = time.time()
         tz_offset = -time.altzone if time.localtime(ts).tm_isdst and time.daylight else -time.timezone
         tz_offset_minutes = tz_offset // 60
         tz_name = "UTC%+d" % (tz_offset_minutes / 60)
         connection.send_packet(TimeMessage(message=SetUTC(unix_time=ts, utc_offset=tz_offset_minutes, tz_name=tz_name)))
     return connection
Beispiel #5
0
def main(settings):
    """ Main function for the communicator, loops here """

    if settings.transport == "websocket":
        pebble = PebbleConnection(WebsocketTransport(settings.device),
                                  log_packet_level=logging.DEBUG)
    else:  # No elif, for compatibility with older configs
        pebble = PebbleConnection(SerialTransport(settings.device),
                                  log_packet_level=logging.DEBUG)
    pebble.connect()

    if (pebble.connected):
        print("Pebble successfully connected.")

    try:
        pebble.run_async()
    except libpebble2.exceptions.TimeoutError:
        print("Pebble timeouted")
        logging.info("Pebble timeouted")

    # Install app
    AppInstaller(pebble, "../hotpebble.pbw").install()

    # Register service for app messages
    appservice = AppMessageService(pebble)
    handler = CommandHandler(settings)

    commwatch = CommunicationKeeper(settings, appservice)
    appservice.register_handler("nack", commwatch.nack_received)
    appservice.register_handler("ack", commwatch.ack_received)

    # Start the watchapp
    pebble.send_packet(
        AppRunState(command=0x01,
                    data=AppRunStateStart(uuid=uuid.UUID(settings.uuid))))

    logging.info("Connection ok, entering to active state...")
    appservice.register_handler("appmessage", handler.message_received_event)

    while True:
        commwatch.send_message({COMMUNICATION_KEY_PING: Uint8(0)})
        time.sleep(10)
Beispiel #6
0
                    type=argparse.FileType("rb"))
parser.add_argument("--resources",
                    metavar="FILE",
                    help="System resources pack",
                    required=True,
                    type=argparse.FileType("rb"))

group = parser.add_mutually_exclusive_group(required=True)
group.add_argument("--serial",
                   metavar="DEVICE",
                   dest="transport",
                   type=SerialTransport)

args = parser.parse_args()

pebble = PebbleConnection(args.transport)
pebble.connect()
pebble.run_async()

pebble.send_and_read(
    SystemMessage(message_type=SystemMessage.Type.FirmwareUpdateStart),
    SystemMessage)

PutBytes(pebble, PutBytesType.Firmware, args.firmware.read(), bank=0).send()

PutBytes(pebble, PutBytesType.SystemResources, args.resources.read(),
         bank=0).send()

pebble.send_packet(
    SystemMessage(message_type=SystemMessage.Type.FirmwareUpdateComplete))
Beispiel #7
0
class PebbleManager(object):
    def __init__(self, qemu):
        self.qemu = qemu.split(':')
        print self.qemu
        self.pebble = PebbleConnection(QemuTransport(*self.qemu),
                                       log_packet_level=logging.DEBUG)
        self.handle_start = None
        self.handle_stop = None
        self.blobdb = None
        self.launcher = None

    def connect(self):
        self.pebble.connect()
        greenlet = gevent.spawn(self.pebble.run_sync)
        self.pebble.fetch_watch_info()
        self.register_endpoints()
        self.pebble.transport.send_packet(
            QemuBluetoothConnection(connected=True),
            target=MessageTargetQemu())
        self.blobdb = BlobDBClient(self.pebble)
        self.request_running_app()
        logger.info('connected to %s', self.qemu)
        return greenlet

    def disconnect(self):
        if self.launcher is not None:
            self.launcher.shutdown()

    def register_endpoints(self):
        self.pebble.register_endpoint(AppRunState, self.handle_lifecycle)
        self.launcher = AppMessageService(self.pebble,
                                          message_type=LegacyAppLaunchMessage)
        self.launcher.register_handler("appmessage", self.handle_launcher)

    def request_running_app(self):
        if self.pebble.firmware_version.major >= 3:
            self.pebble.send_packet(AppRunState(data=AppRunStateRequest()))
        else:
            self.launcher.send_message(
                uuid.UUID(int=0),
                {LegacyAppLaunchMessage.Keys.StateFetch: Uint8(1)})

    def handle_lifecycle(self, packet):
        if isinstance(packet.data, AppRunStateStart):
            if callable(self.handle_start):
                self.handle_start(packet.data.uuid)
        elif isinstance(packet.data, AppRunStateStop):
            if callable(self.handle_stop):
                self.handle_stop(packet.data.uuid)

    def handle_launcher(self, txid, uuid, message):
        state = message[LegacyAppLaunchMessage.Keys.RunState]
        if state == LegacyAppLaunchMessage.States.Running:
            if callable(self.handle_start):
                self.handle_start(uuid)
        elif state == LegacyAppLaunchMessage.States.NotRunning:
            if callable(self.handle_stop):
                self.handle_stop(uuid)

    @property
    def timeline_is_supported(self):
        return self.pebble.firmware_version.major >= 3