// Copyright (C) 2021 Toitware ApS.
// Use of this source code is governed by a Zero-Clause BSD license that can
// be found in the examples/LICENSE file.

// The standard BLE peripheral demo for simulating a heart rate monitor.

import ble show *
import system
import system show platform
import uuid show Uuid

GATT-IO-UUID ::= #[0x18, 0x25]

main:
  adapter := Adapter
  peripheral := adapter.peripheral

  service := peripheral.add-service
      BleUuid GATT-IO-UUID

  /* Characteristic: SEND DATA */
  heart-rate-send := service.add-notification-characteristic
      BleUuid #[0x63, 0x4b, 0x3c, 0x6e, 0xac, 0x41, 0x40, 0x85,
                0xa9, 0x7c, 0xdd, 0x68, 0x7f, 0xa1, 0xe5, 0x0d]

  /* Characteristic: RECEIVE DATA */
  heart-rate-receive := service.add-write-only-characteristic
      BleUuid #[0x63, 0x4b, 0x3c, 0x6e, 0x1c, 0x41, 0x40, 0x85,
                0xa9, 0x7c, 0xdd, 0x68, 0x7f, 0xa1, 0xe5, 0x0d]

  peripheral.deploy

  connection-mode := platform == system.PLATFORM-MACOS
      ? BLE-CONNECT-MODE-NONE
      : BLE-CONNECT-MODE-UNDIRECTIONAL
  peripheral.start-advertise
      --connection-mode=connection-mode
      AdvertisementData --name="Toit heart rate demo"

  task::
    simulated-heart-rate := 60
    while true:
      sleep --ms=500
      heart-rate-send.write #[0x06, simulated-heart-rate]
      simulated-heart-rate++
      if simulated-heart-rate == 130: simulated-heart-rate = 60

  while true:
    print
      "Heart rate app received data $(heart-rate-receive.read)"