25
25
#include < drivers/Hrs3300.h>
26
26
#include < drivers/Bma421.h>
27
27
28
+ # // be sure to get the sim headers for SimpleWeatherService.h
29
+ #include " host/ble_gatt.h"
30
+ #include " host/ble_uuid.h"
31
+
28
32
#include " BootloaderVersion.h"
29
33
#include " components/battery/BatteryController.h"
30
34
#include " components/ble/BleController.h"
57
61
#include < iostream>
58
62
#include < typeinfo>
59
63
#include < algorithm>
64
+ #include < array>
65
+ #include < vector>
60
66
#include < cmath> // std::pow
61
67
62
68
// additional includes for 'saveScreenshot()' function
@@ -806,19 +812,81 @@ class Framework {
806
812
batteryController.voltage = batteryController.percentRemaining * 50 ;
807
813
}
808
814
815
+ void write_uint64 (uint8_t * data, uint64_t val)
816
+ {
817
+ for (int i=0 ; i<8 ; i++)
818
+ {
819
+ data[i] = (val >> (i*8 )) & 0xff ;
820
+ }
821
+ }
822
+ void write_int16 (uint8_t * data, int16_t val)
823
+ {
824
+ data[0 ] = val & 0xff ;
825
+ data[1 ] = (val >> 8 ) & 0xff ;
826
+ }
827
+ void set_current_weather (uint64_t timestamp, int16_t temperature, int iconId)
828
+ {
829
+ std::array<uint8_t , 49 > dataBuffer {};
830
+ os_mbuf buffer;
831
+ ble_gatt_access_ctxt ctxt;
832
+ ctxt.om = &buffer;
833
+ buffer.om_data = dataBuffer.data ();
834
+
835
+ // fill buffer with specified format
836
+ int16_t minTemperature = temperature;
837
+ int16_t maxTemperature = temperature;
838
+ dataBuffer.at (0 ) = 0 ; // MessageType::CurrentWeather
839
+ dataBuffer.at (1 ) = 0 ; // Vesion 0
840
+ write_uint64 (&dataBuffer[2 ], timestamp);
841
+ write_int16 (&dataBuffer[10 ], temperature);
842
+ write_int16 (&dataBuffer[12 ], minTemperature);
843
+ write_int16 (&dataBuffer[14 ], maxTemperature);
844
+ dataBuffer.at (48 ) = static_cast <uint8_t >(iconId);
845
+
846
+ // send weather to SimpleWeatherService
847
+ systemTask.nimble ().weather ().OnCommand (&ctxt);
848
+ }
849
+ void set_forecast (
850
+ uint64_t timestamp,
851
+ std::array<
852
+ Pinetime::Controllers::SimpleWeatherService::Forecast::Day,
853
+ Pinetime::Controllers::SimpleWeatherService::MaxNbForecastDays> days)
854
+ {
855
+ std::array<uint8_t , 36 > dataBuffer {};
856
+ os_mbuf buffer;
857
+ ble_gatt_access_ctxt ctxt;
858
+ ctxt.om = &buffer;
859
+ buffer.om_data = dataBuffer.data ();
860
+
861
+ // fill buffer with specified format
862
+ dataBuffer.at (0 ) = 1 ; // MessageType::Forecast
863
+ dataBuffer.at (1 ) = 0 ; // Vesion 0
864
+ write_uint64 (&dataBuffer[2 ], timestamp);
865
+ dataBuffer.at (10 ) = static_cast <uint8_t >(days.size ());
866
+ for (int i = 0 ; i < days.size (); i++)
867
+ {
868
+ const Pinetime::Controllers::SimpleWeatherService::Forecast::Day &day = days.at (i);
869
+ write_int16 (&dataBuffer[11 +(i*5 )], day.minTemperature );
870
+ write_int16 (&dataBuffer[13 +(i*5 )], day.maxTemperature );
871
+ dataBuffer.at (15 +(i*5 )) = static_cast <uint8_t >(day.iconId );
872
+ }
873
+ // send Forecast to SimpleWeatherService
874
+ systemTask.nimble ().weather ().OnCommand (&ctxt);
875
+ }
876
+
809
877
void generate_weather_data (bool clear) {
810
878
if (clear) {
811
- systemTask. nimble (). weather (). SetCurrentWeather (0 , 0 , 0 );
879
+ set_current_weather (0 , 0 , 0 );
812
880
std::array<Pinetime::Controllers::SimpleWeatherService::Forecast::Day, Pinetime::Controllers::SimpleWeatherService::MaxNbForecastDays> days;
813
- systemTask. nimble (). weather (). SetForecast (0 , days);
881
+ set_forecast (0 , days);
814
882
return ;
815
883
}
816
884
auto timestamp = std::chrono::system_clock::to_time_t (std::chrono::system_clock::now ());
817
885
srand ((int )timestamp);
818
886
819
887
// Generate current weather data
820
888
int16_t temperature = (rand () % 81 - 40 ) * 100 ;
821
- systemTask. nimble (). weather (). SetCurrentWeather ((uint64_t )timestamp, temperature, rand () % 9 );
889
+ set_current_weather ((uint64_t )timestamp, temperature, rand () % 9 );
822
890
823
891
// Generate forecast data
824
892
std::array<Pinetime::Controllers::SimpleWeatherService::Forecast::Day, Pinetime::Controllers::SimpleWeatherService::MaxNbForecastDays> days;
@@ -827,7 +895,7 @@ class Framework {
827
895
(int16_t )(temperature - rand () % 10 * 100 ), (int16_t )(temperature + rand () % 10 * 100 ), Pinetime::Controllers::SimpleWeatherService::Icons (rand () % 9 )
828
896
};
829
897
}
830
- systemTask. nimble (). weather (). SetForecast ((uint64_t )timestamp, days);
898
+ set_forecast ((uint64_t )timestamp, days);
831
899
}
832
900
833
901
void handle_touch_and_button () {
0 commit comments