zephyr/subsys/modem/modem_pipelink.c

83 lines
1.6 KiB
C

/*
* 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);
}
}