furi_hal_region.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include <furi_hal_region.h>
  2. #include <furi_hal_version.h>
  3. const FuriHalRegion furi_hal_region_zero = {
  4. .country_code = "00",
  5. .bands_count = 1,
  6. .bands = {
  7. {
  8. .start = 0,
  9. .end = 1000000000,
  10. .power_limit = 12,
  11. .duty_cycle = 50,
  12. },
  13. }};
  14. const FuriHalRegion furi_hal_region_eu_ru = {
  15. .country_code = "EU",
  16. .bands_count = 2,
  17. .bands = {
  18. {
  19. .start = 433050000,
  20. .end = 434790000,
  21. .power_limit = 12,
  22. .duty_cycle = 50,
  23. },
  24. {
  25. .start = 868150000,
  26. .end = 868550000,
  27. .power_limit = 12,
  28. .duty_cycle = 50,
  29. }}};
  30. const FuriHalRegion furi_hal_region_us_ca_au = {
  31. .country_code = "US",
  32. .bands_count = 3,
  33. .bands = {
  34. {
  35. .start = 304100000,
  36. .end = 321950000,
  37. .power_limit = 12,
  38. .duty_cycle = 50,
  39. },
  40. {
  41. .start = 433050000,
  42. .end = 434790000,
  43. .power_limit = 12,
  44. .duty_cycle = 50,
  45. },
  46. {
  47. .start = 915000000,
  48. .end = 928000000,
  49. .power_limit = 12,
  50. .duty_cycle = 50,
  51. }}};
  52. const FuriHalRegion furi_hal_region_jp = {
  53. .country_code = "JP",
  54. .bands_count = 2,
  55. .bands = {
  56. {
  57. .start = 312000000,
  58. .end = 315250000,
  59. .power_limit = 12,
  60. .duty_cycle = 50,
  61. },
  62. {
  63. .start = 920500000,
  64. .end = 923500000,
  65. .power_limit = 12,
  66. .duty_cycle = 50,
  67. }}};
  68. static const FuriHalRegion* furi_hal_region = NULL;
  69. void furi_hal_region_init() {
  70. FuriHalVersionRegion region = furi_hal_version_get_hw_region();
  71. if(region == FuriHalVersionRegionUnknown) {
  72. furi_hal_region = &furi_hal_region_zero;
  73. } else if(region == FuriHalVersionRegionEuRu) {
  74. furi_hal_region = &furi_hal_region_eu_ru;
  75. } else if(region == FuriHalVersionRegionUsCaAu) {
  76. furi_hal_region = &furi_hal_region_us_ca_au;
  77. } else if(region == FuriHalVersionRegionJp) {
  78. furi_hal_region = &furi_hal_region_jp;
  79. }
  80. }
  81. const FuriHalRegion* furi_hal_region_get() {
  82. return furi_hal_region;
  83. }
  84. void furi_hal_region_set(FuriHalRegion* region) {
  85. furi_hal_region = region;
  86. }
  87. bool furi_hal_region_is_provisioned() {
  88. return furi_hal_region != NULL;
  89. }
  90. const char* furi_hal_region_get_name() {
  91. if(furi_hal_region) {
  92. return furi_hal_region->country_code;
  93. } else {
  94. return "--";
  95. }
  96. }
  97. bool furi_hal_region_is_frequency_allowed(uint32_t frequency) {
  98. if(!furi_hal_region) {
  99. return false;
  100. }
  101. const FuriHalRegionBand* band = furi_hal_region_get_band(frequency);
  102. if(!band) {
  103. return false;
  104. }
  105. return true;
  106. }
  107. const FuriHalRegionBand* furi_hal_region_get_band(uint32_t frequency) {
  108. if(!furi_hal_region) {
  109. return NULL;
  110. }
  111. for(size_t i = 0; i < furi_hal_region->bands_count; i++) {
  112. if(furi_hal_region->bands[i].start <= frequency &&
  113. furi_hal_region->bands[i].end >= frequency) {
  114. return &furi_hal_region->bands[i];
  115. }
  116. }
  117. return NULL;
  118. }