rolling_flaws_utils.c 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "rolling_flaws_utils.h"
  2. #include <gui/gui.h>
  3. size_t __furi_string_extract_string(
  4. FuriString* buffer,
  5. size_t start_index,
  6. char* text,
  7. char delim,
  8. FuriString* result) {
  9. size_t len = strlen(text);
  10. size_t valid_index = furi_string_size(buffer) - 1;
  11. size_t field = furi_string_search_str(buffer, text, start_index) + len;
  12. size_t term = -1;
  13. if(field < valid_index) {
  14. term = furi_string_search_char(buffer, delim, field);
  15. if(term < valid_index) {
  16. furi_string_reset(result);
  17. furi_string_set_n(result, buffer, field, term - field);
  18. FURI_LOG_I(TAG, "%s data is >>%s<<", text, furi_string_get_cstr(result));
  19. } else {
  20. FURI_LOG_E(TAG, "Failed to find terminator for >>%s<<", text);
  21. }
  22. } else {
  23. FURI_LOG_E(TAG, "Failed to find >>%s<<", text);
  24. }
  25. return term;
  26. }
  27. uint32_t
  28. __furi_string_extract_int(FuriString* buffer, char* text, char delim, uint32_t default_value) {
  29. uint32_t value = default_value;
  30. size_t len = strlen(text);
  31. size_t valid_index = furi_string_size(buffer) - 1;
  32. size_t field = furi_string_search_str(buffer, text, 0) + len;
  33. size_t term = -1;
  34. FURI_LOG_I(TAG, "Extracting %s from field %d len is %d", text, field, len);
  35. if(field < valid_index && len <= field) {
  36. term = furi_string_search_char(buffer, delim, field);
  37. if(term < valid_index) {
  38. FuriString* result = furi_string_alloc();
  39. furi_string_set_n(result, buffer, field, term - field);
  40. value = __furi_string_hex_to_uint32(result);
  41. FURI_LOG_D(TAG, "%s data is >>%s<<", text, furi_string_get_cstr(result));
  42. furi_string_free(result);
  43. } else {
  44. FURI_LOG_E(TAG, "Failed to find terminator for >>%s<<", text);
  45. }
  46. } else {
  47. FURI_LOG_E(TAG, "Failed to find >>%s<<", text);
  48. }
  49. return value;
  50. }
  51. uint32_t __furi_string_hex_to_uint32(FuriString* str) {
  52. uint32_t result = 0;
  53. for(size_t i = 0; i < furi_string_size(str); i++) {
  54. char ch = furi_string_get_char(str, i);
  55. result *= 16;
  56. if(ch >= '0' && ch <= '9') {
  57. result += ch - '0';
  58. } else if(ch >= 'A' && ch <= 'F') {
  59. result += ch - 'A' + 10;
  60. } else if(ch >= 'a' && ch <= 'f') {
  61. result += ch - 'a' + 10;
  62. } else {
  63. FURI_LOG_E(TAG, "Invalid hex character %c", ch);
  64. }
  65. }
  66. return result;
  67. }
  68. void __gui_redraw() {
  69. // Redraw screen
  70. Gui* gui = furi_record_open(RECORD_GUI);
  71. gui_direct_draw_acquire(gui);
  72. gui_direct_draw_release(gui);
  73. }