Merge pull request #138 from vkareh/generate-weather-data

SimpleWeatherService: Generate random weather data
main
NeroBurner 2024-02-10 20:05:22 +07:00 committed by GitHub
commit 8b22bcd1cd
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 67 additions and 0 deletions

@ -146,6 +146,8 @@ Using the keyboard the following events can be triggered:
- `H` ... stop heartrate - `H` ... stop heartrate
- `i` ... take screenshot - `i` ... take screenshot
- `I` ... start/stop Gif screen capture - `I` ... start/stop Gif screen capture
- `w` ... generate weather data
- `W` ... clear weather data
Additionally using the arrow keys the respective swipe gesture can be triggered. Additionally using the arrow keys the respective swipe gesture can be triggered.
For example pressing the UP key triggers a `SwipeUp` gesture. For example pressing the UP key triggers a `SwipeUp` gesture.

@ -678,6 +678,7 @@ public:
debounce('s', 'S', state[SDL_SCANCODE_S], key_handled_s); debounce('s', 'S', state[SDL_SCANCODE_S], key_handled_s);
debounce('h', 'H', state[SDL_SCANCODE_H], key_handled_h); debounce('h', 'H', state[SDL_SCANCODE_H], key_handled_h);
debounce('i', 'I', state[SDL_SCANCODE_I], key_handled_i); debounce('i', 'I', state[SDL_SCANCODE_I], key_handled_i);
debounce('w', 'W', state[SDL_SCANCODE_W], key_handled_w);
// screen switcher buttons // screen switcher buttons
debounce('1', '!'+1, state[SDL_SCANCODE_1], key_handled_1); debounce('1', '!'+1, state[SDL_SCANCODE_1], key_handled_1);
debounce('2', '!'+2, state[SDL_SCANCODE_2], key_handled_2); debounce('2', '!'+2, state[SDL_SCANCODE_2], key_handled_2);
@ -780,6 +781,10 @@ public:
} else { } else {
gif_manager.close(); gif_manager.close();
} }
} else if (key == 'w') {
generate_weather_data(false);
} else if (key == 'W') {
generate_weather_data(true);
} else if (key >= '0' && key <= '9') { } else if (key >= '0' && key <= '9') {
this->switch_to_screen(key-'0'); this->switch_to_screen(key-'0');
} else if (key >= '!'+0 && key <= '!'+9) { } else if (key >= '!'+0 && key <= '!'+9) {
@ -796,6 +801,30 @@ public:
batteryController.voltage = batteryController.percentRemaining * 50; batteryController.voltage = batteryController.percentRemaining * 50;
} }
void generate_weather_data(bool clear) {
if (clear) {
systemTask.nimble().weather().SetCurrentWeather(0, 0, 0);
std::array<Pinetime::Controllers::SimpleWeatherService::Forecast::Day, Pinetime::Controllers::SimpleWeatherService::MaxNbForecastDays> days;
systemTask.nimble().weather().SetForecast(0, days);
return;
}
auto timestamp = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());
srand((int)timestamp);
// Generate current weather data
int16_t temperature = (rand() % 81 - 40) * 100;
systemTask.nimble().weather().SetCurrentWeather((uint64_t)timestamp, temperature, rand() % 9);
// Generate forecast data
std::array<Pinetime::Controllers::SimpleWeatherService::Forecast::Day, Pinetime::Controllers::SimpleWeatherService::MaxNbForecastDays> days;
for (int i = 0; i < Pinetime::Controllers::SimpleWeatherService::MaxNbForecastDays; i++) {
days[i] = Pinetime::Controllers::SimpleWeatherService::Forecast::Day {
(int16_t)(temperature - rand() % 10 * 100), (int16_t)(temperature + rand() % 10 * 100), Pinetime::Controllers::SimpleWeatherService::Icons(rand() % 9)
};
}
systemTask.nimble().weather().SetForecast((uint64_t)timestamp, days);
}
void handle_touch_and_button() { void handle_touch_and_button() {
int x, y; int x, y;
uint32_t buttons = SDL_GetMouseState(&x, &y); uint32_t buttons = SDL_GetMouseState(&x, &y);
@ -958,6 +987,7 @@ private:
bool key_handled_s = false; // s ... increase step count, S ... decrease step count bool key_handled_s = false; // s ... increase step count, S ... decrease step count
bool key_handled_h = false; // h ... set heartrate running, H ... stop heartrate bool key_handled_h = false; // h ... set heartrate running, H ... stop heartrate
bool key_handled_i = false; // i ... take screenshot, I ... start/stop Gif screen capture bool key_handled_i = false; // i ... take screenshot, I ... start/stop Gif screen capture
bool key_handled_w = false; // w ... generate weather data, W ... clear weather data
// numbers from 0 to 9 to switch between screens // numbers from 0 to 9 to switch between screens
bool key_handled_1 = false; bool key_handled_1 = false;
bool key_handled_2 = false; bool key_handled_2 = false;

@ -70,6 +70,20 @@ void SimpleWeatherService::Init() {
//ble_gatts_add_svcs(serviceDefinition); //ble_gatts_add_svcs(serviceDefinition);
} }
void SimpleWeatherService::SetCurrentWeather(uint64_t timestamp, int16_t temperature, int iconId) {
SimpleWeatherService::Location cityName;
cityName[32] = '\0';
currentWeather = SimpleWeatherService::CurrentWeather((uint64_t)timestamp, temperature, temperature, temperature, SimpleWeatherService::Icons(iconId), std::move(cityName));
printf("currentWeather: timestamp=%d, temperature=%d, icon=%d\n", currentWeather->timestamp, currentWeather->temperature, currentWeather->iconId);
}
void SimpleWeatherService::SetForecast(uint64_t timestamp, std::array<SimpleWeatherService::Forecast::Day, SimpleWeatherService::MaxNbForecastDays> days) {
forecast = SimpleWeatherService::Forecast {timestamp, SimpleWeatherService::MaxNbForecastDays, days};
for (int i = 0; i < SimpleWeatherService::MaxNbForecastDays; i++) {
printf("forecast: day=%d. min=%d, max=%d icon=%d\n", i, days[i].minTemperature, days[i].maxTemperature, days[i].iconId);
}
}
int SimpleWeatherService::OnCommand(struct ble_gatt_access_ctxt* ctxt) { int SimpleWeatherService::OnCommand(struct ble_gatt_access_ctxt* ctxt) {
return 0; return 0;
@ -108,3 +122,17 @@ bool SimpleWeatherService::CurrentWeather::operator==(const SimpleWeatherService
this->maxTemperature == other.maxTemperature && this->minTemperature == other.maxTemperature && this->maxTemperature == other.maxTemperature && this->minTemperature == other.maxTemperature &&
std::strcmp(this->location.data(), other.location.data()) == 0; std::strcmp(this->location.data(), other.location.data()) == 0;
} }
bool SimpleWeatherService::Forecast::Day::operator==(const SimpleWeatherService::Forecast::Day& other) const {
return this->iconId == other.iconId &&
this->maxTemperature == other.maxTemperature && this->minTemperature == other.maxTemperature;
}
bool SimpleWeatherService::Forecast::operator==(const SimpleWeatherService::Forecast& other) const {
for (int i = 0; i < this->nbDays; i++) {
if (this->days[i] != other.days[i]) {
return false;
}
}
return this->timestamp == other.timestamp && this->nbDays == other.nbDays;
}

@ -80,11 +80,18 @@ public:
int16_t minTemperature; int16_t minTemperature;
int16_t maxTemperature; int16_t maxTemperature;
Icons iconId; Icons iconId;
bool operator==(const Day& other) const;
}; };
std::array<Day, MaxNbForecastDays> days; std::array<Day, MaxNbForecastDays> days;
bool operator==(const Forecast& other) const;
}; };
void SetCurrentWeather(uint64_t timestamp, int16_t temperature, int iconId);
void SetForecast(uint64_t timestamp, std::array<Forecast::Day, MaxNbForecastDays> days);
std::optional<CurrentWeather> Current() const; std::optional<CurrentWeather> Current() const;
std::optional<Forecast> GetForecast() const; std::optional<Forecast> GetForecast() const;