Skip to content
Permalink

Comparing changes

This is a direct comparison between two commits made in this repository or its related repositories. View the default comparison for this range or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: InfiniTimeOrg/InfiniTime
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: be0d71f7dec57dc56ebdc8ccbce37f7a26abb48d
Choose a base ref
..
head repository: InfiniTimeOrg/InfiniTime
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 4687ffa7dae22db847da6bb2b653a98f855ab109
Choose a head ref
Showing with 623 additions and 685 deletions.
  1. +4 −2 .clang-format
  2. +2 −14 .github/workflows/lv_sim.yml
  3. +23 −150 .github/workflows/main.yml
  4. +3 −3 bootloader/README.md
  5. +1 −0 bootloader/ota-dfu-python/.gitignore
  6. +2 −2 bootloader/ota-dfu-python/ble_secure_dfu_controller.py
  7. +3 −3 cmake-nRF5x/readme.md
  8. +2 −2 doc/MemoryAnalysis.md
  9. +1 −1 doc/NavigationService.md
  10. +1 −1 doc/PinetimeStubWithNrf52DK.md
  11. +2 −2 doc/ble.md
  12. +1 −1 doc/ble/connection_sequence.puml
  13. +1 −1 doc/branches.md
  14. +2 −2 doc/buildAndProgram.md
  15. +23 −33 doc/buildWithDocker.md
  16. +0 −5 docker/Dockerfile
  17. +6 −10 docker/build.sh
  18. +4 −6 docker/post_build.sh.in
  19. +2 −2 nrf52.svd
  20. +6 −2 src/BootloaderVersion.cpp
  21. +1 −0 src/BootloaderVersion.h
  22. +1 −2 src/components/alarm/AlarmController.cpp
  23. +5 −2 src/components/ble/AlertNotificationClient.cpp
  24. +1 −0 src/components/ble/BatteryInformationService.h
  25. +15 −4 src/components/ble/CurrentTimeClient.cpp
  26. +15 −4 src/components/ble/CurrentTimeService.cpp
  27. +11 −9 src/components/ble/DfuService.cpp
  28. +6 −6 src/components/ble/FSService.cpp
  29. +4 −3 src/components/ble/HeartRateService.cpp
  30. +14 −18 src/components/ble/MotionService.cpp
  31. +10 −11 src/components/ble/MusicService.cpp
  32. +17 −9 src/components/ble/NavigationService.cpp
  33. +1 −1 src/components/ble/NimbleController.cpp
  34. +2 −1 src/components/ble/weather/WeatherService.h
  35. +18 −12 src/components/datetime/DateTimeController.cpp
  36. +2 −2 src/components/fs/FS.cpp
  37. +1 −1 src/components/fs/FS.h
  38. +3 −3 src/components/settings/Settings.cpp
  39. +13 −14 src/components/settings/Settings.h
  40. +1 −1 src/components/timer/TimerController.cpp
  41. +36 −18 src/displayapp/Colors.cpp
  42. +26 −8 src/displayapp/DisplayApp.cpp
  43. +1 −1 src/displayapp/DisplayApp.h
  44. +0 −2 src/displayapp/DisplayAppRecovery.cpp
  45. +3 −1 src/displayapp/DisplayAppRecovery.h
  46. +0 −2 src/displayapp/DummyLittleVgl.h
  47. +9 −4 src/displayapp/LittleVgl.cpp
  48. +1 −1 src/displayapp/fonts/generate.py
  49. 0 src/displayapp/icons/music/{disc.cpp → disc.c}
  50. 0 src/displayapp/icons/music/{disc_f_1.cpp → disc_f_1.c}
  51. 0 src/displayapp/icons/music/{disc_f_2.cpp → disc_f_2.c}
  52. +6 −2 src/displayapp/screens/Alarm.cpp
  53. +2 −2 src/displayapp/screens/Alarm.h
  54. +1 −0 src/displayapp/screens/BatteryIcon.h
  55. +13 −4 src/displayapp/screens/Clock.cpp
  56. +1 −2 src/displayapp/screens/Error.cpp
  57. +1 −0 src/displayapp/screens/Error.h
  58. +2 −1 src/displayapp/screens/FirmwareValidation.cpp
  59. +3 −3 src/displayapp/screens/FlashLight.cpp
  60. +1 −1 src/displayapp/screens/Metronome.h
  61. +3 −3 src/displayapp/screens/Music.cpp
  62. +2 −2 src/displayapp/screens/Notifications.cpp
  63. +1 −1 src/displayapp/screens/Paddle.cpp
  64. +0 −1 src/displayapp/screens/PassKey.cpp
  65. +1 −1 src/displayapp/screens/Screen.h
  66. +6 −2 src/displayapp/screens/ScreenList.h
  67. +6 −2 src/displayapp/screens/StopWatch.cpp
  68. +2 −1 src/displayapp/screens/Tile.cpp
  69. +21 −23 src/displayapp/screens/WatchFaceAnalog.cpp
  70. +12 −4 src/displayapp/screens/WatchFaceDigital.cpp
  71. +7 −7 src/displayapp/screens/WatchFacePineTimeStyle.cpp
  72. +7 −7 src/displayapp/screens/WatchFacePineTimeStyle.h
  73. +1 −1 src/displayapp/screens/WatchFaceTerminal.cpp
  74. +3 −3 src/displayapp/screens/settings/QuickSettings.cpp
  75. +0 −1 src/displayapp/screens/settings/SettingBluetooth.cpp
  76. +1 −1 src/displayapp/screens/settings/SettingDisplay.cpp
  77. +10 −10 src/displayapp/screens/settings/SettingSetDate.cpp
  78. +24 −24 src/displayapp/screens/settings/SettingSetDate.h
  79. +4 −4 src/displayapp/screens/settings/SettingShakeThreshold.cpp
  80. +2 −2 src/displayapp/screens/settings/SettingShakeThreshold.h
  81. +11 −16 src/displayapp/screens/settings/SettingSteps.cpp
  82. +17 −15 src/displayapp/screens/settings/Settings.cpp
  83. +2 −2 src/drivers/Bma421_C/bma4.c
  84. +1 −1 src/drivers/Bma421_C/bma4_defs.h
  85. +3 −8 src/drivers/Cst816s.cpp
  86. +6 −5 src/drivers/Cst816s.h
  87. +5 −5 src/drivers/DebugPins.cpp
  88. +14 −12 src/drivers/PinMap.h
  89. +1 −1 src/drivers/SpiMaster.cpp
  90. +15 −7 src/drivers/SpiNorFlash.cpp
  91. +7 −13 src/drivers/TwiMaster.cpp
  92. +1 −1 src/heartratetask/HeartRateTask.cpp
  93. +3 −5 src/main.cpp
  94. +0 −1 src/recoveryLoader.cpp
  95. +9 −9 src/sdk_config.h
  96. +32 −32 src/systemtask/Messages.h
  97. +8 −7 src/systemtask/SystemMonitor.cpp
  98. +16 −25 src/systemtask/SystemTask.cpp
  99. +22 −22 src/touchhandler/TouchHandler.h
  100. +1 −1 tools/rle_encode.py
6 changes: 4 additions & 2 deletions .clang-format
Original file line number Diff line number Diff line change
@@ -8,9 +8,9 @@ AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Right
AlignOperands: Align
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllArgumentsOnNextLine: false
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: None
@@ -83,6 +83,8 @@ IndentGotoLabels: true
IndentPPDirectives: BeforeHash
IndentWidth: 2
IndentWrappedFunctionNames: false
# Requires Clang >= 15, could also cause incorrect code formatting:
# InsertBraces: true
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true
16 changes: 2 additions & 14 deletions .github/workflows/lv_sim.yml
Original file line number Diff line number Diff line change
@@ -1,24 +1,15 @@
# GitHub Actions Workflow to build Simulator for PineTime Smart Watch LVGL Interface

# Name of this Workflow
name: Build PineTime LVGL Simulator

# When to run this Workflow...
on:

# Run this Workflow when files are updated (Pushed) in the "master" and "develop" Branch
push:
branches: [ master, develop ]

# Also run this Workflow when a Pull Request is created or updated in the "master" and "develop" Branch
pull_request:
branches: [ master, develop ]

# Steps to run for the Workflow
jobs:
build:

# Run these steps on Ubuntu
runs-on: ubuntu-latest

steps:
@@ -64,15 +55,12 @@ jobs:
#########################################################################################
# Build and Upload simulator

# For Debugging Builds: Remove "make" option "-j" for clearer output. Add "--trace" to see details.
# For Faster Builds: Add "make" option "-j"

- name: Build simulator executable
run: |
cmake --build build_lv_sim
- name: Upload simulator executable
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v3
with:
name: infinisim
name: infinisim-${{ github.head_ref }}
path: build_lv_sim/infinisim
173 changes: 23 additions & 150 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
@@ -3,172 +3,45 @@
# Based on https://github.com/JF002/InfiniTime/blob/master/doc/buildAndProgram.md
# and https://github.com/JF002/InfiniTime/blob/master/bootloader/README.md

# Name of this Workflow
name: Build PineTime Firmware

# When to run this Workflow...
on:

# Run this Workflow when files are updated (Pushed) in the "master" and "develop" Branch
push:
branches: [ master, develop ]

# Also run this Workflow when a Pull Request is created or updated in the "master" and "develop" Branch
pull_request:
branches: [ master, develop ]

# Steps to run for the Workflow
jobs:
build:

# Run these steps on Ubuntu
runs-on: ubuntu-latest

container:
image: infinitime/infinitime-build
steps:

#########################################################################################
# Download and Cache Dependencies

- name: Install cmake
uses: lukka/get-cmake@v3.18.3

- name: Check cache for Embedded Arm Toolchain arm-none-eabi-gcc
id: cache-toolchain
uses: actions/cache@v2
env:
cache-name: cache-toolchain-9-2020-q2
with:
path: ${{ runner.temp }}/arm-none-eabi
key: ${{ runner.os }}-build-${{ env.cache-name }}
restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}

- name: Install Embedded Arm Toolchain arm-none-eabi-gcc
if: steps.cache-toolchain.outputs.cache-hit != 'true' # Install toolchain if not found in cache
uses: fiam/arm-none-eabi-gcc@v1.0.4
with:
# GNU Embedded Toolchain for Arm release name, in the V-YYYY-qZ format (e.g. "9-2019-q4")
release: 9-2020-q2
# Directory to unpack GCC to. Defaults to a temporary directory.
directory: ${{ runner.temp }}/arm-none-eabi

- name: Check cache for nRF5 SDK
id: cache-nrf5sdk
uses: actions/cache@v2
env:
cache-name: cache-nrf5sdk
with:
path: ${{ runner.temp }}/nrf5_sdk
key: ${{ runner.os }}-build-${{ env.cache-name }}
restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}

- name: Install nRF5 SDK
if: steps.cache-nrf5sdk.outputs.cache-hit != 'true' # Install SDK if not found in cache
run: |
cd ${{ runner.temp }}
curl https://developer.nordicsemi.com/nRF5_SDK/nRF5_SDK_v15.x.x/nRF5_SDK_15.3.0_59ac345.zip -o nrf5_sdk.zip
unzip nrf5_sdk.zip
mv nRF5_SDK_15.3.0_59ac345 nrf5_sdk
- name: Check cache for MCUBoot
id: cache-mcuboot
uses: actions/cache@v2
env:
cache-name: cache-mcuboot
with:
path: ${{ runner.temp }}/mcuboot
key: ${{ runner.os }}-build-${{ env.cache-name }}
restore-keys: ${{ runner.os }}-build-${{ env.cache-name }}

- name: Install MCUBoot
if: steps.cache-mcuboot.outputs.cache-hit != 'true' # Install MCUBoot if not found in cache
run: |
cd ${{ runner.temp }}
git clone --branch v1.7.2 https://github.com/mcu-tools/mcuboot
- name: Install imgtool dependencies
run: |
pip3 install --user -r ${{ runner.temp }}/mcuboot/scripts/requirements.txt
- name: Install adafruit-nrfutil
run: |
pip3 install --user wheel
pip3 install --user setuptools
pip3 install --user adafruit-nrfutil
- name: Install lv_font_conv
run:
npm i -g lv_font_conv@1.5.2

#########################################################################################
# Checkout

# This workaround fixes the error "unsafe repository (REPO is owned by someone else)".
# See https://github.com/actions/checkout/issues/760 and https://github.com/actions/checkout/issues/766
# The fix in "actions/checkout@v2" was not sufficient as the build process also uses git (to get the current
# commit hash, for example).
- name: Workaround permission issues
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
- name: Checkout source files
uses: actions/checkout@v2
with:
submodules: recursive

- name: Show files
run: set ; pwd ; ls -l

#########################################################################################
# CMake

- name: CMake
run: |
mkdir -p build
cd build
cmake -G Ninja -DARM_NONE_EABI_TOOLCHAIN_PATH=${{ runner.temp }}/arm-none-eabi -DNRF5_SDK_PATH=${{ runner.temp }}/nrf5_sdk -DUSE_OPENOCD=1 -DBUILD_DFU=1 ../
#########################################################################################
# Make and Upload DFU Package
# pinetime-mcuboot-app.img must be flashed at address 0x8000 in the internal flash memory with OpenOCD:
# program image.bin 0x8000

# For Debugging Builds: Remove "make" option "-j" for clearer output. Add "--trace" to see details.
# For Faster Builds: Add "make" option "-j"

- name: Make pinetime-mcuboot-app
run: |
cmake --build build --target pinetime-mcuboot-app
- name: Build
shell: bash
env:
SOURCES_DIR: .
run: /opt/build.sh all
# Unzip the package because Upload Artifact will zip up the files
- name: Unzip DFU package
run: |
# Unzip the package because Upload Artifact will zip up the files
unzip build/src/pinetime-mcuboot-app-dfu*.zip -d build/src/pinetime-mcuboot-app-dfu
- name: Upload DFU package
uses: actions/upload-artifact@v2
run: unzip ./build/output/pinetime-mcuboot-app-dfu-*.zip -d ./build/output/pinetime-mcuboot-app-dfu
- name: Upload DFU artifacts
uses: actions/upload-artifact@v3
with:
name: pinetime-mcuboot-app-dfu
path: build/src/pinetime-mcuboot-app-dfu/*

#########################################################################################
# Make and Upload Standalone Firmware

- name: Make pinetime-app
run: |
cmake --build build --target pinetime-app
- name: Upload standalone firmware
uses: actions/upload-artifact@v2
name: InfiniTime DFU ${{ github.head_ref }}
path: ./build/output/pinetime-mcuboot-app-dfu/*
- name: Upload MCUBoot image artifacts
uses: actions/upload-artifact@v3
with:
name: pinetime-app.out
path: build/src/pinetime-app*.out

#########################################################################################
# Make but don't Upload the Recovery Firmware to be sure it builds correctly

- name: Make pinetime-recovery
run: |
cmake --build build --target pinetime-recovery
#########################################################################################
# Finish

- name: Find output
run: |
find . -name "pinetime-app.*" -ls
find . -name "pinetime-mcuboot-app.*" -ls
# Embedded Arm Toolchain and nRF5 SDK will only be cached if the build succeeds.
# So make sure that the first build always succeeds, e.g. comment out the "Make" step.
name: InfiniTime MCUBoot image ${{ github.head_ref }}
path: ./build/output/pinetime-mcuboot-app-image-*.bin
6 changes: 3 additions & 3 deletions bootloader/README.md
Original file line number Diff line number Diff line change
@@ -9,14 +9,14 @@ Integrating a BLE stack for the OTA functionality would have used to much memory

When it is run, this bootloader looks in the SPI flash memory if a new firmware is available. It there is one, it *swaps* the current firmware with the new one (the new one is copied in the main flash memory, and the current one is copied in the SPI flash memory) and run the new one. If the new one fails to run properly, the bootloader is able to revert to the old one and mark the new one as not working.

As this bootloader does not provide any OTA capability, it is not able to actually download a new version of the application. Providing OTA functionality is thus the responsability of the application firmware.
As this bootloader does not provide any OTA capability, it is not able to actually download a new version of the application. Providing OTA functionality is thus the responsibility of the application firmware.

# About MCUBoot
MCUBoot is run at boot time. In normal operation, it just jumps to the reset handler of the application firmware to run it. Once the application firmware is running, MCUBoot does not run at all.

![MCUBoot boot sequence diagram](../doc/bootloader/boot.png "MCUBoot boot sequence diagram")

But MCUBoot does much more than that : it can upgrade the firmware that is currently running by a new one, and it is also able to revert to the previous version of the firmware in case the new one does not run propertly.
But MCUBoot does much more than that : it can upgrade the firmware that is currently running by a new one, and it is also able to revert to the previous version of the firmware in case the new one does not run properly.

To do this, it uses 2 memory 'slots' :
- **The primary slot** : it contains the current firmware, the one that will be executed by MCUBoot
@@ -40,7 +40,7 @@ This chapter describes degraded cases that are handled by our bootloader and tho
Case | Current bootloader | Solution
-----|--------------------|----------------------------------------------
Data got corrupted during file transfer | [OK] Application firmware does a CRC check before applying the update, and does not proceed if it fails. | N/A
New firmware does not run at all (bad file) (1) | [NOK] MCU executes unknown instructions and will most likely end up in an infinite loop or freeze in an error handler. The bootloader does not run, it can do nothing, the MCU is stucked until next reset | [OK] The bootloader starts the watchdog just before running the new firmware. This way, the watchdog will reset the MCU after ~7s because the firmware does not refresh it. Bootloader reverts to the previous version of the firmware during the reset.
New firmware does not run at all (bad file) (1) | [NOK] MCU executes unknown instructions and will most likely end up in an infinite loop or freeze in an error handler. The bootloader does not run, it can do nothing, the MCU is stuck until next reset | [OK] The bootloader starts the watchdog just before running the new firmware. This way, the watchdog will reset the MCU after ~7s because the firmware does not refresh it. Bootloader reverts to the previous version of the firmware during the reset.
New firmware runs, does not set the valid bit and does not refresh the watchdog | [NOK] The new firmware runs until the next reset. The bootloader will be able to revert to the previous firmware only during the next reset. If the new firmware does not run properly and does not reset, the bootloader can do nothing until the next reset | [OK] The bootloader starts the watchdog just before running the new firmware. This way, the watchdog will reset the MCU after ~7s because the firmware does not refresh it. Bootloader reverts to the previous version of the firmware during the reset.
New firmware does not run properly, does not set the valid bit but refreshes the watchdog | [NOK] The bootloader will be able to revert to the previous firmware only during the next reset. If the new firmware does not run properly and does not reset, the bootloader can do nothing until the next reset | [~] Wait for the battery to drain. The CPU will reset the next time the device is charged and will be able to rollback to the previous version.
New firmware does not run properly but sets the valid bit and refreshes the watchdog | [NOK] The bootloader won't revert to the previous version because the valid flag is set | [~] Wait for the battery to drain. The CPU will reset the next time the device is charged. Then, the bootloader must provide a way for the user to force the rollback to the previous version
1 change: 1 addition & 0 deletions bootloader/ota-dfu-python/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
__pycache__
4 changes: 2 additions & 2 deletions bootloader/ota-dfu-python/ble_secure_dfu_controller.py
Original file line number Diff line number Diff line change
@@ -236,7 +236,7 @@ def _dfu_send_init(self):
self._dfu_send_command(Procedures.EXECUTE)
self._wait_and_parse_notify()

print("Init packet successfully transfered")
print("Init packet successfully transferred")

# --------------------------------------------------------------------------
# Send the Firmware image to peripheral device.
@@ -319,5 +319,5 @@ def _dfu_send_object(self, offset, obj_max_size):
self._dfu_send_command(Procedures.EXECUTE)
self._wait_and_parse_notify()

# If everything executed correctly, return amount of bytes transfered
# If everything executed correctly, return amount of bytes transferred
return obj_max_size
6 changes: 3 additions & 3 deletions cmake-nRF5x/readme.md
Original file line number Diff line number Diff line change
@@ -7,19 +7,19 @@ Cmake script for projects targeting Nordic Semiconductor nRF5x series devices us
The script makes use of the following tools:

- nRF5x SDK by Nordic Semiconductor - SoC specific drivers and libraries (also includes a lot of examples)
- JLink by Segger - interface software for the JLink familiy of programmers
- JLink by Segger - interface software for the JLink family of programmers
- nrfjprog by Nordic Semiconductor - Wrapper utility around JLink
- arm-non-eabi-gcc by ARM and the GCC Team - compiler toolchain for embedded (= bare metal) ARM chips

# Setup

1. Download this repo (or add as submodule) to the directory `cmake-nRF5x` in your project

1. Search the SDK `example` directory for a `sdk_config.h`, `main.c` and a linker script (normally named `<project_name>_gcc_<chip familly>.ld`) that fits your chip and project needs.
1. Search the SDK `example` directory for a `sdk_config.h`, `main.c` and a linker script (normally named `<project_name>_gcc_<chip family>.ld`) that fits your chip and project needs.

1. Copy the `sdk_config.h` and the project `main.c` into a new directory `src`. Modify them as required for your project.

1. Copy the linker script into the root of your project. Rename it to just `gcc_<chip familly>.ld` For example:
1. Copy the linker script into the root of your project. Rename it to just `gcc_<chip family>.ld` For example:

```
gcc_nrf51.ld
4 changes: 2 additions & 2 deletions doc/MemoryAnalysis.md
Original file line number Diff line number Diff line change
@@ -60,7 +60,7 @@ Puncover is really easy to install:
- Launch a browser at http://localhost:5000/

### Analysis
Using the MAP file and tools, we can easily see what symbols are using most of the flash memory. In this case, unsuprisingly, fonts and graphics are the largest use of flash memory.
Using the MAP file and tools, we can easily see what symbols are using most of the flash memory. In this case, unsurprisingly, fonts and graphics are the largest use of flash memory.

![Puncover](./memoryAnalysis/puncover-all-symbols.png)

@@ -150,7 +150,7 @@ You can then display the file using objdump:
hexdump ram.bin -v | less
```

The stack is positionned at the end of the RAM -> 0xFFFF. Its size is 8192 bytes, so the end of the stack is at 0xE000.
The stack is positioned at the end of the RAM -> 0xFFFF. Its size is 8192 bytes, so the end of the stack is at 0xE000.
On the following dump, the maximum stack usage is 520 bytes (0xFFFF - 0xFDF8):

```
2 changes: 1 addition & 1 deletion doc/NavigationService.md
Original file line number Diff line number Diff line change
@@ -13,7 +13,7 @@ The service UUID is 00010000-78fc-48fe-8e23-433b3a1942d0

## Characteristics
## Flags (UUID 00010001-78fc-48fe-8e23-433b3a1942d0)
All included icons are from pure-maps, which provides the actual routing from the client. The icon names ultimately come from the mapbox project "direction-icons", See https://github.com/rinigus/pure-maps/tree/master/qml/icons/navigation See the end of this document for the full lsit of supported icon names.
All included icons are from pure-maps, which provides the actual routing from the client. The icon names ultimately come from the mapbox project "direction-icons", See https://github.com/rinigus/pure-maps/tree/master/qml/icons/navigation See the end of this document for the full list of supported icon names.

## Narrative (UUID 00010002-78fc-48fe-8e23-433b3a1942d0)
This is a client supplied string describing the upcoming instruction such as "At the roundabout take the first exit".
2 changes: 1 addition & 1 deletion doc/PinetimeStubWithNrf52DK.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# Build a stub for PineTime using NRF52-DK
[NRF52-DK](https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52-DK) is the official developpment kit for the NRF52832 SoC from Nordic Semiconductor used in the PineTime.
[NRF52-DK](https://www.nordicsemi.com/Software-and-Tools/Development-Kits/nRF52-DK) is the official development kit for the NRF52832 SoC from Nordic Semiconductor used in the PineTime.

This development kit can be very useful for PineTime development:
* You can use its embedded JLink SWD programmer/debugger to program and debug your code on the PineTime
4 changes: 2 additions & 2 deletions doc/ble.md
Original file line number Diff line number Diff line change
@@ -146,14 +146,14 @@ The new alert characteristic allows sending new notifications to InfiniTime. It
For example, here is what a normal notification looks like in Golang (language of `itd`):

```go
// \x00 is the category for simple alert, and there is one new notifcation, hence \x01.
// \x00 is the category for simple alert, and there is one new notification, hence \x01.
"\x00\x01\x00Test Title\x00Test Body"
```

A call notification looks like so:

```go
// \x03 is the category for calls, and there is one new call notifcation, hence \x01.
// \x03 is the category for calls, and there is one new call notification, hence \x01.
"\x03\x01\x00Mary"
```

2 changes: 1 addition & 1 deletion doc/ble/connection_sequence.puml
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@ Pinetime --> CompanionApp: Start advertising

group BLE Connection
CompanionApp -> Pinetime: Connection request
CompanionApp <-> Pinetime: Connection parameters negociation, security procedure,...
CompanionApp <-> Pinetime: Connection parameters negotiation, security procedure,...
end

group Service Discovery
Loading