Basic logic done. Need to change the timer source to get ms. Also need to replace with paddle app in displayApp.cpp and ApplicationList.cpp later.
This commit is contained in:
		
							parent
							
								
									a44260aab0
								
							
						
					
					
						commit
						cc58b635a3
					
				| @ -474,6 +474,7 @@ list(APPEND SOURCE_FILES | ||||
|         displayapp/screens/Meter.cpp | ||||
|         displayapp/screens/InfiniPaint.cpp | ||||
|         displayapp/screens/Paddle.cpp | ||||
|         displayapp/screens/StopWatch.cpp | ||||
|         displayapp/screens/BatteryIcon.cpp | ||||
|         displayapp/screens/BleIcon.cpp | ||||
|         displayapp/screens/NotificationIcon.cpp | ||||
| @ -566,6 +567,7 @@ set(INCLUDE_FILES | ||||
|         displayapp/screens/Tile.h | ||||
|         displayapp/screens/Meter.h | ||||
|         displayapp/screens/InfiniPaint.h | ||||
|         displayapp/screens/StopWatch.h | ||||
|         displayapp/screens/Paddle.h | ||||
|         displayapp/screens/DropDownDemo.h | ||||
|         displayapp/screens/BatteryIcon.h | ||||
|  | ||||
| @ -2,6 +2,6 @@ | ||||
| 
 | ||||
| namespace Pinetime { | ||||
|   namespace Applications { | ||||
|     enum class Apps {None, Launcher, Clock, SysInfo, Meter, Brightness, Music, FirmwareValidation, Paint, Paddle, Notifications, Twos, HeartRate, Navigation}; | ||||
|     enum class Apps {None, Launcher, Clock, SysInfo, Meter, Brightness, Music, FirmwareValidation, Paint, Paddle, Notifications, Twos, HeartRate, Navigation, StopWatch}; | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -12,6 +12,7 @@ | ||||
| #include "displayapp/screens/FirmwareValidation.h" | ||||
| #include "displayapp/screens/InfiniPaint.h" | ||||
| #include "displayapp/screens/Paddle.h" | ||||
| #include "displayapp/screens/StopWatch.h" | ||||
| #include "displayapp/screens/Meter.h" | ||||
| #include "displayapp/screens/Music.h" | ||||
| #include "displayapp/screens/Navigation.h" | ||||
| @ -203,7 +204,8 @@ void DisplayApp::RunningState() { | ||||
|       case Apps::Meter: currentScreen.reset(new Screens::Meter(this)); break; | ||||
|       case Apps::Twos: currentScreen.reset(new Screens::Twos(this)); break; | ||||
|       case Apps::Paint: currentScreen.reset(new Screens::InfiniPaint(this, lvgl)); break; | ||||
|       case Apps::Paddle: currentScreen.reset(new Screens::Paddle(this, lvgl)); break; | ||||
|       //TODO: Change it back
 | ||||
|       case Apps::StopWatch: currentScreen.reset(new Screens::StopWatch(this, dateTimeController)); break; | ||||
|       case Apps::Brightness : currentScreen.reset(new Screens::Brightness(this, brightnessController)); break; | ||||
|       case Apps::Music : currentScreen.reset(new Screens::Music(this, systemTask.nimble().music())); break; | ||||
|       case Apps::Navigation : currentScreen.reset(new Screens::Navigation(this, systemTask.nimble().navigation())); break; | ||||
|  | ||||
| @ -60,7 +60,8 @@ std::unique_ptr<Screen> ApplicationList::CreateScreen2() { | ||||
|            {Symbols::asterisk, Apps::Meter}, | ||||
|            {Symbols::paintbrush, Apps::Paint}, | ||||
|                   {Symbols::info, Apps::Notifications}, | ||||
|                   {Symbols::paddle, Apps::Paddle}, | ||||
|                   //TODO: Change it back
 | ||||
|                   {Symbols::paddle, Apps::StopWatch}, | ||||
|                   {"2", Apps::Twos} | ||||
|           } | ||||
|   }; | ||||
|  | ||||
							
								
								
									
										73
									
								
								src/displayapp/screens/StopWatch.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								src/displayapp/screens/StopWatch.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,73 @@ | ||||
| #include "StopWatch.h" | ||||
| 
 | ||||
| #include "Screen.h" | ||||
| #include "lvgl/lvgl.h" | ||||
| 
 | ||||
| #include <tuple> | ||||
| 
 | ||||
| // Anonymous namespace for local functions
 | ||||
| namespace { | ||||
|   std::tuple<int, int, int> convertMilliSecsToSegments(const int64_t& currentTime) { | ||||
|     const int milliSecs = (currentTime % 1000); // Get only the first two digits and ignore the last
 | ||||
|     const int secs = (currentTime / 1000) % 60; | ||||
|     const int mins = (currentTime / 1000) / 60; | ||||
|     return std::make_tuple(mins, secs, milliSecs); | ||||
|   } | ||||
| } | ||||
| using namespace Pinetime::Applications::Screens; | ||||
| 
 | ||||
| StopWatch::StopWatch(DisplayApp* app, const Pinetime::Controllers::DateTime& dateTime) | ||||
|   : Screen(app), dateTime {dateTime}, running {true}, currentState {States::INIT}, currentEvent {Events::PLAY}, startTime {}, | ||||
|     timeElapsed {} { | ||||
| 
 | ||||
|   time = lv_label_create(lv_scr_act(), nullptr); | ||||
|   lv_obj_set_style_local_text_font(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_extrabold_compressed); | ||||
|   lv_obj_align(time, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 0); | ||||
| 
 | ||||
|   msecTime = lv_label_create(lv_scr_act(), nullptr); | ||||
|   lv_obj_set_style_local_text_font(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20); | ||||
|   lv_obj_align(msecTime, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 115, 60); | ||||
| } | ||||
| 
 | ||||
| StopWatch::~StopWatch() { | ||||
|   lv_obj_clean(lv_scr_act()); | ||||
| } | ||||
| 
 | ||||
| bool StopWatch::Refresh() { | ||||
| 
 | ||||
|   switch (currentState) { | ||||
|     // Init state when an user first opens the app
 | ||||
|     // and when a stop/reset button is pressed
 | ||||
|     case States::INIT: { | ||||
|       // The initial default value
 | ||||
|       lv_label_set_text(time, "00:00"); | ||||
|       lv_label_set_text(msecTime, "00"); | ||||
|       if (currentEvent == Events::PLAY) { | ||||
|         startTime = dateTime.CurrentDateTime(); | ||||
|         currentState = States::RUNNING; | ||||
|       } | ||||
|       break; | ||||
|     } | ||||
|     case States::RUNNING: { | ||||
|       auto delta = std::chrono::duration_cast<std::chrono::microseconds>(dateTime.CurrentDateTime() - startTime); | ||||
|       timeElapsed = delta.count(); | ||||
|       auto timeSeparated = convertMilliSecsToSegments(timeElapsed); | ||||
|       lv_label_set_text_fmt(time, "%02d:%02d", std::get<0>(timeSeparated), std::get<1>(timeSeparated)); | ||||
|       break; | ||||
|     } | ||||
|     case States::HALTED: { | ||||
| 
 | ||||
|       break; | ||||
|     } | ||||
|   } | ||||
|   return running; | ||||
| } | ||||
| 
 | ||||
| bool StopWatch::OnButtonPushed() { | ||||
|   running = false; | ||||
|   return true; | ||||
| } | ||||
| 
 | ||||
| bool StopWatch::OnTouchEvent(uint16_t x, uint16_t y) { | ||||
|   return true; | ||||
| } | ||||
							
								
								
									
										33
									
								
								src/displayapp/screens/StopWatch.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/displayapp/screens/StopWatch.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | ||||
| #pragma once | ||||
| 
 | ||||
| #include "Screen.h" | ||||
| #include "components/datetime/DateTimeController.h" | ||||
| #include "../LittleVgl.h" | ||||
| 
 | ||||
| #include <chrono> | ||||
| 
 | ||||
| namespace Pinetime::Applications::Screens { | ||||
| 
 | ||||
|   enum class States { INIT, RUNNING, HALTED }; | ||||
| 
 | ||||
|   enum class Events { PLAY, PAUSE, STOP }; | ||||
| 
 | ||||
|   class StopWatch : public Screen { | ||||
|   public: | ||||
|     StopWatch(DisplayApp* app, const Pinetime::Controllers::DateTime& dateTime); | ||||
|     ~StopWatch() override; | ||||
|     bool Refresh() override; | ||||
|     bool OnButtonPushed() override; | ||||
|     bool OnTouchEvent(uint16_t x, uint16_t y) override; | ||||
| 
 | ||||
|   private: | ||||
|     using timeUnit = std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>; | ||||
|     const Pinetime::Controllers::DateTime& dateTime; | ||||
|     bool running; | ||||
|     States currentState; | ||||
|     Events currentEvent; | ||||
|     timeUnit startTime; | ||||
|     int64_t timeElapsed; | ||||
|     lv_obj_t *time, *msecTime; | ||||
|   }; | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 panky-codes
						panky-codes