opus.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. #include "opus.h"
  2. #include "opus_lists.h"
  3. #include "../../../metroflip_i.h"
  4. const char* get_opus_service_provider(int provider) {
  5. switch(provider) {
  6. case 0x01:
  7. return "STM";
  8. case 0x02:
  9. return "STM";
  10. case 0x03:
  11. return "RTL";
  12. case 0x04:
  13. return "RTM";
  14. case 0x05:
  15. return "RTC";
  16. case 0x06:
  17. return "STL";
  18. case 0x10:
  19. return "STLevis";
  20. default: {
  21. char* provider_str = malloc(10 * sizeof(char));
  22. if(!provider_str) {
  23. return "Unknown";
  24. }
  25. snprintf(provider_str, 10, "0x%02X", provider);
  26. return provider_str;
  27. }
  28. }
  29. }
  30. const char* get_opus_transport_type(int route_number) {
  31. if(route_number >= 0x01 && route_number <= 0x04) {
  32. return "Metro";
  33. } else {
  34. return "Bus";
  35. }
  36. }
  37. const char* get_opus_transport_line(int route_number) {
  38. if(OPUS_LINES_LIST[route_number]) {
  39. return OPUS_LINES_LIST[route_number];
  40. } else {
  41. // Return hex
  42. char* route_str = malloc(9 * sizeof(char));
  43. if(!route_str) {
  44. return "Unknown";
  45. }
  46. snprintf(route_str, 9, "0x%02X", route_number);
  47. return route_str;
  48. }
  49. }
  50. const char* get_opus_tariff(int tariff) {
  51. switch(tariff) {
  52. case 0xb1:
  53. return "Monthly";
  54. case 0xb2:
  55. case 0xc9:
  56. return "Weekly";
  57. case 0x1c7:
  58. return "Single Trips";
  59. case 0xa34:
  60. return "Monthly Student";
  61. case 0xa3e:
  62. return "Weekly";
  63. default: {
  64. char* tariff_str = malloc(9 * sizeof(char));
  65. if(!tariff_str) {
  66. return "Unknown";
  67. }
  68. snprintf(tariff_str, 9, "0x%02X", tariff);
  69. return tariff_str;
  70. }
  71. }
  72. }
  73. void show_opus_event_info(
  74. OpusCardEvent* event,
  75. OpusCardContract* contracts,
  76. FuriString* parsed_data) {
  77. UNUSED(contracts);
  78. furi_string_cat_printf(
  79. parsed_data,
  80. "%s %s\n",
  81. get_opus_transport_type(event->route_number),
  82. get_opus_transport_line(event->route_number));
  83. furi_string_cat_printf(
  84. parsed_data, "Transporter: %s\n", get_opus_service_provider(event->service_provider));
  85. if(event->used_contract_available) {
  86. furi_string_cat_printf(
  87. parsed_data,
  88. "Contract: %d - %s\n",
  89. event->used_contract,
  90. get_opus_tariff(contracts[event->used_contract - 1].tariff));
  91. }
  92. locale_format_datetime_cat(parsed_data, &event->date, true);
  93. furi_string_cat_printf(parsed_data, "\n");
  94. }
  95. void show_opus_contract_info(OpusCardContract* contract, FuriString* parsed_data) {
  96. furi_string_cat_printf(parsed_data, "Type: %s\n", get_opus_tariff(contract->tariff));
  97. furi_string_cat_printf(
  98. parsed_data, "Provider: %s\n", get_opus_service_provider(contract->provider));
  99. furi_string_cat_printf(parsed_data, "Valid\nfrom: ");
  100. locale_format_datetime_cat(parsed_data, &contract->start_date, false);
  101. furi_string_cat_printf(parsed_data, "\nto: ");
  102. locale_format_datetime_cat(parsed_data, &contract->end_date, false);
  103. furi_string_cat_printf(parsed_data, "\n");
  104. // furi_string_cat_printf(parsed_data, "Sold on: ");
  105. // locale_format_datetime_cat(parsed_data, &contract->sale_date, false);
  106. // furi_string_cat_printf(parsed_data, "\nStatus: %d\n", contract->status);
  107. }
  108. void show_opus_environment_info(OpusCardEnv* environment, FuriString* parsed_data) {
  109. furi_string_cat_printf(parsed_data, "App Version: %d\n", environment->app_version);
  110. furi_string_cat_printf(
  111. parsed_data, "Country: %s\n", get_country_string(environment->country_num));
  112. furi_string_cat_printf(
  113. parsed_data,
  114. "Network: %s\n",
  115. get_network_string(guess_card_type(environment->country_num, environment->network_num)));
  116. furi_string_cat_printf(parsed_data, "End of validity:\n");
  117. locale_format_datetime_cat(parsed_data, &environment->end_dt, false);
  118. furi_string_cat_printf(parsed_data, "\n");
  119. }