>From my side I can just say yes, yes, yes.

CANopen protocol due to abstract nature of CAN transport come with
similar thing called "FrameBuilder":
https://github.com/apache/plc4x/blob/develop/plc4j/drivers/canopen/src/main/java/org/apache/plc4x/java/canopen/transport/socketcan/CANOpenSocketCANFrameBuilder.java

I had to do it for different reasons than yours but it is ultimately
there to cut down amount of new Frame(receiver, new Payload(type, new
Data(....))).

Best,
Łukasz

On 22.01.2021 09:30, Christofer Dutz wrote:
> Hi all,
> 
> last night I had an idea how we can perhaps make it even simpler to write 
> drivers and even have more code generated.
> 
> Up till now we auto-generate the model, the serializers and the parsers. This 
> was a huge amount of code.
> 
> Right now when implementing drivers in the different languages, I keep on 
> having to create instances of the same messages.
> Even in java some times this wrapping model classes in other model classes 
> and again in yet some other model classes, this still is anoying .
> In C it's allmost a nightmare.
> 
> So I thought ... how about extending mspec a bit again and to use this to 
> provide something like "message-factories".
> Assume we had a new type "messageFactory" (possibly we could even have 
> multiple of these segments) and each case is a separate message template.
> 
> So instead of:
> 
> S7ParameterSetupCommunication s7ParameterSetupCommunication =
>     new S7ParameterSetupCommunication(
>         s7DriverContext.getMaxAmqCaller(), s7DriverContext.getMaxAmqCallee(), 
> s7DriverContext.getPduSize());
> S7Message s7Message = new S7MessageRequest(0, s7ParameterSetupCommunication,
>     null);
> COTPPacketData cotpPacketData = new COTPPacketData(null, s7Message, true, 
> (short) 1);
> return new TPKTPacket(cotpPacketData);
> 
> Or:
> 
> 
> *s7_connect_request_packet = malloc(sizeof(plc4c_s7_read_write_tpkt_packet));
> if (*s7_connect_request_packet == NULL) {
>   return NO_MEMORY;
> }
> (*s7_connect_request_packet)->payload =
>     malloc(sizeof(plc4c_s7_read_write_cotp_packet));
> if ((*s7_connect_request_packet)->payload == NULL) {
>   return NO_MEMORY;
> }
> (*s7_connect_request_packet)->payload->_type =
>     plc4c_s7_read_write_cotp_packet_type_plc4c_s7_read_write_cotp_packet_data;
> (*s7_connect_request_packet)->payload->parameters = NULL;
> (*s7_connect_request_packet)->payload->cotp_packet_data_eot = true;
> (*s7_connect_request_packet)->payload->cotp_packet_data_tpdu_ref = 1;
> 
> (*s7_connect_request_packet)->payload->payload =
>     malloc(sizeof(plc4c_s7_read_write_s7_message));
> if ((*s7_connect_request_packet)->payload->payload == NULL) {
>   return NO_MEMORY;
> }
> (*s7_connect_request_packet)->payload->payload->_type =
>     
> plc4c_s7_read_write_s7_message_type_plc4c_s7_read_write_s7_message_request;
> 
> (*s7_connect_request_packet)->payload->payload->parameter =
>     malloc(sizeof(plc4c_s7_read_write_s7_parameter));
> if ((*s7_connect_request_packet)->payload->payload->parameter == NULL) {
>   return NO_MEMORY;
> }
> (*s7_connect_request_packet)->payload->payload->parameter->_type =
>     
> plc4c_s7_read_write_s7_parameter_type_plc4c_s7_read_write_s7_parameter_setup_communication;
> (*s7_connect_request_packet)
>     ->payload->payload->parameter
>     ->s7_parameter_setup_communication_max_amq_callee =
>     configuration->max_amq_callee;
> (*s7_connect_request_packet)
>     ->payload->payload->parameter
>     ->s7_parameter_setup_communication_max_amq_caller =
>     configuration->max_amq_caller;
> (*s7_connect_request_packet)
>     ->payload->payload->parameter
>     ->s7_parameter_setup_communication_pdu_length = configuration->pdu_size;
> 
> (*s7_connect_request_packet)->payload->payload->payload = NULL;
> 
> We could simply write:
> 
> S7Message message = S7MessageFactory.createS7ConnectionReqeust(maxAmqCaller, 
> maxAmqCallee, maxPduSize);
> 
> What do you think?
> 
> Chris
> 

Reply via email to