David Lee 2 лет назад
Родитель
Сommit
810bec7073

+ 117 - 0
helpers/retekess/meal_pager_retekess_td165.c

@@ -0,0 +1,117 @@
+
+#include "meal_pager_retekess_td165.h"
+
+static char* genRawDataTD165(int zero, int one, const char* bits) {
+    int bitsLen = strlen(bits);
+    int lineLen = 256; // Adjust the line length as needed
+    char* line = (char*)malloc(lineLen * sizeof(char));
+
+    // Initialize the line with the first part
+    char* res = (char*)malloc(lineLen * sizeof(char));
+    res[0] = '\0'; // Null-terminate the result string
+
+    customConcat(res, "-6000");
+
+    // Append bits and create the line
+    for(int i = 0; i < bitsLen; i++) {
+        char c = bits[i];
+        int t = (c == '0') ? zero : one;
+
+        if(i % 2 == 0) {
+            snprintf(line, lineLen, " %d", t);
+        } else {
+            snprintf(line, lineLen, " -%d", t);
+        }
+
+        // Concatenate the line to the result string
+        customConcat(res, line);
+    }
+
+    // Append the closing part to the line
+    customConcat(res, " 200 -6000");
+
+    free(line); // Free memory allocated for the line
+
+    return res;
+}
+
+static void meal_pager_retekess_td165_generate_pager(
+    void* context,
+    char* stationId,
+    uint32_t pager,
+    FlipperFormat* ff) {
+    Meal_Pager* app = context;
+    char pagerId[11];
+    char* fullId = (char*)malloc(25 * sizeof(char));
+    uint32_t action = 0;
+    char actionId[2];
+    app->current_pager = pager;
+    meal_pager_transmit_model_set_pager(app->meal_pager_transmit, app->current_pager);
+    FURI_LOG_D(TAG, "Generating TD165 Data for Pager %lu", pager);
+    uint32ToBinaray(pager, pagerId, 10);
+    reverse(pagerId);
+    customConcat(fullId, stationId);
+    customConcat(fullId, pagerId);
+    uint32ToBinaray(action, actionId, 1);
+    reverse(actionId);
+    customConcat(fullId, actionId);
+    char* manchester = encManchester(fullId, 0);
+    char* rawSignal = genRawDataTD165(200, 600, manchester);
+    for(u_int32_t i = 1; app->repeats >= i; i++) {
+        flipper_format_write_string_cstr(ff, "RAW_Data", rawSignal);
+    }
+    free(manchester);
+    free(rawSignal);
+}
+
+static void
+    meal_pager_retekess_td165_generate_station(void* context, uint32_t station, FlipperFormat* ff) {
+    Meal_Pager* app = context;
+    FURI_LOG_D(
+        TAG,
+        "Generating TD165 Data for Station %lu. Pagers From %lu to %lu",
+        station,
+        app->first_pager,
+        app->last_pager);
+    app->current_station = station;
+    app->current_pager = app->first_pager;
+    char stationId[14];
+    uint32ToBinaray(station, stationId, 13);
+    reverse(stationId);
+    meal_pager_transmit_model_set_station(app->meal_pager_transmit, app->current_station);
+    for(u_int32_t i = app->current_pager; i <= app->last_pager; i++) {
+        meal_pager_retekess_td165_generate_pager(app, stationId, i, ff);
+        if(app->stop_transmit) {
+            break;
+        }
+    }
+}
+
+bool meal_pager_retekess_td165_generate_all(void* context) {
+    Meal_Pager* app = context;
+
+    app->current_pager = 1;
+    app->current_station = app->first_station;
+
+    Storage* storage = furi_record_open(RECORD_STORAGE);
+    FlipperFormat* ff = flipper_format_file_alloc(storage);
+    bool success = meal_pager_save_subghz_buffer_file_start(app, ff, storage);
+
+    if(!success) {
+        FURI_LOG_D(TAG, "failed to save to buffer");
+        meal_pager_save_subghz_buffer_stop(app, ff);
+        furi_record_close(RECORD_STORAGE);
+        return success;
+    }
+
+    for(u_int32_t i = app->current_station; i <= app->last_station; i++) {
+        meal_pager_retekess_td165_generate_station(app, i, ff);
+        if(app->stop_transmit) {
+            break;
+        }
+    }
+
+    meal_pager_save_subghz_buffer_stop(app, ff);
+    furi_record_close(RECORD_STORAGE);
+    return success;
+}

+ 7 - 0
helpers/retekess/meal_pager_retekess_td165.h

@@ -0,0 +1,7 @@
+
+#pragma once
+
+#include "../../meal_pager_i.h"
+#include "../meal_pager_calc.h"
+
+bool meal_pager_retekess_td165_generate_all(void* context);

+ 1 - 1
scenes/meal_pager_scene_settings.c

@@ -154,7 +154,7 @@ void meal_pager_scene_settings_on_enter(void* context) {
         app->variable_item_list,
         "Pager Type:",
         //4,
-        2,
+        3,
         meal_pager_scene_settings_set_pager_type,
         app);
     value_index = value_index_uint32(app->pager_type, pager_type_value, 4);

+ 4 - 0
scenes/meal_pager_scene_transmit.c

@@ -2,6 +2,7 @@
 #include "../helpers/meal_pager_custom_event.h"
 #include "../helpers/retekess/meal_pager_retekess_t119.h"
 #include "../helpers/retekess/meal_pager_retekess_td157.h"
+#include "../helpers/retekess/meal_pager_retekess_td165.h"
 #include "../views/meal_pager_transmit.h"
 #include "../helpers/meal_pager_led.h"
 #include "../helpers/subghz/subghz.h"
@@ -34,6 +35,9 @@ void meal_pager_scene_transmit_on_enter(void* context) {
     case Meal_PagerPagerTypeTD157:
         generated = meal_pager_retekess_td157_generate_all(app);
         break;
+    case Meal_PagerPagerTypeTD165:
+        generated = meal_pager_retekess_td165_generate_all(app);
+        break;
     default:
         generated = false;
         break;