frux-c 1 год назад
Родитель
Сommit
9ac60658b6
4 измененных файлов с 127 добавлено и 4 удалено
  1. 93 0
      scenes/uhf_scene_settings.c
  2. 13 0
      uhf_module.c
  3. 11 0
      uhf_module.h
  4. 10 4
      uhf_worker.c

+ 93 - 0
scenes/uhf_scene_settings.c

@@ -1,6 +1,8 @@
 #include "../uhf_app_i.h"
 #include "../uhf_app_i.h"
 #include "../uhf_module.h"
 #include "../uhf_module.h"
 
 
+char* yes_no[] = {"No", "Yes"};
+
 void uhf_settings_set_module_baudrate(VariableItem* item) {
 void uhf_settings_set_module_baudrate(VariableItem* item) {
     M100Module* module = variable_item_get_context(item);
     M100Module* module = variable_item_get_context(item);
     uint8_t index = variable_item_get_current_value_index(item);
     uint8_t index = variable_item_get_current_value_index(item);
@@ -38,6 +40,50 @@ void uhf_settings_set_module_working_region(VariableItem* item) {
     variable_item_set_current_value_text(item, WORKING_REGIONS_STR[index]);
     variable_item_set_current_value_text(item, WORKING_REGIONS_STR[index]);
 }
 }
 
 
+void uhf_settings_set_epc_write_mask(VariableItem* item){
+    M100Module* uhf_module = variable_item_get_context(item);
+    uint8_t index = variable_item_get_current_value_index(item);
+    variable_item_set_current_value_text(item, yes_no[index]);
+    if(index){
+        m100_enable_write_mask(uhf_module, WRITE_EPC);
+        return;
+    }
+    m100_disable_write_mask(uhf_module, WRITE_EPC);
+}
+
+void uhf_settings_set_tid_write_mask(VariableItem* item){
+    M100Module* uhf_module = variable_item_get_context(item);
+    uint8_t index = variable_item_get_current_value_index(item);
+    variable_item_set_current_value_text(item, yes_no[index]);
+    if(index){
+        m100_enable_write_mask(uhf_module, WRITE_TID);
+        return;
+    }
+    m100_disable_write_mask(uhf_module, WRITE_TID);
+}
+
+void uhf_settings_set_user_write_mask(VariableItem* item){
+    M100Module* uhf_module = variable_item_get_context(item);
+    uint8_t index = variable_item_get_current_value_index(item);
+    variable_item_set_current_value_text(item, yes_no[index]);
+    if(index){
+        m100_enable_write_mask(uhf_module, WRITE_USER);
+        return;
+    }
+    m100_disable_write_mask(uhf_module, WRITE_USER);
+}
+
+void uhf_settings_set_rfu_write_mask(VariableItem* item){
+    M100Module* uhf_module = variable_item_get_context(item);
+    uint8_t index = variable_item_get_current_value_index(item);
+    variable_item_set_current_value_text(item, yes_no[index]);
+    if(index){
+        m100_enable_write_mask(uhf_module, WRITE_RFU);
+        return;
+    }
+    m100_disable_write_mask(uhf_module, WRITE_RFU);
+}
+
 uint8_t uhf_settings_get_module_baudrate_index(M100Module* module) {
 uint8_t uhf_settings_get_module_baudrate_index(M100Module* module) {
     for(uint8_t i = 0; i < BAUD_RATES_COUNT; i++) {
     for(uint8_t i = 0; i < BAUD_RATES_COUNT; i++) {
         if(BAUD_RATES[i] == module->uart->baudrate) {
         if(BAUD_RATES[i] == module->uart->baudrate) {
@@ -71,6 +117,7 @@ void uhf_scene_settings_on_enter(void* ctx) {
     VariableItem* item;
     VariableItem* item;
     VariableItemList* variable_item_list = uhf_app->variable_item_list;
     VariableItemList* variable_item_list = uhf_app->variable_item_list;
 
 
+    // Add baudrate item
     uint8_t value_index = uhf_settings_get_module_baudrate_index(uhf_module);
     uint8_t value_index = uhf_settings_get_module_baudrate_index(uhf_module);
     char text_buf[10];
     char text_buf[10];
     snprintf(text_buf, sizeof(text_buf), "%lu", uhf_module->uart->baudrate);
     snprintf(text_buf, sizeof(text_buf), "%lu", uhf_module->uart->baudrate);
@@ -84,6 +131,7 @@ void uhf_scene_settings_on_enter(void* ctx) {
     variable_item_set_current_value_text(item, text_buf);
     variable_item_set_current_value_text(item, text_buf);
     variable_item_set_current_value_index(item, value_index);
     variable_item_set_current_value_index(item, value_index);
 
 
+    // Add power item
     value_index = uhf_settings_get_module_power_index(uhf_module);
     value_index = uhf_settings_get_module_power_index(uhf_module);
     item = variable_item_list_add(
     item = variable_item_list_add(
         variable_item_list,
         variable_item_list,
@@ -95,6 +143,7 @@ void uhf_scene_settings_on_enter(void* ctx) {
     variable_item_set_current_value_text(item, text_buf);
     variable_item_set_current_value_text(item, text_buf);
     variable_item_set_current_value_index(item, value_index);
     variable_item_set_current_value_index(item, value_index);
 
 
+    // Add working region item
     value_index = uhf_settings_get_module_working_region_index(uhf_module);
     value_index = uhf_settings_get_module_working_region_index(uhf_module);
     item = variable_item_list_add(
     item = variable_item_list_add(
         variable_item_list,
         variable_item_list,
@@ -106,6 +155,50 @@ void uhf_scene_settings_on_enter(void* ctx) {
     variable_item_set_current_value_index(item, value_index);
     variable_item_set_current_value_index(item, value_index);
 
 
     view_dispatcher_switch_to_view(uhf_app->view_dispatcher, UHFViewVariableItemList);
     view_dispatcher_switch_to_view(uhf_app->view_dispatcher, UHFViewVariableItemList);
+
+    
+    // Add write modes
+    value_index = m100_is_write_mask_enabled(uhf_module, WRITE_EPC)? 1: 0;
+    item = variable_item_list_add(
+        variable_item_list,
+        "Write EPC:",
+        2,
+        uhf_settings_set_epc_write_mask,
+        uhf_module);
+    variable_item_set_current_value_text(item, yes_no[value_index]);
+    variable_item_set_current_value_index(item, value_index);
+
+    value_index = m100_is_write_mask_enabled(uhf_module, WRITE_TID)? 1: 0;
+    item = variable_item_list_add(
+        variable_item_list,
+        "Write TID:",
+        2,
+        uhf_settings_set_tid_write_mask,
+        uhf_module);
+    variable_item_set_current_value_text(item, yes_no[value_index]);
+    variable_item_set_current_value_index(item, value_index);
+
+    value_index = m100_is_write_mask_enabled(uhf_module, WRITE_USER)? 1: 0;
+    item = variable_item_list_add(
+        variable_item_list,
+        "Write User:",
+        2,
+        uhf_settings_set_user_write_mask,
+        uhf_module);
+    variable_item_set_current_value_text(item, yes_no[value_index]);
+    variable_item_set_current_value_index(item, value_index);
+
+    value_index = m100_is_write_mask_enabled(uhf_module, WRITE_RFU)? 1: 0;
+    item = variable_item_list_add(
+        variable_item_list,
+        "Write RFU:",
+        2,
+        uhf_settings_set_rfu_write_mask,
+        uhf_module);
+    variable_item_set_current_value_text(item, yes_no[value_index]);
+    variable_item_set_current_value_index(item, value_index);
+
+
 }
 }
 
 
 bool uhf_scene_settings_on_event(void* ctx, SceneManagerEvent event) {
 bool uhf_scene_settings_on_event(void* ctx, SceneManagerEvent event) {

+ 13 - 0
uhf_module.c

@@ -45,6 +45,7 @@ M100Module* m100_module_alloc() {
     module->region = DEFAULT_WORKING_REGION;
     module->region = DEFAULT_WORKING_REGION;
     module->info = m100_module_info_alloc();
     module->info = m100_module_info_alloc();
     module->uart = uhf_uart_alloc();
     module->uart = uhf_uart_alloc();
+    module->write_mask = WRITE_EPC | WRITE_TID | WRITE_USER | WRITE_RFU;
     return module;
     return module;
 }
 }
 
 
@@ -182,6 +183,18 @@ M100ResponseType m100_set_select(M100Module* module, UHFTag* uhf_tag) {
     return M100SuccessResponse;
     return M100SuccessResponse;
 }
 }
 
 
+void m100_enable_write_mask(M100Module* module, WriteMask mask) {
+    module->write_mask |= mask;
+}
+
+void m100_disable_write_mask(M100Module* module, WriteMask mask) {
+    module->write_mask &= ~mask;
+}
+
+bool m100_is_write_mask_enabled(M100Module* module, WriteMask mask) {
+    return (module->write_mask & mask) == mask;
+}
+
 UHFTag* m100_get_select_param(M100Module* module) {
 UHFTag* m100_get_select_param(M100Module* module) {
     uhf_buffer_reset(module->uart->buffer);
     uhf_buffer_reset(module->uart->buffer);
     // furi_hal_uart_set_irq_cb(FuriHalUartIdLPUART1, rx_callback, module->uart->buffer);
     // furi_hal_uart_set_irq_cb(FuriHalUartIdLPUART1, rx_callback, module->uart->buffer);

+ 11 - 0
uhf_module.h

@@ -30,12 +30,20 @@ typedef enum {
     M100ChecksumFail
     M100ChecksumFail
 } M100ResponseType;
 } M100ResponseType;
 
 
+typedef enum {
+    WRITE_EPC = 1 << 0,
+    WRITE_TID = 1 << 1,
+    WRITE_USER = 1 << 2,
+    WRITE_RFU = 1 << 3
+} WriteMask;
+
 typedef struct {
 typedef struct {
     M100ModuleInfo* info;
     M100ModuleInfo* info;
     WorkingRegion region;
     WorkingRegion region;
     uint16_t region_frequency;
     uint16_t region_frequency;
     uint16_t transmitting_power;
     uint16_t transmitting_power;
     uint16_t max_transmitting_power;
     uint16_t max_transmitting_power;
+    uint16_t write_mask;
     bool freq_hopping;
     bool freq_hopping;
     UHFUart* uart;
     UHFUart* uart;
 } M100Module;
 } M100Module;
@@ -79,3 +87,6 @@ M100ResponseType m100_write_label_data_storage(
     uint32_t access_pwd);
     uint32_t access_pwd);
 
 
 uint32_t m100_get_baudrate(M100Module* module);
 uint32_t m100_get_baudrate(M100Module* module);
+void m100_enable_write_mask(M100Module* module, WriteMask mask);
+void m100_disable_write_mask(M100Module* module, WriteMask mask);
+bool m100_is_write_mask_enabled(M100Module* module, WriteMask mask);

+ 10 - 4
uhf_worker.c

@@ -69,18 +69,24 @@ UHFWorkerEvent write_single_card(UHFWorker* uhf_worker) {
         if(uhf_worker->state == UHFWorkerStateStop) return UHFWorkerEventAborted;
         if(uhf_worker->state == UHFWorkerStateStop) return UHFWorkerEventAborted;
         if(rp_type == M100SuccessResponse) break;
         if(rp_type == M100SuccessResponse) break;
     }while(true);
     }while(true);
-    do {
+    while(m100_is_write_mask_enabled(uhf_worker->module, WRITE_USER)){
         rp_type = m100_write_label_data_storage(
         rp_type = m100_write_label_data_storage(
             uhf_worker->module, uhf_tag_from, uhf_tag_des, UserBank, 0, 0);
             uhf_worker->module, uhf_tag_from, uhf_tag_des, UserBank, 0, 0);
         if(uhf_worker->state == UHFWorkerStateStop) return UHFWorkerEventAborted;
         if(uhf_worker->state == UHFWorkerStateStop) return UHFWorkerEventAborted;
         if(rp_type == M100SuccessResponse) break;
         if(rp_type == M100SuccessResponse) break;
-    } while(true);
-    do {
+    }
+    while(m100_is_write_mask_enabled(uhf_worker->module, WRITE_TID)){
+        rp_type = m100_write_label_data_storage(
+            uhf_worker->module, uhf_tag_from, uhf_tag_des, TIDBank, 0, 0);
+        if(uhf_worker->state == UHFWorkerStateStop) return UHFWorkerEventAborted;
+        if(rp_type == M100SuccessResponse) break;
+    }
+    while(m100_is_write_mask_enabled(uhf_worker->module, WRITE_EPC)){
         rp_type = m100_write_label_data_storage(
         rp_type = m100_write_label_data_storage(
             uhf_worker->module, uhf_tag_from, uhf_tag_des, EPCBank, 0, 0);
             uhf_worker->module, uhf_tag_from, uhf_tag_des, EPCBank, 0, 0);
         if(uhf_worker->state == UHFWorkerStateStop) return UHFWorkerEventAborted;
         if(uhf_worker->state == UHFWorkerStateStop) return UHFWorkerEventAborted;
         if(rp_type == M100SuccessResponse) break;
         if(rp_type == M100SuccessResponse) break;
-    } while(true);
+    }
     return UHFWorkerEventSuccess;
     return UHFWorkerEventSuccess;
 }
 }