Add new App `Dice.h` to randomly roll the dice(s). The number of dice can range from 1-9 (default 1), and the sides can range from d2-d99 (default d2). To have a haptic feedback we make Dice vibrate on roll. Regarding the use of C++ `<random>` library: There are known problems with `rand()` and `srand()` (see https://en.cppreference.com/w/cpp/numeric/random/rand) and the `<random>` library is preferred for this reason. The function used from `<random>` also avoids a very rare bias that would occur using `rand()` and modulo, when `RAND_MAX` is not a multiple of `d` and the initially generated number falls in the last "short" segment. This commit also updates the seed to derive entropy (via `seed_seq`) from a mix of the system tick count and the x,y,z components of the PineTime motion controller -- taking inspiration from and with credit to @w4tsn (https://github.com/InfiniTimeOrg/InfiniTime/pull/1199) Thanks for suggestions: * in Dice, when rolling 1d2, also show "HEADS" or "TAILS" -- suggestion by @medeyko * ui adjustments and result realignment -- suggestion by @Boteium --------- Co-authored-by: NeroBurner <pyro4hell@gmail.com> Co-authored-by: Riku Isokoski <riksu9000@gmail.com> Co-authored-by: Paul Weiß <45500341+Poohl@users.noreply.github.com> Co-authored-by: FintasticMan <finlay.neon.kid@gmail.com>
79 lines
1.5 KiB
C
79 lines
1.5 KiB
C
#pragma once
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
|
|
namespace Pinetime {
|
|
namespace Applications {
|
|
enum class Apps : uint8_t {
|
|
None,
|
|
Launcher,
|
|
Clock,
|
|
SysInfo,
|
|
FirmwareUpdate,
|
|
FirmwareValidation,
|
|
NotificationsPreview,
|
|
Notifications,
|
|
Timer,
|
|
Alarm,
|
|
FlashLight,
|
|
BatteryInfo,
|
|
Music,
|
|
Paint,
|
|
Paddle,
|
|
Twos,
|
|
HeartRate,
|
|
Navigation,
|
|
StopWatch,
|
|
Metronome,
|
|
Motion,
|
|
Steps,
|
|
Dice,
|
|
PassKey,
|
|
QuickSettings,
|
|
Settings,
|
|
SettingWatchFace,
|
|
SettingTimeFormat,
|
|
SettingWeatherFormat,
|
|
SettingDisplay,
|
|
SettingWakeUp,
|
|
SettingSteps,
|
|
SettingSetDateTime,
|
|
SettingChimes,
|
|
SettingShakeThreshold,
|
|
SettingBluetooth,
|
|
Error,
|
|
Weather
|
|
};
|
|
|
|
enum class WatchFace : uint8_t {
|
|
Digital,
|
|
Analog,
|
|
PineTimeStyle,
|
|
Terminal,
|
|
Infineat,
|
|
CasioStyleG7710,
|
|
};
|
|
|
|
template <Apps>
|
|
struct AppTraits {};
|
|
|
|
template <WatchFace>
|
|
struct WatchFaceTraits {};
|
|
|
|
template <Apps... As>
|
|
struct TypeList {
|
|
static constexpr size_t Count = sizeof...(As);
|
|
};
|
|
|
|
using UserAppTypes = TypeList<@USERAPP_TYPES@>;
|
|
|
|
template <WatchFace... Ws>
|
|
struct WatchFaceTypeList {
|
|
static constexpr size_t Count = sizeof...(Ws);
|
|
};
|
|
|
|
using UserWatchFaceTypes = WatchFaceTypeList<@WATCHFACE_TYPES@>;
|
|
|
|
static_assert(UserWatchFaceTypes::Count >= 1);
|
|
}
|
|
}
|