Add ovni_mark_set() to the API

Allows emitting a single event to change the value of the mark channel.
The mark type must be defined as single without the MARK_FLAG_STACK
flag.
This commit is contained in:
Rodrigo Arias 2024-06-17 13:48:18 +02:00
parent 90f8ae4188
commit 2c111fd98c
4 changed files with 15 additions and 0 deletions

View File

@ -150,6 +150,7 @@ void ovni_mark_type(int32_t type, long flags, const char *title);
void ovni_mark_label(int32_t type, int64_t value, const char *label);
void ovni_mark_push(int32_t type, int64_t value);
void ovni_mark_pop(int32_t type, int64_t value);
void ovni_mark_set(int32_t type, int64_t value);
#ifdef __cplusplus
}

View File

@ -478,6 +478,8 @@ mark_event(struct emu *emu)
return chan_push(ch, value_int64(value));
case ']':
return chan_pop(ch, value_int64(value));
case '=':
return chan_set(ch, value_int64(value));
default:
err("unknown mark event value %c", emu->ev->v);
return -1;

View File

@ -40,6 +40,7 @@ static struct ev_decl model_evlist[] = {
{ "OM[(i64 value, i32 type)", "push mark with value %{value} from type %{type}" },
{ "OM](i64 value, i32 type)", "pop mark with value %{value} from type %{type}" },
{ "OM=(i64 value, i32 type)", "set mark with value %{value} from type %{type}" },
{ NULL, NULL },
};

View File

@ -1154,3 +1154,14 @@ ovni_mark_pop(int32_t type, int64_t value)
ovni_payload_add(&ev, (uint8_t *) &type, sizeof(type));
ovni_ev_add(&ev);
}
void
ovni_mark_set(int32_t type, int64_t value)
{
struct ovni_ev ev = {0};
ovni_ev_set_clock(&ev, ovni_clock_now());
ovni_ev_set_mcv(&ev, "OM=");
ovni_payload_add(&ev, (uint8_t *) &value, sizeof(value));
ovni_payload_add(&ev, (uint8_t *) &type, sizeof(type));
ovni_ev_add(&ev);
}