[FL-2528] Fix iButton crash on successful emulation #1220

This commit is contained in:
Georgii Surkov 2022-05-11 18:47:01 +03:00 committed by GitHub
parent 9a11d3996d
commit 85a129b89f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 3 deletions

View File

@ -9,6 +9,7 @@ typedef enum {
iButtonMessageRead, iButtonMessageRead,
iButtonMessageWrite, iButtonMessageWrite,
iButtonMessageEmulate, iButtonMessageEmulate,
iButtonMessageNotifyEmulate,
} iButtonMessageType; } iButtonMessageType;
typedef struct { typedef struct {
@ -145,6 +146,11 @@ void ibutton_worker_switch_mode(iButtonWorker* worker, iButtonWorkerMode mode) {
ibutton_worker_modes[worker->mode_index].start(worker); ibutton_worker_modes[worker->mode_index].start(worker);
} }
void ibutton_worker_notify_emulate(iButtonWorker* worker) {
iButtonMessage message = {.type = iButtonMessageNotifyEmulate};
furi_check(osMessageQueuePut(worker->messages, &message, 0, 0) == osOK);
}
void ibutton_worker_set_key_p(iButtonWorker* worker, iButtonKey* key) { void ibutton_worker_set_key_p(iButtonWorker* worker, iButtonKey* key) {
worker->key_p = key; worker->key_p = key;
} }
@ -183,6 +189,11 @@ static int32_t ibutton_worker_thread(void* thread_context) {
ibutton_worker_set_key_p(worker, message.data.key); ibutton_worker_set_key_p(worker, message.data.key);
ibutton_worker_switch_mode(worker, iButtonWorkerEmulate); ibutton_worker_switch_mode(worker, iButtonWorkerEmulate);
break; break;
case iButtonMessageNotifyEmulate:
if(worker->emulate_cb) {
worker->emulate_cb(worker->cb_ctx, true);
}
break;
} }
} else if(status == osErrorTimeout) { } else if(status == osErrorTimeout) {
ibutton_worker_modes[worker->mode_index].tick(worker); ibutton_worker_modes[worker->mode_index].tick(worker);

View File

@ -73,6 +73,7 @@ struct iButtonWorker {
extern const iButtonWorkerModeType ibutton_worker_modes[]; extern const iButtonWorkerModeType ibutton_worker_modes[];
void ibutton_worker_switch_mode(iButtonWorker* worker, iButtonWorkerMode mode); void ibutton_worker_switch_mode(iButtonWorker* worker, iButtonWorkerMode mode);
void ibutton_worker_notify_emulate(iButtonWorker* worker);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -184,9 +184,7 @@ void ibutton_worker_mode_read_stop(iButtonWorker* worker) {
static void onewire_slave_callback(void* context) { static void onewire_slave_callback(void* context) {
furi_assert(context); furi_assert(context);
iButtonWorker* worker = context; iButtonWorker* worker = context;
if(worker->emulate_cb != NULL) { ibutton_worker_notify_emulate(worker);
worker->emulate_cb(worker->cb_ctx, true);
}
} }
void ibutton_worker_emulate_dallas_start(iButtonWorker* worker) { void ibutton_worker_emulate_dallas_start(iButtonWorker* worker) {