Merge branch 'develop' into notify-battery-level
# Conflicts: # src/displayapp/screens/BatteryInfo.cpp
This commit is contained in:
		
						commit
						3e70554844
					
				@ -53,6 +53,7 @@ As of now, here is the list of achievements of this project:
 | 
				
			|||||||
    * Two (2048 clone game)
 | 
					    * Two (2048 clone game)
 | 
				
			||||||
    * Stopwatch (with all the necessary functions such as play, pause, lap, stop)
 | 
					    * Stopwatch (with all the necessary functions such as play, pause, lap, stop)
 | 
				
			||||||
    * Motion sensor and step counter (displays the number of steps and the state of the motion sensor in real-time)
 | 
					    * Motion sensor and step counter (displays the number of steps and the state of the motion sensor in real-time)
 | 
				
			||||||
 | 
					    * Metronome (vibrates to a given bpm with a customizable beats per bar)
 | 
				
			||||||
 - User settings:
 | 
					 - User settings:
 | 
				
			||||||
    * Display timeout
 | 
					    * Display timeout
 | 
				
			||||||
    * Wake-up condition
 | 
					    * Wake-up condition
 | 
				
			||||||
 | 
				
			|||||||
@ -27,7 +27,7 @@ CMake configures the project according to variables you specify the command line
 | 
				
			|||||||
**NRFJPROG**|Path to the NRFJProg executable. Used only if `USE_JLINK` is 1.|`-DNRFJPROG=/opt/nrfjprog/nrfjprog`
 | 
					**NRFJPROG**|Path to the NRFJProg executable. Used only if `USE_JLINK` is 1.|`-DNRFJPROG=/opt/nrfjprog/nrfjprog`
 | 
				
			||||||
**GDB_CLIENT_BIN_PATH**|Path to arm-none-eabi-gdb executable. Used only if `USE_GDB_CLIENT` is 1.|`-DGDB_CLIENT_BIN_PATH=/home/jf/nrf52/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-gdb`
 | 
					**GDB_CLIENT_BIN_PATH**|Path to arm-none-eabi-gdb executable. Used only if `USE_GDB_CLIENT` is 1.|`-DGDB_CLIENT_BIN_PATH=/home/jf/nrf52/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-gdb`
 | 
				
			||||||
**GDB_CLIENT_TARGET_REMOTE**|Target remote connection string. Used only if `USE_GDB_CLIENT` is 1.|`-DGDB_CLIENT_TARGET_REMOTE=/dev/ttyACM0`
 | 
					**GDB_CLIENT_TARGET_REMOTE**|Target remote connection string. Used only if `USE_GDB_CLIENT` is 1.|`-DGDB_CLIENT_TARGET_REMOTE=/dev/ttyACM0`
 | 
				
			||||||
**BUILD_DFU (\*\*)**|Build DFU files while building (needs [adafruit-nrfutil](https://github.com/adafruit/Adafruit_nRF52_nrfutil)).|`-BUILD_DFU=1`
 | 
					**BUILD_DFU (\*\*)**|Build DFU files while building (needs [adafruit-nrfutil](https://github.com/adafruit/Adafruit_nRF52_nrfutil)).|`-DBUILD_DFU=1`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
####(**) Note about **CMAKE_BUILD_TYPE**:
 | 
					####(**) Note about **CMAKE_BUILD_TYPE**:
 | 
				
			||||||
By default, this variable is set to *Release*. It compiles the code with size and speed optimizations. We use this value for all the binaries we publish when we [release](https://github.com/JF002/InfiniTime/releases) new versions of InfiniTime.
 | 
					By default, this variable is set to *Release*. It compiles the code with size and speed optimizations. We use this value for all the binaries we publish when we [release](https://github.com/JF002/InfiniTime/releases) new versions of InfiniTime.
 | 
				
			||||||
 | 
				
			|||||||
@ -95,16 +95,16 @@ void BatteryInfo::UpdateScreen() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  if (batteryController.IsCharging() and batteryPercent < 100) {
 | 
					  if (batteryController.IsCharging() and batteryPercent < 100) {
 | 
				
			||||||
    lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_RED);
 | 
					    lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_RED);
 | 
				
			||||||
    lv_label_set_text_static(status, "Battery charging");
 | 
					    lv_label_set_text_static(status, "Charging");
 | 
				
			||||||
  } else if (batteryPercent == 100) {
 | 
					  } else if (batteryPercent == 100) {
 | 
				
			||||||
    lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_BLUE);
 | 
					    lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_BLUE);
 | 
				
			||||||
    lv_label_set_text_static(status, "Battery is fully charged");
 | 
					    lv_label_set_text_static(status, "Fully charged");
 | 
				
			||||||
  } else if (batteryPercent < 10) {
 | 
					  } else if (batteryPercent < 10) {
 | 
				
			||||||
    lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_YELLOW);
 | 
					    lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_YELLOW);
 | 
				
			||||||
    lv_label_set_text_static(status, "Battery is low");
 | 
					    lv_label_set_text_static(status, "Battery low");
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_GREEN);
 | 
					    lv_obj_set_style_local_bg_color(charging_bar, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_GREEN);
 | 
				
			||||||
    lv_label_set_text_static(status, "Battery discharging");
 | 
					    lv_label_set_text_static(status, "Discharging");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  lv_label_set_text_fmt(percent, "%02i%%", batteryPercent);
 | 
					  lv_label_set_text_fmt(percent, "%02i%%", batteryPercent);
 | 
				
			||||||
 | 
				
			|||||||
@ -5,27 +5,44 @@
 | 
				
			|||||||
#include "Symbols.h"
 | 
					#include "Symbols.h"
 | 
				
			||||||
#include "NotificationIcon.h"
 | 
					#include "NotificationIcon.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <cmath>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
LV_IMG_DECLARE(bg_clock);
 | 
					LV_IMG_DECLARE(bg_clock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using namespace Pinetime::Applications::Screens;
 | 
					using namespace Pinetime::Applications::Screens;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HOUR_LENGTH   70
 | 
					namespace {
 | 
				
			||||||
#define MINUTE_LENGTH 90
 | 
					 | 
				
			||||||
#define SECOND_LENGTH 110
 | 
					 | 
				
			||||||
#define PI            3.14159265358979323846
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ##
 | 
					constexpr auto HOUR_LENGTH = 70;
 | 
				
			||||||
static int16_t coordinate_x_relocate(int16_t x) {
 | 
					constexpr auto MINUTE_LENGTH = 90;
 | 
				
			||||||
  return ((x) + LV_HOR_RES / 2);
 | 
					constexpr auto SECOND_LENGTH = 110;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// sin(90) = 1 so the value of _lv_trigo_sin(90) is the scaling factor
 | 
				
			||||||
 | 
					const auto LV_TRIG_SCALE = _lv_trigo_sin(90);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int16_t cosine(int16_t angle) {
 | 
				
			||||||
 | 
					  return _lv_trigo_sin(angle + 90);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ##
 | 
					int16_t sine(int16_t angle) {
 | 
				
			||||||
static int16_t coordinate_y_relocate(int16_t y) {
 | 
					  return _lv_trigo_sin(angle);
 | 
				
			||||||
  return (((y) -LV_HOR_RES / 2) < 0) ? (0 - ((y) -LV_HOR_RES / 2)) : ((y) -LV_HOR_RES / 2);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int16_t coordinate_x_relocate(int16_t x) {
 | 
				
			||||||
 | 
					  return (x + LV_HOR_RES / 2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int16_t coordinate_y_relocate(int16_t y) {
 | 
				
			||||||
 | 
					  return std::abs(y - LV_HOR_RES / 2);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					lv_point_t coordinate_relocate(int16_t radius, int16_t angle) {
 | 
				
			||||||
 | 
					  return lv_point_t{
 | 
				
			||||||
 | 
					    .x = coordinate_x_relocate(radius * static_cast<int32_t>(sine(angle)) / LV_TRIG_SCALE),
 | 
				
			||||||
 | 
					    .y = coordinate_y_relocate(radius * static_cast<int32_t>(cosine(angle)) / LV_TRIG_SCALE)
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					} // namespace
 | 
				
			||||||
 | 
					
 | 
				
			||||||
WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app,
 | 
					WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app,
 | 
				
			||||||
                                 Controllers::DateTime& dateTimeController,
 | 
					                                 Controllers::DateTime& dateTimeController,
 | 
				
			||||||
                                 Controllers::Battery& batteryController,
 | 
					                                 Controllers::Battery& batteryController,
 | 
				
			||||||
@ -123,15 +140,12 @@ void WatchFaceAnalog::UpdateClock() {
 | 
				
			|||||||
  second = dateTimeController.Seconds();
 | 
					  second = dateTimeController.Seconds();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (sMinute != minute) {
 | 
					  if (sMinute != minute) {
 | 
				
			||||||
    minute_point[0].x = coordinate_x_relocate(30 * sin(minute * 6 * PI / 180));
 | 
					    auto const angle = minute * 6;
 | 
				
			||||||
    minute_point[0].y = coordinate_y_relocate(30 * cos(minute * 6 * PI / 180));
 | 
					    minute_point[0] = coordinate_relocate(30, angle);
 | 
				
			||||||
    minute_point[1].x = coordinate_x_relocate(MINUTE_LENGTH * sin(minute * 6 * PI / 180));
 | 
					    minute_point[1] = coordinate_relocate(MINUTE_LENGTH, angle);
 | 
				
			||||||
    minute_point[1].y = coordinate_y_relocate(MINUTE_LENGTH * cos(minute * 6 * PI / 180));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    minute_point_trace[0].x = coordinate_x_relocate(5 * sin(minute * 6 * PI / 180));
 | 
					    minute_point_trace[0] = coordinate_relocate(5, angle);
 | 
				
			||||||
    minute_point_trace[0].y = coordinate_y_relocate(5 * cos(minute * 6 * PI / 180));
 | 
					    minute_point_trace[1] = coordinate_relocate(31, angle);
 | 
				
			||||||
    minute_point_trace[1].x = coordinate_x_relocate(31 * sin(minute * 6 * PI / 180));
 | 
					 | 
				
			||||||
    minute_point_trace[1].y = coordinate_y_relocate(31 * cos(minute * 6 * PI / 180));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lv_line_set_points(minute_body, minute_point, 2);
 | 
					    lv_line_set_points(minute_body, minute_point, 2);
 | 
				
			||||||
    lv_line_set_points(minute_body_trace, minute_point_trace, 2);
 | 
					    lv_line_set_points(minute_body_trace, minute_point_trace, 2);
 | 
				
			||||||
@ -140,15 +154,13 @@ void WatchFaceAnalog::UpdateClock() {
 | 
				
			|||||||
  if (sHour != hour || sMinute != minute) {
 | 
					  if (sHour != hour || sMinute != minute) {
 | 
				
			||||||
    sHour = hour;
 | 
					    sHour = hour;
 | 
				
			||||||
    sMinute = minute;
 | 
					    sMinute = minute;
 | 
				
			||||||
    hour_point[0].x = coordinate_x_relocate(30 * sin((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180));
 | 
					    auto const angle = (hour * 30 + minute / 2);
 | 
				
			||||||
    hour_point[0].y = coordinate_y_relocate(30 * cos((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180));
 | 
					 | 
				
			||||||
    hour_point[1].x = coordinate_x_relocate(HOUR_LENGTH * sin((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180));
 | 
					 | 
				
			||||||
    hour_point[1].y = coordinate_y_relocate(HOUR_LENGTH * cos((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180));
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    hour_point_trace[0].x = coordinate_x_relocate(5 * sin((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180));
 | 
					    hour_point[0] = coordinate_relocate(30, angle);
 | 
				
			||||||
    hour_point_trace[0].y = coordinate_y_relocate(5 * cos((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180));
 | 
					    hour_point[1] = coordinate_relocate(HOUR_LENGTH, angle);
 | 
				
			||||||
    hour_point_trace[1].x = coordinate_x_relocate(31 * sin((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180));
 | 
					
 | 
				
			||||||
    hour_point_trace[1].y = coordinate_y_relocate(31 * cos((((hour > 12 ? hour - 12 : hour) * 30) + (minute * 0.5)) * PI / 180));
 | 
					    hour_point_trace[0] = coordinate_relocate(5, angle);
 | 
				
			||||||
 | 
					    hour_point_trace[1] = coordinate_relocate(31, angle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    lv_line_set_points(hour_body, hour_point, 2);
 | 
					    lv_line_set_points(hour_body, hour_point, 2);
 | 
				
			||||||
    lv_line_set_points(hour_body_trace, hour_point_trace, 2);
 | 
					    lv_line_set_points(hour_body_trace, hour_point_trace, 2);
 | 
				
			||||||
@ -156,10 +168,10 @@ void WatchFaceAnalog::UpdateClock() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  if (sSecond != second) {
 | 
					  if (sSecond != second) {
 | 
				
			||||||
    sSecond = second;
 | 
					    sSecond = second;
 | 
				
			||||||
    second_point[0].x = coordinate_x_relocate(20 * sin((180 + second * 6) * PI / 180));
 | 
					    auto const angle = second * 6;
 | 
				
			||||||
    second_point[0].y = coordinate_y_relocate(20 * cos((180 + second * 6) * PI / 180));
 | 
					
 | 
				
			||||||
    second_point[1].x = coordinate_x_relocate(SECOND_LENGTH * sin(second * 6 * PI / 180));
 | 
					    second_point[0] = coordinate_relocate(-20, angle);
 | 
				
			||||||
    second_point[1].y = coordinate_y_relocate(SECOND_LENGTH * cos(second * 6 * PI / 180));
 | 
					    second_point[1] = coordinate_relocate(SECOND_LENGTH, angle);
 | 
				
			||||||
    lv_line_set_points(second_body, second_point, 2);
 | 
					    lv_line_set_points(second_body, second_point, 2);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user