|  | /* | 
|  | * Copyright (c) 2024 Trackunit Corporation | 
|  | * | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  |  | 
|  | #include <zephyr/modem/pipelink.h> | 
|  |  | 
|  | static void try_callback(struct modem_pipelink *link, enum modem_pipelink_event event) | 
|  | { | 
|  | if (link->callback == NULL) { | 
|  | return; | 
|  | } | 
|  |  | 
|  | link->callback(link, event, link->user_data); | 
|  | } | 
|  |  | 
|  | void modem_pipelink_attach(struct modem_pipelink *link, | 
|  | modem_pipelink_callback callback, | 
|  | void *user_data) | 
|  | { | 
|  | K_SPINLOCK(&link->spinlock) { | 
|  | link->callback = callback; | 
|  | link->user_data = user_data; | 
|  | } | 
|  | } | 
|  |  | 
|  | bool modem_pipelink_is_connected(struct modem_pipelink *link) | 
|  | { | 
|  | bool connected; | 
|  |  | 
|  | K_SPINLOCK(&link->spinlock) { | 
|  | connected = link->connected; | 
|  | } | 
|  |  | 
|  | return connected; | 
|  | } | 
|  |  | 
|  | struct modem_pipe *modem_pipelink_get_pipe(struct modem_pipelink *link) | 
|  | { | 
|  | return link->pipe; | 
|  | } | 
|  |  | 
|  | void modem_pipelink_release(struct modem_pipelink *link) | 
|  | { | 
|  | K_SPINLOCK(&link->spinlock) { | 
|  | link->callback = NULL; | 
|  | link->user_data = NULL; | 
|  | } | 
|  | } | 
|  |  | 
|  | void modem_pipelink_init(struct modem_pipelink *link, struct modem_pipe *pipe) | 
|  | { | 
|  | link->pipe = pipe; | 
|  | link->callback = NULL; | 
|  | link->user_data = NULL; | 
|  | link->connected = false; | 
|  | } | 
|  |  | 
|  | void modem_pipelink_notify_connected(struct modem_pipelink *link) | 
|  | { | 
|  | K_SPINLOCK(&link->spinlock) { | 
|  | if (link->connected) { | 
|  | K_SPINLOCK_BREAK; | 
|  | } | 
|  |  | 
|  | link->connected = true; | 
|  | try_callback(link, MODEM_PIPELINK_EVENT_CONNECTED); | 
|  | } | 
|  | } | 
|  |  | 
|  | void modem_pipelink_notify_disconnected(struct modem_pipelink *link) | 
|  | { | 
|  | K_SPINLOCK(&link->spinlock) { | 
|  | if (!link->connected) { | 
|  | K_SPINLOCK_BREAK; | 
|  | } | 
|  |  | 
|  | link->connected = false; | 
|  | try_callback(link, MODEM_PIPELINK_EVENT_DISCONNECTED); | 
|  | } | 
|  | } |