Skip to content

Commit

Permalink
Add SignalVector function group_annotation().
Browse files Browse the repository at this point in the history
Signed-off-by: Rule Timothy (VM/EMT3) <[email protected]>
  • Loading branch information
timrulebosch committed Apr 15, 2024
1 parent bb43bd4 commit 2ed6be2
Show file tree
Hide file tree
Showing 3 changed files with 116 additions and 26 deletions.
48 changes: 28 additions & 20 deletions dse/modelc/model.h
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,8 @@ Example (Model Interface)
Example (Signal Vector Interface)
-------
{{< readfile file="../examples/signalvector_interface.c" code="true" lang="c" >}}
{{< readfile file="../examples/signalvector_interface.c" code="true" lang="c"
>}}
*/

Expand All @@ -139,8 +140,8 @@ Example (Signal Vector Interface)
typedef ModelDesc* (*ModelCreate)(ModelDesc* m);
typedef int (*ModelStep)(ModelDesc* m, double* model_time, double stop_time);
typedef void (*ModelDestroy)(ModelDesc* m);
typedef ModelSignalIndex (*ModelIndex)(ModelDesc* m, const char* vname,
const char* sname);
typedef ModelSignalIndex (*ModelIndex)(
ModelDesc* m, const char* vname, const char* sname);


typedef struct ModelVTable {
Expand Down Expand Up @@ -173,15 +174,16 @@ typedef struct ModelSignalIndex {

/* Implemented by Model. */
DLL_PUBLIC ModelDesc* model_create(ModelDesc* m);
DLL_PUBLIC int model_step(ModelDesc* m, double* model_time, double stop_time);
DLL_PUBLIC int model_step(ModelDesc* m, double* model_time, double stop_time);
DLL_PUBLIC void model_destroy(ModelDesc* m);


/* Provided by ModelC. */
DLL_PUBLIC ModelSignalIndex model_index_(
ModelDesc* model, const char* vname, const char* sname);
DLL_PUBLIC const char* model_annotation(ModelDesc* m, const char* name);
DLL_PUBLIC const char* model_instance_annotation(ModelDesc* m, const char* name);
DLL_PUBLIC const char* model_instance_annotation(
ModelDesc* m, const char* name);


/* Signal Interface. */
Expand All @@ -193,14 +195,17 @@ typedef int (*BinarySignalReleaseFunc)(SignalVector* sv, uint32_t index);
typedef void* (*BinarySignalCodecFunc)(SignalVector* sv, uint32_t index);
typedef const char* (*SignalAnnotationGetFunc)(
SignalVector* sv, uint32_t index, const char* name);
typedef const char* (*SignalGroupAnnotationGetFunc)(
SignalVector* sv, const char* name);


typedef struct SignalVectorVTable {
BinarySignalAppendFunc append;
BinarySignalResetFunc reset;
BinarySignalReleaseFunc release;
SignalAnnotationGetFunc annotation;
BinarySignalCodecFunc codec;
BinarySignalAppendFunc append;
BinarySignalResetFunc reset;
BinarySignalReleaseFunc release;
SignalAnnotationGetFunc annotation;
BinarySignalCodecFunc codec;
SignalGroupAnnotationGetFunc group_annotation;
} SignalVectorVTable;


Expand All @@ -218,8 +223,8 @@ typedef struct SignalVector {
};
struct {
void** binary;
uint32_t* length; /* Length of binary object. */
uint32_t* buffer_size; /* Size of allocated buffer. */
uint32_t* length; /* Length of binary object. */
uint32_t* buffer_size; /* Size of allocated buffer. */
const char** mime_type;
void** ncodec; /* Network Codec objects. */
bool* reset_called; /* Indicate that reset() was called. */
Expand All @@ -233,18 +238,21 @@ typedef struct SignalVector {
BinarySignalCodecFunc codec;
/* Reference data. */
ModelInstanceSpec* mi;
void* index; /* Hashmap object, index on `signal`. */
void* index; /* Hashmap object, index on `signal`. */

/* TODO: Replace with SignalVectorVTable at next minor version bump. */
SignalGroupAnnotationGetFunc group_annotation;
} SignalVector;


/* Provided by ModelC (virtual methods of SignalVectorVTable). */
DLL_PUBLIC int signal_append(SignalVector* sv, uint32_t index,
void* data, uint32_t len);
DLL_PUBLIC int signal_reset(SignalVector* sv, uint32_t index);
DLL_PUBLIC int signal_release(SignalVector* sv, uint32_t index);
DLL_PUBLIC void* signal_codec(SignalVector* sv, uint32_t index);
DLL_PUBLIC const char* signal_annotation(SignalVector* sv, uint32_t index,
const char* name);
DLL_PUBLIC int signal_append(
SignalVector* sv, uint32_t index, void* data, uint32_t len);
DLL_PUBLIC int signal_reset(SignalVector* sv, uint32_t index);
DLL_PUBLIC int signal_release(SignalVector* sv, uint32_t index);
DLL_PUBLIC void* signal_codec(SignalVector* sv, uint32_t index);
DLL_PUBLIC const char* signal_annotation(
SignalVector* sv, uint32_t index, const char* name);


#endif // DSE_MODELC_MODEL_H_
64 changes: 58 additions & 6 deletions dse/modelc/model/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,6 @@ static int _signal_group_match_handler(
return 0;
}


static const char* _signal_annotation(ModelInstanceSpec* mi, SignalVector* sv,
const char* signal, const char* name)
{
Expand Down Expand Up @@ -80,6 +79,47 @@ static const char* _signal_annotation(ModelInstanceSpec* mi, SignalVector* sv,
}


static const char* __signal_group_annotation_name;
static const char* __signal_group_annotation_value;

static int _sg_annotation_search_match_handler(
ModelInstanceSpec* model_instance, SchemaObject* object)
{
UNUSED(model_instance);

YamlNode* n = dse_yaml_find_node(object->doc, "metadata/annotations");
const char* value = dse_yaml_get_scalar(n, __signal_group_annotation_name);
if (value) {
/* Match found, return +ve to stop search. */
__signal_group_annotation_value = value;
return 1;
}
return 0; /* Continue search. */
}

static const char* _signal_group_annotation(
ModelInstanceSpec* mi, SignalVector* sv, const char* name)
{
/* Set the search vars. */
__signal_group_annotation_name = name;
__signal_group_annotation_value = NULL;

/* Search over the schema objects. */
ChannelSpec* cs = model_build_channel_spec(mi, sv->name);
SchemaObjectSelector* selector;
selector = schema_build_channel_selector(mi, cs, "SignalGroup");
if (selector) {
schema_object_search(mi, selector, _sg_annotation_search_match_handler);
}
schema_release_selector(selector);
free(cs);

/* If the search was successful (first match wins), the value will be set.
*/
return __signal_group_annotation_value;
}


/* Helper Functions. */

static int __binary_append_nop(
Expand Down Expand Up @@ -162,6 +202,14 @@ static const char* __annotation_get(
return _signal_annotation(sv->mi, sv, sv->signal[index], name);
}

static const char* __group_annotation_get(SignalVector* sv, const char* name)
{
assert(sv);
assert(sv->mi);

return _signal_group_annotation(sv->mi, sv, name);
}

static void* __binary_codec(SignalVector* sv, uint32_t index)
{
assert(sv);
Expand Down Expand Up @@ -200,6 +248,7 @@ static int _add_sv(void* _mfc, void* _sv_data)
current_sv->signal = mfc->signal_names;
current_sv->function_name = data->current_modelfunction_name;
current_sv->annotation = __annotation_get;
current_sv->group_annotation = __group_annotation_get;
current_sv->mi = data->mi;
if (mfc->signal_value_binary) {
current_sv->is_binary = true;
Expand Down Expand Up @@ -403,8 +452,8 @@ Returns
<>0
: Indicates an error condition. Inspect `errno` for additional information.
*/
extern int signal_append(SignalVector* sv, uint32_t index,
void* data, uint32_t len);
extern int signal_append(
SignalVector* sv, uint32_t index, void* data, uint32_t len);


/**
Expand Down Expand Up @@ -498,13 +547,15 @@ kind: SignalGroup
signals:
- signal: can_bus
annotations:
mime_type: application/x-automotive-bus; interface=stream; type=frame; bus=can; schema=fbs; bus_id=1; node_id=2; interface_id=3
mime_type: application/x-automotive-bus; interface=stream; type=frame;
bus=can; schema=fbs; bus_id=1; node_id=2; interface_id=3
```
Reference
---------
[Network Codec API](https://github.com/boschglobal/dse.standards/tree/main/dse/ncodec)
[Network Codec
API](https://github.com/boschglobal/dse.standards/tree/main/dse/ncodec)
*/
extern void* signal_codec(SignalVector* sv, uint32_t index);
Expand Down Expand Up @@ -549,7 +600,8 @@ kind: SignalGroup
Example (Code Usage)
-------
{{< readfile file="../examples/signalvector_annotation.c" code="true" lang="c" >}}
{{< readfile file="../examples/signalvector_annotation.c" code="true" lang="c"
>}}
NULL
Expand Down
30 changes: 30 additions & 0 deletions tests/cmocka/model/test_signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -236,17 +236,46 @@ void test_signal__annotations(void** state)
const char* value;

value = sv->annotation(sv, 0, "name");
assert_non_null(value);
assert_string_equal(value, "binary_foo");
value = sv->annotation(sv, 0, "mime_type");
assert_null(value);

value = sv->annotation(sv, 1, "name");
assert_non_null(value);
assert_string_equal(value, "binary_bar");
value = sv->annotation(sv, 1, "mime_type");
assert_non_null(value);
assert_string_equal(value, "application/custom-stream");
}


void test_signal__group_annotations(void** state)
{
ModelCMock* mock = *state;

SignalVector* sv_save = mock->mi->model_desc->sv;
assert_int_equal(_sv_count(sv_save), 2);

/* Use the "binary" signal vector. */
SignalVector* sv = sv_save;
while (sv && sv->name) {
if (strcmp(sv->name, "binary") == 0) break;
/* Next signal vector. */
sv++;
}

/* Check annotations. */
const char* value;

value = sv->group_annotation(sv, "vector_name");
assert_non_null(value);
assert_string_equal(value, "network_vector");
value = sv->group_annotation(sv, "missing");
assert_null(value);
}


void test_signal__binary_echo(void** state)
{
/* ModelC detects and prevents echo of binary data via reset_called.
Expand Down Expand Up @@ -317,6 +346,7 @@ int run_signal_tests(void)
cmocka_unit_test_setup_teardown(test_signal__scalar, s, t),
cmocka_unit_test_setup_teardown(test_signal__binary, s, t),
cmocka_unit_test_setup_teardown(test_signal__annotations, s, t),
cmocka_unit_test_setup_teardown(test_signal__group_annotations, s, t),
cmocka_unit_test_setup_teardown(test_signal__binary_echo, s, t),
};

Expand Down

0 comments on commit 2ed6be2

Please sign in to comment.