InfiniTime.git

commit 3a49bbbae48a62d5252fee0cb6d04002d917c820

Author: JF <jf@codingfield.com>

Merge branch 'develop' of JF/PineTime into master

 CMakeLists.txt | 2 
 README.md | 12 ++++
 src/CMakeLists.txt | 4 +
 src/Components/Ble/BleController.h | 9 ++++
 src/Components/Ble/NimbleController.cpp | 7 ++
 src/Components/Ble/NimbleController.h | 2 
 src/Components/DateTime/DateTimeController.cpp | 3 
 src/Components/DateTime/DateTimeController.h | 3 
 src/DisplayApp/DisplayApp.cpp | 2 
 src/DisplayApp/Screens/ScreenList.cpp | 45 +++++++++++++++----
 src/DisplayApp/Screens/ScreenList.h | 8 ++
 src/SystemTask/SystemTask.cpp | 3 +
 src/SystemTask/SystemTask.h | 2 
 src/drivers/InternalFlash.cpp | 2 
 src/drivers/Watchdog.cpp | 22 ++++----
 src/graphics.cpp | 2 


diff --git a/CMakeLists.txt b/CMakeLists.txt
index 003be764039e2bd95008e88c6117fda8ec013100..c5cf78aa7283eb4fcb22432f8057cf158e83c436 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,5 +1,5 @@
 cmake_minimum_required(VERSION 3.10)
-project(pinetime VERSION 0.6.0 LANGUAGES C CXX ASM)
+project(pinetime VERSION 0.6.1 LANGUAGES C CXX ASM)
 
 set(NRF_TARGET "nrf52")
 




diff --git a/README.md b/README.md
index 30a92dc833c79ef925c87c593a67dc25ca5e6e34..42efda205d419ee637b9da882d4f52d5fa7500a0 100644
--- a/README.md
+++ b/README.md
@@ -92,15 +92,23 @@ GDB (Back Magic Probe)
 ```
 $ mkdir build
 $ cd build
-$ cmake -DARM_NONE_EABI_TOOLCHAIN_PATH=... -DNRF5_SDK_PATH=... -DUSE_GDB_CLIENT=1 -DGDB_CLIENT_BIN_PATH=... -DGDB_CLIENT_TARGET_REMOTE=... -DMERGEHEX=... ../
+$ cmake -DARM_NONE_EABI_TOOLCHAIN_PATH=... -DNRF5_SDK_PATH=... -DUSE_GDB_CLIENT=1 -DGDB_CLIENT_BIN_PATH=... -DGDB_CLIENT_TARGET_REMOTE=... ../
 ```
 
 OpenOCD (STlink v2 clones)
 ```
 $ mkdir build
 $ cd build
-$ cmake -DARM_NONE_EABI_TOOLCHAIN_PATH=... -DNRF5_SDK_PATH=... -DUSE_OPENOCD=1 -DGDB_CLIENT_BIN_PATH=[optional] -DMERGEHEX=... ../
+$ cmake -DARM_NONE_EABI_TOOLCHAIN_PATH=... -DNRF5_SDK_PATH=... -DUSE_OPENOCD=1 -DGDB_CLIENT_BIN_PATH=[optional] ../
 ```
+
+
+**Note** : By default, the build configuration *Release* is applied. It means that the code is built with optimisations enabled (-O3). If you wanto to compile in *Debug* mode to ease debugging and step-by-step debugging, specify the CMake variable `CMAKE_BUILD_TYPE` in the CMake command line:
+
+```
+-DCMAKE_BUILD_TYPE=Debug
+```
+ 
 
   * Make
 ```




diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 286a792a78c285bf50bc795e2af214ef6109453e..1609196a05d1cd1bfc8bad6a08c8a8a4e0132dc7 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -546,6 +546,10 @@ add_definitions(-DNRF52 -DNRF52832 -DNRF52832_XXAA -DNRF52_PAN_74 -DNRF52_PAN_64 -DNRF52_PAN_12 -DNRF52_PAN_58 -DNRF52_PAN_54 -DNRF52_PAN_31 -DNRF52_PAN_51 -DNRF52_PAN_36 -DNRF52_PAN_15 -DNRF52_PAN_20 -DNRF52_PAN_55 -DBOARD_PCA10040)
 add_definitions(-DFREERTOS)
 add_definitions(-DDEBUG_NRF_USER)
 
+if(NOT CMAKE_BUILD_TYPE)
+  set(CMAKE_BUILD_TYPE "Release")
+endif()
+
 # Build autonomous binary (without support for bootloader)
 set(EXECUTABLE_NAME "pinetime-app")
 set(NRF5_LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/gcc_nrf52.ld")




diff --git a/src/Components/Ble/BleController.h b/src/Components/Ble/BleController.h
index c47e65b64fab09b3e5f9865e482a155b8827668a..3f52ea258ae766453d150a91de3d0912899a4d56 100644
--- a/src/Components/Ble/BleController.h
+++ b/src/Components/Ble/BleController.h
@@ -2,12 +2,15 @@ #pragma once
 
 #include <FreeRTOS.h>
 #include <queue.h>
+#include <array>
 
 namespace Pinetime {
   namespace Controllers {
     class Ble {
       public:
+        using BleAddress = std::array<uint8_t, 6>;
         enum class FirmwareUpdateStates {Idle, Running, Validated, Error};
+        enum class AddressTypes { Public, Random };
 
         Ble() = default;
         bool IsConnected() const {return isConnected;}
@@ -24,12 +27,18 @@         bool IsFirmwareUpdating() const { return isFirmwareUpdating; }
         uint32_t FirmwareUpdateTotalBytes() const { return firmwareUpdateTotalBytes; }
         uint32_t FirmwareUpdateCurrentBytes() const { return firmwareUpdateCurrentBytes; }
         FirmwareUpdateStates State() const { return firmwareUpdateState; }
+
+        void Address(BleAddress&& addr) { address = addr; }
+        const BleAddress& Address() const { return address; }
+        void AddressType(AddressTypes t) { addressType = t;}
       private:
         bool isConnected = false;
         bool isFirmwareUpdating = false;
         uint32_t firmwareUpdateTotalBytes = 0;
         uint32_t firmwareUpdateCurrentBytes = 0;
         FirmwareUpdateStates firmwareUpdateState = FirmwareUpdateStates::Idle;
+        BleAddress address;
+        AddressTypes addressType;
 
     };
   }




diff --git a/src/Components/Ble/NimbleController.cpp b/src/Components/Ble/NimbleController.cpp
index 4c8035b7fb452c401b8ac6e1d51dccd741da901a..561dbce4b38a3363cf60fe9afc6a6cbc8d639c8a 100644
--- a/src/Components/Ble/NimbleController.cpp
+++ b/src/Components/Ble/NimbleController.cpp
@@ -90,8 +90,13 @@   ASSERT(res == 0);
   res = ble_hs_id_infer_auto(0, &addrType);
   ASSERT(res == 0);
   res = ble_svc_gap_device_name_set(deviceName);
+  ASSERT(res == 0);
+  Pinetime::Controllers::Ble::BleAddress address;
+  res = ble_hs_id_copy_addr(addrType, address.data(), nullptr);
+  ASSERT(res == 0);
+  bleController.AddressType((addrType == 0) ? Ble::AddressTypes::Public : Ble::AddressTypes::Random);
+  bleController.Address(std::move(address));
 
-  ASSERT(res == 0);
   res = ble_gatts_start();
   ASSERT(res == 0);
 }




diff --git a/src/Components/Ble/NimbleController.h b/src/Components/Ble/NimbleController.h
index 7e6806075bd8f8662cf638540436a9a496c5f2d6..cf50d78deaad9bf0b63dcef0dc6dd326ceeaa112 100644
--- a/src/Components/Ble/NimbleController.h
+++ b/src/Components/Ble/NimbleController.h
@@ -50,7 +50,7 @@         AlertNotificationService anService;
         AlertNotificationClient alertNotificationClient;
         CurrentTimeService currentTimeService;
 
-        uint8_t addrType;
+        uint8_t addrType; // 1 = Random, 0 = PUBLIC
         uint16_t connectionHandle;
 
         ble_uuid128_t dfuServiceUuid {




diff --git a/src/Components/DateTime/DateTimeController.cpp b/src/Components/DateTime/DateTimeController.cpp
index 5cfa08ebe896b82e8a930ede8dd4b32600bfdb40..30d9c13f2587a4d2a9a5a7f4196189b2932d5256 100644
--- a/src/Components/DateTime/DateTimeController.cpp
+++ b/src/Components/DateTime/DateTimeController.cpp
@@ -47,7 +47,8 @@   } else {
     previousSystickCounter = 0xffffff - (rest - systickCounter);
   }
 
-  currentDateTime += std::chrono::seconds (correctedDelta);
+  currentDateTime += std::chrono::seconds(correctedDelta);
+  uptime += std::chrono::seconds(correctedDelta);
 
   auto dp = date::floor<date::days>(currentDateTime);
   auto time = date::make_time(currentDateTime-dp);




diff --git a/src/Components/DateTime/DateTimeController.h b/src/Components/DateTime/DateTimeController.h
index 1e65bd112c5b8205d054993451d1952661a2a5aa..d6020745609e1ad6b5281b8f34c9397046fe1294 100644
--- a/src/Components/DateTime/DateTimeController.h
+++ b/src/Components/DateTime/DateTimeController.h
@@ -21,6 +21,7 @@         uint8_t Minutes() const { return minute; }
         uint8_t Seconds() const { return second; }
 
         std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> CurrentDateTime() const { return currentDateTime; }
+        std::chrono::seconds Uptime() const { return uptime; }
       private:
         uint16_t year = 0;
         Months month = Months::Unknown;
@@ -32,7 +33,7 @@         uint8_t second = 0;
 
         uint32_t previousSystickCounter = 0;
         std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> currentDateTime;
-
+        std::chrono::seconds uptime {0};
     };
   }
 }
\ No newline at end of file




diff --git a/src/DisplayApp/DisplayApp.cpp b/src/DisplayApp/DisplayApp.cpp
index 01c3aa96369e943f81c68c24b7e9ed6ed1e69762..8e35ef551de8692983266b9055fddc0a795854ff 100644
--- a/src/DisplayApp/DisplayApp.cpp
+++ b/src/DisplayApp/DisplayApp.cpp
@@ -185,7 +185,7 @@         currentScreen.reset(new Screens::Clock(this, dateTimeController, batteryController, bleController));
         onClockApp = true;
         break;
 //      case Apps::Test: currentScreen.reset(new Screens::Message(this)); break;
-      case Apps::SysInfo: currentScreen.reset(new Screens::ScreenList(this, dateTimeController, batteryController, brightnessController, watchdog)); break;
+      case Apps::SysInfo: currentScreen.reset(new Screens::ScreenList(this, dateTimeController, batteryController, brightnessController, bleController, watchdog)); break;
       case Apps::Meter: currentScreen.reset(new Screens::Meter(this)); break;
       case Apps::Gauge: currentScreen.reset(new Screens::Gauge(this)); break;
       case Apps::Brightness : currentScreen.reset(new Screens::Brightness(this, brightnessController)); break;




diff --git a/src/DisplayApp/Screens/ScreenList.cpp b/src/DisplayApp/Screens/ScreenList.cpp
index 93a9121200dff49a1e745f1dea4391b7b4732b9e..48f71649f3621c05e4adb7a40d5d56010aa6f73c 100644
--- a/src/DisplayApp/Screens/ScreenList.cpp
+++ b/src/DisplayApp/Screens/ScreenList.cpp
@@ -8,10 +8,15 @@ // TODO this class must be improved to receive the list of "sub screens" via pointer or
 // move operation.
 // It should accept many type of "sub screen" (it only supports Label for now).
 // The number of sub screen it supports must be dynamic.
-ScreenList::ScreenList(Pinetime::Applications::DisplayApp *app, Pinetime::Controllers::DateTime &dateTimeController,
-        Pinetime::Controllers::Battery& batteryController, Pinetime::Controllers::BrightnessController& brightnessController, Pinetime::Drivers::WatchdogView& watchdog) :
+ScreenList::ScreenList(Pinetime::Applications::DisplayApp *app,
+        Pinetime::Controllers::DateTime &dateTimeController,
+        Pinetime::Controllers::Battery& batteryController,
+        Pinetime::Controllers::BrightnessController& brightnessController,
+                       Pinetime::Controllers::Ble& bleController,
+        Pinetime::Drivers::WatchdogView& watchdog) :
         Screen(app),
-        dateTimeController{dateTimeController}, batteryController{batteryController}, brightnessController{brightnessController}, watchdog{watchdog} {
+        dateTimeController{dateTimeController}, batteryController{batteryController},
+        brightnessController{brightnessController}, bleController{bleController}, watchdog{watchdog} {
   screens.reserve(3);
 
   // TODO all of this is far too heavy (string processing). This should be improved.
@@ -43,27 +48,45 @@       default: return "?";
     }
   }();
 
+  // uptime
+  static constexpr uint32_t secondsInADay = 60*60*24;
+  static constexpr uint32_t secondsInAnHour = 60*60;
+  static constexpr uint32_t secondsInAMinute = 60;
+  uint32_t uptimeSeconds = dateTimeController.Uptime().count();
+  uint32_t uptimeDays = (uptimeSeconds / secondsInADay);
+  uptimeSeconds = uptimeSeconds % secondsInADay;
+  uint32_t uptimeHours = uptimeSeconds / secondsInAnHour;
+  uptimeSeconds = uptimeSeconds % secondsInAnHour;
+  uint32_t uptimeMinutes = uptimeSeconds / secondsInAMinute;
+  uptimeSeconds = uptimeSeconds % secondsInAMinute;
+  // TODO handle more than 100 days of uptime
 
   sprintf(t1, "Pinetime\n"
               "Version:%d.%d.%d\n"
-              "Build: xx/xx/xxxx\n"
+              "Build: %s\n"
+              "       %s\n"
+              "Date: %02d/%02d/%04d\n"
               "Time: %02d:%02d:%02d\n"
-              "date: %02d/%02d/%04d\n"
-              "Uptime: xd xxhxx:xx\n"
+              "Uptime: %02lud %02lu:%02lu:%02lu\n"
               "Battery: %d%%\n"
               "Backlight: %d/3\n"
-              "Last reset: %s\n"
-              "BLE MAC: \n  AA:BB:CC:DD:EE:FF", Version::Major(), Version::Minor(), Version::Patch(),
-              dateTimeController.Hours(), dateTimeController.Minutes(), dateTimeController.Seconds(),
+              "Last reset: %s\n",
+              Version::Major(), Version::Minor(), Version::Patch(),
+              __DATE__, __TIME__,
               dateTimeController.Day(), dateTimeController.Month(), dateTimeController.Year(),
+              dateTimeController.Hours(), dateTimeController.Minutes(), dateTimeController.Seconds(),
+              uptimeDays, uptimeHours, uptimeMinutes, uptimeSeconds,
               batteryPercent, brightness, resetReason);
 
   screens.emplace_back(t1);
 
-  strncpy(t2, "Hello from\nthe developper!", 27);
+  auto& bleAddr = bleController.Address();
+  sprintf(t2, "BLE MAC: \n  %2x:%2x:%2x:%2x:%2x:%2x",
+          bleAddr[5], bleAddr[4], bleAddr[3], bleAddr[2], bleAddr[1], bleAddr[0]);
   screens.emplace_back(t2);
 
-  strncpy(t3, "Place holder\nin case we need\nmore room!", 40);
+  strncpy(t3, "Hello from\nthe developper!", 27);
+
   screens.emplace_back(t3);
 
   auto &screen = screens[screenIndex];




diff --git a/src/DisplayApp/Screens/ScreenList.h b/src/DisplayApp/Screens/ScreenList.h
index ad093d3591ea844f19a432f30769add2608ddcbc..b0ee016b2ea03433d270c7dbd1000c6e5e9f9e91 100644
--- a/src/DisplayApp/Screens/ScreenList.h
+++ b/src/DisplayApp/Screens/ScreenList.h
@@ -1,6 +1,7 @@
 #pragma once
 
 #include <vector>
+#include <Components/Ble/NimbleController.h>
 #include "Screen.h"
 #include "Label.h"
 
@@ -13,6 +14,7 @@           explicit ScreenList(DisplayApp* app,
                               Pinetime::Controllers::DateTime& dateTimeController,
                               Pinetime::Controllers::Battery& batteryController,
                               Pinetime::Controllers::BrightnessController& brightnessController,
+                              Pinetime::Controllers::Ble& bleController,
                               Pinetime::Drivers::WatchdogView& watchdog);
           ~ScreenList() override;
           bool Refresh() override;
@@ -27,11 +29,13 @@           std::vector screens;
           Pinetime::Controllers::DateTime& dateTimeController;
           Pinetime::Controllers::Battery& batteryController;
           Pinetime::Controllers::BrightnessController& brightnessController;
+          Pinetime::Controllers::Ble& bleController;
           Pinetime::Drivers::WatchdogView& watchdog;
+
 
           char t1[200];
-          char t2[30];
-          char t3[42];
+          char t2[200];
+          char t3[30];
       };
     }
   }




diff --git a/src/SystemTask/SystemTask.cpp b/src/SystemTask/SystemTask.cpp
index b0f58d176818f328faf1b3ebc846b3fb6caf06be..61b3c6383c9c905a0851c6dfe7a9e3b50a7a5aaa 100644
--- a/src/SystemTask/SystemTask.cpp
+++ b/src/SystemTask/SystemTask.cpp
@@ -16,6 +16,8 @@
 using namespace Pinetime::System;
 
 void IdleTimerCallback(TimerHandle_t xTimer) {
+
+  NRF_LOG_INFO("IdleTimerCallback");
   auto sysTask = static_cast<SystemTask *>(pvTimerGetTimerID(xTimer));
   sysTask->OnIdle();
 }
@@ -113,6 +115,7 @@           nimbleController.StartAdvertising();
           break;
         case Messages::GoToSleep:
           NRF_LOG_INFO("[SystemTask] Going to sleep");
+          xTimerStop(idleTimer, 0);
           displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::GoToSleep);
           isSleeping = true;
           break;




diff --git a/src/SystemTask/SystemTask.h b/src/SystemTask/SystemTask.h
index b6ecf7c933d20d6885063f9023d3682049cb3a3b..ab5f7010ab75cd2596a0f57cedede4defc328c2b 100644
--- a/src/SystemTask/SystemTask.h
+++ b/src/SystemTask/SystemTask.h
@@ -67,7 +67,7 @@         static void Process(void* instance);
         void Work();
         bool isBleDiscoveryTimerRunning = false;
         uint8_t bleDiscoveryTimer = 0;
-        static constexpr uint32_t idleTime = 5000;
+        static constexpr uint32_t idleTime = 15000;
         TimerHandle_t idleTimer;
         bool doNotGoToSleep = false;
 




diff --git a/src/drivers/InternalFlash.cpp b/src/drivers/InternalFlash.cpp
index bc89ff1ad8aadb614dbfbf8b2599ec097ef30193..db705d78f4eab1b524fd782a6ecee036156f44bf 100644
--- a/src/drivers/InternalFlash.cpp
+++ b/src/drivers/InternalFlash.cpp
@@ -1,4 +1,4 @@
-#include <sdk/modules/nrfx/mdk/nrf.h>
+#include <mdk/nrf.h>
 #include "InternalFlash.h"
 using namespace Pinetime::Drivers;
 




diff --git a/src/drivers/Watchdog.cpp b/src/drivers/Watchdog.cpp
index 850fd2f1b71ab073a94862602db414f3ffa3d054..11da12111407128e6b98a82ca0c604b9112aa011 100644
--- a/src/drivers/Watchdog.cpp
+++ b/src/drivers/Watchdog.cpp
@@ -32,17 +32,17 @@   NRF_WDT->RR[0] = WDT_RR_RR_Reload;
 }
 
 Watchdog::ResetReasons Watchdog::ActualResetReason() const {
-  uint32_t resetReason;
-//  sd_power_reset_reason_get(&resetReason);
-//  sd_power_reset_reason_clr(0xFFFFFFFF);
-//  if(resetReason & 0x01u) return ResetReasons::ResetPin;
-//  if((resetReason >> 1u) & 0x01u) return ResetReasons::Watchdog;
-//  if((resetReason >> 2u) & 0x01u) return ResetReasons::SoftReset;
-//  if((resetReason >> 3u) & 0x01u) return ResetReasons::CpuLockup;
-//  if((resetReason >> 16u) & 0x01u) return ResetReasons::SystemOff;
-//  if((resetReason >> 17u) & 0x01u) return ResetReasons::LpComp;
-//  if((resetReason >> 18u) & 0x01u) return ResetReasons::DebugInterface;
-//  if((resetReason >> 19u) & 0x01u) return ResetReasons::NFC;
+  uint32_t reason = NRF_POWER->RESETREAS;
+  NRF_POWER->RESETREAS = 0xffffffff;
+
+  if(reason & 0x01u) return ResetReasons::ResetPin;
+  if((reason >> 1u) & 0x01u) return ResetReasons::Watchdog;
+  if((reason >> 2u) & 0x01u) return ResetReasons::SoftReset;
+  if((reason >> 3u) & 0x01u) return ResetReasons::CpuLockup;
+  if((reason >> 16u) & 0x01u) return ResetReasons::SystemOff;
+  if((reason >> 17u) & 0x01u) return ResetReasons::LpComp;
+  if((reason) & 0x01u) return ResetReasons::DebugInterface;
+  if((reason >> 19u) & 0x01u) return ResetReasons::NFC;
   return ResetReasons::HardReset;
 }
 




diff --git a/src/graphics.cpp b/src/graphics.cpp
index d95ba3fa697baabe0c5a3d9652ad19b3ab6c84ec..8c39c89a0ae6580a405d8b369641cdcc64650ede 100644
--- a/src/graphics.cpp
+++ b/src/graphics.cpp
@@ -3,7 +3,7 @@ #include 
 #include <drivers/SpiMaster.h>
 #include <drivers/Spi.h>
 #include <drivers/SpiNorFlash.h>
-#include <sdk/components/libraries/log/nrf_log.h>
+#include <libraries/log/nrf_log.h>
 #include "bootloader/boot_graphics.h"
 #include <FreeRTOS.h>
 #include <task.h>