solstice

Compute collected power and efficiencies of a solar plant
git clone git://git.meso-star.com/solstice.git
Log | Files | Refs | README | LICENSE

commit 788b495441c9a0e439fec76670fef0f0b988cde6
parent b95ba6d5b0762af025fe4bfe5992c9d901ef63ce
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Tue, 14 Mar 2017 15:57:01 +0100

Add the "per_primitive" data to the receiver file format

Diffstat:
Mdoc/receiver | 1+
Msrc/receivers/srcvl.c | 39+++++++++++++++++++++++++++++++++++++--
Msrc/receivers/srcvl.h | 1+
Msrc/receivers/test_srcvl2.c | 19++++++++++++++++++-
Msrc/receivers/yaml/test_ko.yaml | 8++++++++
Msrc/receivers/yaml/test_ok.yaml | 2++
6 files changed, 67 insertions(+), 3 deletions(-)

diff --git a/doc/receiver b/doc/receiver @@ -12,6 +12,7 @@ <receiver> ::= name: <entity-identifier> side: <BACK|FRONT|FRONT_AND_BACK> +[ per_primitive: INTEGER ] # in [0, 1] <entity-identifier> STRING[.STRING ... ] diff --git a/src/receivers/srcvl.c b/src/receivers/srcvl.c @@ -15,6 +15,7 @@ #include "srcvl.h" +#include <rsys/cstr.h> #include <rsys/dynamic_array.h> #include <rsys/mem_allocator.h> #include <rsys/ref_count.h> @@ -27,6 +28,7 @@ struct receiver { struct str name; enum srcvl_side side; + int per_primitive; }; static INLINE void @@ -35,6 +37,7 @@ receiver_init(struct mem_allocator* allocator, struct receiver* receiver) ASSERT(receiver); str_init(allocator, &receiver->name); receiver->side = SRCVL_FRONT_AND_BACK; + receiver->per_primitive = 0; } static INLINE void @@ -49,15 +52,16 @@ receiver_copy(struct receiver* dst, const struct receiver* src) { ASSERT(dst && src); dst->side = src->side; + dst->per_primitive = src->per_primitive; return str_copy(&dst->name, &src->name); } - static INLINE res_T receiver_copy_and_release(struct receiver* dst, struct receiver* src) { ASSERT(dst && src); dst->side = src->side; + dst->per_primitive = src->per_primitive; return str_copy_and_release(&dst->name, &src->name); } @@ -164,12 +168,39 @@ error: } static res_T +parse_integer(struct srcvl* srcvl, yaml_node_t* integer, int* dst) +{ + res_T res = RES_OK; + ASSERT(integer && dst); + + if(integer->type != YAML_SCALAR_NODE + || !strlen((char*)integer->data.scalar.value)) { + log_err(srcvl, integer, "expect an integer.\n"); + res = RES_BAD_ARG; + goto error; + } + + res = cstr_to_int((char*)integer->data.scalar.value, dst); + if(res != RES_OK) { + log_err(srcvl, integer, "invalid integer `%s'.\n", + integer->data.scalar.value); + res = RES_BAD_ARG; + goto error; + } + +exit: + return res; +error: + goto exit; +} + +static res_T parse_receiver (struct srcvl* srcvl, yaml_document_t* doc, const yaml_node_t* receiver) { - enum { NAME, SIDE }; + enum { NAME, PER_PRIMITIVE, SIDE }; struct receiver* solreceiver = NULL; size_t isolreceiver; intptr_t i, n; @@ -218,6 +249,9 @@ parse_receiver } else if(!strcmp((char*)key->data.scalar.value, "side")) { SETUP_MASK(SIDE, "side"); res = parse_side(srcvl, val, &solreceiver->side); + } else if(!strcmp((char*)key->data.scalar.value, "per_primitive")) { + SETUP_MASK(PER_PRIMITIVE, "per_primitive"); + res = parse_integer(srcvl, val, &solreceiver->per_primitive); } else { log_err(srcvl, key, "unknown receiver parameter `%s'.\n", key->data.scalar.value); @@ -427,5 +461,6 @@ srcvl_get r = darray_receiver_cdata_get(&srcvl->receivers) + i; receiver->name = str_cget(&r->name); receiver->side = r->side; + receiver->per_primitive = r->per_primitive; } diff --git a/src/receivers/srcvl.h b/src/receivers/srcvl.h @@ -27,6 +27,7 @@ enum srcvl_side { struct srcvl_receiver { const char* name; enum srcvl_side side; + int per_primitive; /* Define if per primitive receiver is enabled */ }; struct mem_allocator; diff --git a/src/receivers/test_srcvl2.c b/src/receivers/test_srcvl2.c @@ -39,31 +39,48 @@ main(int argc, char** argv) fprintf(stream, "- { name: entity3, side: BACK }\n"); fprintf(stream, "- name: entity4\n"); fprintf(stream, " side: FRONT_AND_BACK\n"); + fprintf(stream, "- { name: entity5, side: BACK, per_primitive: 1 }\n"); + fprintf(stream, "- { name: entity6, per_primitive: 0, side: FRONT }\n"); rewind(stream); CHECK(srcvl_setup_stream(srcvl, NULL, stream), RES_OK); CHECK(srcvl_load(srcvl), RES_OK); - CHECK(srcvl_count(srcvl), 5); + CHECK(srcvl_count(srcvl), 7); srcvl_get(srcvl, 0, &receiver); CHECK(strcmp(receiver.name, "entity0"), 0); CHECK(receiver.side, SRCVL_FRONT_AND_BACK); + CHECK(receiver.per_primitive, 0); srcvl_get(srcvl, 1, &receiver); CHECK(strcmp(receiver.name, "entity1"), 0); CHECK(receiver.side, SRCVL_FRONT_AND_BACK); + CHECK(receiver.per_primitive, 0); srcvl_get(srcvl, 2, &receiver); CHECK(strcmp(receiver.name, "entity2"), 0); CHECK(receiver.side, SRCVL_FRONT); + CHECK(receiver.per_primitive, 0); srcvl_get(srcvl, 3, &receiver); CHECK(strcmp(receiver.name, "entity3"), 0); CHECK(receiver.side, SRCVL_BACK); + CHECK(receiver.per_primitive, 0); srcvl_get(srcvl, 4, &receiver); CHECK(strcmp(receiver.name, "entity4"), 0); CHECK(receiver.side, SRCVL_FRONT_AND_BACK); + CHECK(receiver.per_primitive, 0); + + srcvl_get(srcvl, 5, &receiver); + CHECK(strcmp(receiver.name, "entity5"), 0); + CHECK(receiver.side, SRCVL_BACK); + CHECK(receiver.per_primitive, 1); + + srcvl_get(srcvl, 6, &receiver); + CHECK(strcmp(receiver.name, "entity6"), 0); + CHECK(receiver.side, SRCVL_FRONT); + CHECK(receiver.per_primitive, 0); CHECK(srcvl_load(srcvl), RES_BAD_OP); diff --git a/src/receivers/yaml/test_ko.yaml b/src/receivers/yaml/test_ko.yaml @@ -18,3 +18,11 @@ --- - name: test - +--- +- name: test + per_primitive: hop +--- +- name: test + per_primitive: +--- +- per_primitive: 1 diff --git a/src/receivers/yaml/test_ok.yaml b/src/receivers/yaml/test_ok.yaml @@ -13,4 +13,6 @@ {name: test}, {side: FRONT_AND_BACK, name: "Hello world"}, {name: Hello world, side: BACK} + {name: hop, per_primitive: 1} + {per_primitive: 0, name: test} ]