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