damage_monitor_test.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. #include <array>
  2. #include <cassert>
  3. #include <string_view>
  4. #include "../Sunrise/src/middleware/bap/activity_message/sense_update.h"
  5. namespace sense=sunrise::middleware::bap::activity_message::sense_update;
  6. sense::TargetStatus group(const void*,std::uint32_t key,sense::GroupTarget& out)noexcept{
  7. if(key!=0xA3B76C64)return sense::TargetStatus::targetUnavailable;
  8. out.objectTag=0x80B3C21C;return sense::TargetStatus::resolved;
  9. }
  10. sense::TargetStatus slot(const void*,const sense::GroupTarget&,std::uint8_t type,std::uint16_t index,sense::SlotTarget& out)noexcept{
  11. if(type!=20||index!=121)return sense::TargetStatus::targetUnavailable;
  12. out.senseSchema=0x80809562;return sense::TargetStatus::resolved;
  13. }
  14. int main(){
  15. // Native A774B0/80809562: mandatory raw health and shield, signed Auth revision.
  16. constexpr std::array<std::string_view,3> fixtures{
  17. "000000000000000000000000000000003476ed8c800000175a3b76c642b00f33f8000000000000080000003000000040",
  18. "000000000000000000000000000000003476ed8c800000175a3b76c642b00f3000000000000000080000003000000040",
  19. "000000000000000000000000000000003476ed8c800000175a3b76c642b00f3bf8000000000000080000003000000040",
  20. };
  21. const sense::Resolver resolver{nullptr,&group,&slot};
  22. for(unsigned i=0;i<fixtures.size();++i){
  23. std::array<std::byte,64> bytes{};auto n=fixtures[i].size()/2;
  24. auto hex=[](char c){return c<='9'?c-'0':c-'a'+10;};
  25. for(std::size_t j=0;j<n;++j)bytes[j]=std::byte((hex(fixtures[i][2*j])<<4)|hex(fixtures[i][2*j+1]));
  26. sense::SenseUpdate out{};std::size_t consumed{};
  27. assert(sense::decode_sense_update(std::span(bytes).first(n),resolver,out,consumed));
  28. assert(out.decoded.status==sense::DecodeStatus::complete && out.decoded.objectCount==1);
  29. const auto& object=out.decoded.objects[0];assert(object.valueCount==3);
  30. const auto& health=out.decoded.values[object.firstValue];
  31. const auto& shield=out.decoded.values[object.firstValue+1];
  32. const auto& revision=out.decoded.values[object.firstValue+2];
  33. assert(health.present && shield.present);
  34. assert(health.realValue==(i==0?1.0f:i==1?0.0f:-1.0f)&&shield.realValue==0.0f);
  35. assert(object.deltaBits==97 && object.status==sense::ObjectStatus::decoded);
  36. assert(revision.signedValue==3&&object.generationPlusOne==4);
  37. assert(!sense::decode_sense_update(std::span(bytes).first(n-1),resolver,out,consumed));
  38. }
  39. }