Implemented a few functions.
This commit is contained in:
		
							parent
							
								
									0ed256ba15
								
							
						
					
					
						commit
						ed6f0aade4
					
				@ -122,7 +122,7 @@ namespace Pinetime {
 | 
			
		||||
       * Events have types
 | 
			
		||||
       * then they're easier to parse after sending them over the air
 | 
			
		||||
       */
 | 
			
		||||
      enum class eventtype {
 | 
			
		||||
      enum class eventtype : uint8_t {
 | 
			
		||||
        /** @see obscuration */
 | 
			
		||||
        Obscuration = 0,
 | 
			
		||||
        /** @see precipitation */
 | 
			
		||||
@ -141,6 +141,8 @@ namespace Pinetime {
 | 
			
		||||
        Location = 7,
 | 
			
		||||
        /** @see cloud */
 | 
			
		||||
        Clouds = 8,
 | 
			
		||||
        /** @see humidity */
 | 
			
		||||
        Humidity = 9,
 | 
			
		||||
        Length
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
@ -340,4 +342,4 @@ namespace Pinetime {
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -90,7 +90,7 @@ namespace Pinetime {
 | 
			
		||||
            airquality->polluter = std::make_unique<std::string>(static_cast<const char*>(String.ptr), String.len);
 | 
			
		||||
            int64_t tmpAmount = 0;
 | 
			
		||||
            QCBORDecode_GetInt64InMapSZ(&decodeContext, "Amount", &tmpAmount);
 | 
			
		||||
            if (tmpAmount < 0 || tmpAmount > 4294967295) {
 | 
			
		||||
            if (tmpAmount < 0) {
 | 
			
		||||
              return BLE_ATT_ERR_INVALID_ATTR_VALUE_LEN;
 | 
			
		||||
            }
 | 
			
		||||
            airquality->amount = tmpAmount;
 | 
			
		||||
@ -162,6 +162,14 @@ namespace Pinetime {
 | 
			
		||||
            timeline.push_back(std::move(clouds));
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
          case WeatherData::eventtype::Humidity: {
 | 
			
		||||
            std::unique_ptr<WeatherData::Humidity> humidity = std::make_unique<WeatherData::Humidity>();
 | 
			
		||||
            humidity->timestamp = tmpTimestamp;
 | 
			
		||||
            humidity->eventType = static_cast<WeatherData::eventtype>(tmpEventType);
 | 
			
		||||
            humidity->expires = tmpExpires;
 | 
			
		||||
            timeline.push_back(std::move(humidity));
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
          default: {
 | 
			
		||||
            break;
 | 
			
		||||
          }
 | 
			
		||||
@ -201,46 +209,94 @@ namespace Pinetime {
 | 
			
		||||
      return 0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    WeatherData::Location WeatherService::GetCurrentLocation() const {
 | 
			
		||||
      return WeatherData::Location();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    WeatherData::Clouds WeatherService::GetCurrentClouds() const {
 | 
			
		||||
      return WeatherData::Clouds();
 | 
			
		||||
      uint64_t currentTimestamp = GetCurrentUnixTimestamp();
 | 
			
		||||
      for (auto&& header : timeline) {
 | 
			
		||||
        if (header->eventType == WeatherData::eventtype::Clouds && header->timestamp + header->expires <= currentTimestamp) {
 | 
			
		||||
          return reinterpret_cast<const WeatherData::Clouds&>(header);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return {};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    WeatherData::Obscuration WeatherService::GetCurrentObscuration() const {
 | 
			
		||||
      return WeatherData::Obscuration();
 | 
			
		||||
      uint64_t currentTimestamp = GetCurrentUnixTimestamp();
 | 
			
		||||
      for (auto&& header : timeline) {
 | 
			
		||||
        if (header->eventType == WeatherData::eventtype::Obscuration && header->timestamp + header->expires <= currentTimestamp) {
 | 
			
		||||
          return reinterpret_cast<const WeatherData::Obscuration&>(header);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return {};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    WeatherData::Precipitation WeatherService::GetCurrentPrecipitation() const {
 | 
			
		||||
      return WeatherData::Precipitation();
 | 
			
		||||
      uint64_t currentTimestamp = GetCurrentUnixTimestamp();
 | 
			
		||||
      for (auto&& header : timeline) {
 | 
			
		||||
        if (header->eventType == WeatherData::eventtype::Precipitation && header->timestamp + header->expires <= currentTimestamp) {
 | 
			
		||||
          return reinterpret_cast<const WeatherData::Precipitation&>(header);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return {};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    WeatherData::Wind WeatherService::GetCurrentWind() const {
 | 
			
		||||
      return WeatherData::Wind();
 | 
			
		||||
      uint64_t currentTimestamp = GetCurrentUnixTimestamp();
 | 
			
		||||
      for (auto&& header : timeline) {
 | 
			
		||||
        if (header->eventType == WeatherData::eventtype::Wind && header->timestamp + header->expires <= currentTimestamp) {
 | 
			
		||||
          return reinterpret_cast<const WeatherData::Wind&>(header);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return {};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    WeatherData::Temperature WeatherService::GetCurrentTemperature() const {
 | 
			
		||||
      return WeatherData::Temperature();
 | 
			
		||||
      uint64_t currentTimestamp = GetCurrentUnixTimestamp();
 | 
			
		||||
      for (auto&& header : timeline) {
 | 
			
		||||
        if (header->eventType == WeatherData::eventtype::Temperature && header->timestamp + header->expires <= currentTimestamp) {
 | 
			
		||||
          return reinterpret_cast<const WeatherData::Temperature&>(header);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return {};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    WeatherData::Humidity WeatherService::GetCurrentHumidity() const {
 | 
			
		||||
      return WeatherData::Humidity();
 | 
			
		||||
      uint64_t currentTimestamp = GetCurrentUnixTimestamp();
 | 
			
		||||
      for (auto&& header : timeline) {
 | 
			
		||||
        if (header->eventType == WeatherData::eventtype::Humidity && header->timestamp + header->expires <= currentTimestamp) {
 | 
			
		||||
          return reinterpret_cast<const WeatherData::Humidity&>(header);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return {};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    WeatherData::Pressure WeatherService::GetCurrentPressure() const {
 | 
			
		||||
      uint64_t currentTimestamp = GetCurrentUnixTimestamp();
 | 
			
		||||
      for (auto&& header : timeline) {
 | 
			
		||||
        if (header->eventType == WeatherData::eventtype::Pressure && header->timestamp + header->expires <= currentTimestamp) {
 | 
			
		||||
          return WeatherData::Pressure();
 | 
			
		||||
          return reinterpret_cast<const WeatherData::Pressure&>(header);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return WeatherData::Pressure();
 | 
			
		||||
      return {};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    WeatherData::Location WeatherService::GetCurrentLocation() const {
 | 
			
		||||
      uint64_t currentTimestamp = GetCurrentUnixTimestamp();
 | 
			
		||||
      for (auto&& header : timeline) {
 | 
			
		||||
        if (header->eventType == WeatherData::eventtype::Location && header->timestamp + header->expires <= currentTimestamp) {
 | 
			
		||||
          return reinterpret_cast<const WeatherData::Location&>(header);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return {};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    WeatherData::AirQuality WeatherService::GetCurrentQuality() const {
 | 
			
		||||
      return WeatherData::AirQuality();
 | 
			
		||||
      uint64_t currentTimestamp = GetCurrentUnixTimestamp();
 | 
			
		||||
      for (auto&& header : timeline) {
 | 
			
		||||
        if (header->eventType == WeatherData::eventtype::AirQuality && header->timestamp + header->expires <= currentTimestamp) {
 | 
			
		||||
          return reinterpret_cast<const WeatherData::AirQuality&>(header);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return {};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    size_t WeatherService::GetTimelineLength() const {
 | 
			
		||||
 | 
			
		||||
@ -77,42 +77,42 @@ namespace Pinetime {
 | 
			
		||||
       * Checks if an event of a certain type exists in the timeline
 | 
			
		||||
       * @return
 | 
			
		||||
       */
 | 
			
		||||
      bool HasTimelineEventOfType(const WeatherData::eventtype type) const;
 | 
			
		||||
      bool HasTimelineEventOfType(WeatherData::eventtype type) const;
 | 
			
		||||
 | 
			
		||||
    private:
 | 
			
		||||
      // 00030000-78fc-48fe-8e23-433b3a1942d0
 | 
			
		||||
      static constexpr ble_uuid128_t BaseUUID() {
 | 
			
		||||
        return CharUUID(0x00, 0x00);
 | 
			
		||||
      static constexpr ble_uuid128_t BaseUuid() {
 | 
			
		||||
        return CharUuid(0x00, 0x00);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // 0003yyxx-78fc-48fe-8e23-433b3a1942d0
 | 
			
		||||
      static constexpr ble_uuid128_t CharUUID(uint8_t x, uint8_t y) {
 | 
			
		||||
      static constexpr ble_uuid128_t CharUuid(uint8_t x, uint8_t y) {
 | 
			
		||||
        return ble_uuid128_t {.u = {.type = BLE_UUID_TYPE_128},
 | 
			
		||||
                              .value = {0xd0, 0x42, 0x19, 0x3a, 0x3b, 0x43, 0x23, 0x8e, 0xfe, 0x48, 0xfc, 0x78, x, y, 0x03, 0x00}};
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      ble_uuid128_t weatherUUID {BaseUUID()};
 | 
			
		||||
      ble_uuid128_t weatherUuid {BaseUuid()};
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
       * Just write timeline data here
 | 
			
		||||
       */
 | 
			
		||||
      ble_uuid128_t weatherDataCharUUID {CharUUID(0x00, 0x01)};
 | 
			
		||||
      ble_uuid128_t weatherDataCharUuid {CharUuid(0x00, 0x01)};
 | 
			
		||||
      /**
 | 
			
		||||
       * This doesn't take timeline data,
 | 
			
		||||
       * provides some control over it
 | 
			
		||||
       */
 | 
			
		||||
      ble_uuid128_t weatherControlCharUUID {CharUUID(0x00, 0x02)};
 | 
			
		||||
      ble_uuid128_t weatherControlCharUuid {CharUuid(0x00, 0x02)};
 | 
			
		||||
 | 
			
		||||
      const struct ble_gatt_chr_def characteristicDefinition[3] = {
 | 
			
		||||
        {.uuid = &weatherDataCharUUID.u,
 | 
			
		||||
        {.uuid = &weatherDataCharUuid.u,
 | 
			
		||||
         .access_cb = WeatherCallback,
 | 
			
		||||
         .arg = this,
 | 
			
		||||
         .flags = BLE_GATT_CHR_F_WRITE,
 | 
			
		||||
         .val_handle = &eventHandle},
 | 
			
		||||
        {.uuid = &weatherControlCharUUID.u, .access_cb = WeatherCallback, .arg = this, .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ},
 | 
			
		||||
        {.uuid = &weatherControlCharUuid.u, .access_cb = WeatherCallback, .arg = this, .flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_READ},
 | 
			
		||||
        {nullptr}};
 | 
			
		||||
      const struct ble_gatt_svc_def serviceDefinition[2] = {
 | 
			
		||||
        {.type = BLE_GATT_SVC_TYPE_PRIMARY, .uuid = &weatherUUID.u, .characteristics = characteristicDefinition}, {0}};
 | 
			
		||||
        {.type = BLE_GATT_SVC_TYPE_PRIMARY, .uuid = &weatherUuid.u, .characteristics = characteristicDefinition}, {0}};
 | 
			
		||||
 | 
			
		||||
      uint16_t eventHandle {};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -105,7 +105,6 @@ bool sortById(const TaskStatus_t& lhs, const TaskStatus_t& rhs) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<Screen> Weather::CreateScreen4() {
 | 
			
		||||
  TaskStatus_t tasksStatus[7];
 | 
			
		||||
  lv_obj_t* infoTask = lv_table_create(lv_scr_act(), nullptr);
 | 
			
		||||
  lv_table_set_col_cnt(infoTask, 3);
 | 
			
		||||
  lv_table_set_row_cnt(infoTask, 8);
 | 
			
		||||
@ -118,19 +117,6 @@ std::unique_ptr<Screen> Weather::CreateScreen4() {
 | 
			
		||||
  lv_table_set_cell_value(infoTask, 0, 2, "Free");
 | 
			
		||||
  lv_table_set_col_width(infoTask, 2, 90);
 | 
			
		||||
 | 
			
		||||
  auto nb = uxTaskGetSystemState(tasksStatus, 7, nullptr);
 | 
			
		||||
  std::sort(tasksStatus, tasksStatus + nb, sortById);
 | 
			
		||||
  for (uint8_t i = 0; i < nb; i++) {
 | 
			
		||||
 | 
			
		||||
    lv_table_set_cell_value(infoTask, i + 1, 0, std::to_string(tasksStatus[i].xTaskNumber).c_str());
 | 
			
		||||
    lv_table_set_cell_value(infoTask, i + 1, 1, tasksStatus[i].pcTaskName);
 | 
			
		||||
    if (tasksStatus[i].usStackHighWaterMark < 20) {
 | 
			
		||||
      std::string str1 = std::to_string(tasksStatus[i].usStackHighWaterMark) + " low";
 | 
			
		||||
      lv_table_set_cell_value(infoTask, i + 1, 2, str1.c_str());
 | 
			
		||||
    } else {
 | 
			
		||||
      lv_table_set_cell_value(infoTask, i + 1, 2, std::to_string(tasksStatus[i].usStackHighWaterMark).c_str());
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return std::unique_ptr<Screen>(new Screens::Label(3, 5, app, infoTask));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -148,4 +134,4 @@ std::unique_ptr<Screen> Weather::CreateScreen5() {
 | 
			
		||||
  lv_label_set_align(label, LV_LABEL_ALIGN_CENTER);
 | 
			
		||||
  lv_obj_align(label, lv_scr_act(), LV_ALIGN_CENTER, 0, 0);
 | 
			
		||||
  return std::unique_ptr<Screen>(new Screens::Label(4, 5, app, label));
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user