protgen/templates/blocks.tmpl
2025-04-27 15:31:09 +02:00

106 lines
2.5 KiB
Cheetah

{{define "cenum"}}
typedef enum {
{{- range .Entries }}
{{ .Name }} = {{ printf "0x%X" .ID }},
{{- end }}
} {{.EnumName}};
{{end}}
{{define "payloads"}}
{{- range . }}
typedef struct {
{{- if not .Entries}}
// empty payload
{{- end}}
{{- range .Entries }}
{{- if (.ArrayLength) }}
{{.DataType}} {{.Name}}[{{.ArrayLength}}];
{{- else }}
{{.DataType}} {{.Name}};
{{- end}}
{{- end }}
} {{ .Name }}Payload;
{{end}}
{{- end}}
{{define "union"}}
typedef union {
{{- range .}}
{{.Name}}Payload {{ .Name | snake}};
{{- end }}
} PayloadUnion;
{{end}}
{{define "basemessage"}}
typedef struct {
uint8_t Version;
{{.CenumPCTOESP.EnumName}} MessageID;
uint8_t Length;
PayloadUnion Payload;
} PCTOESPBaseMessage;
typedef struct {
uint8_t Version;
{{.CenumESPTOPC.EnumName}} MessageID;
uint8_t Length;
PayloadUnion Payload;
} ESPTOPCBaseMessage;
{{end}}
{{define "handler"}}
{{- range . }}
void (*on_{{ .Name | snake }})({{ .Name }}Payload*);
{{- end}}
{{end}}
{{define "dispatcher"}}
void dispatch_message(uint8_t msg_id, void *payload) {
switch (msg_id) {
{{- range . }}
case {{ .Name }}:
if (on_{{ .Name | snake }}) on_{{ .Name | snake }}(({{ .Name }}Payload*)payload);
break;
{{- end }}
default:
// Unknown message
break;
}
}
{{end}}
{{define "send_function_prototype"}}
void send_message(ESP_TO_PC_MESSAGE_IDS msgid, PayloadUnion *payload);
{{end}}
{{define "send_function_source"}}
void send_message(ESP_TO_PC_MESSAGE_IDS msgid, PayloadUnion *payload) {}
{{end}}
{{define "send_functions_prototype"}}
{{- range .}}
{{- $argLen := len .Payload }}
void send_{{.Name | snake}}({{- range $i, $p := .Payload}}{{$p.DataType}} {{ if .ArrayLength}}*{{end}}{{$p.Name}} {{- if not (isLast $argLen $i) }}, {{ end}} {{- end}});
{{- end }}
{{end}}
{{define "send_functions_source"}}
{{- range .}}
{{- $argLen := len .Payload }}
void send_{{.Name | snake}}({{- range $i, $p := .Payload}}{{$p.DataType}} {{ if .ArrayLength}}*{{end}}{{$p.Name}} {{ if not (isLast $argLen $i) }}, {{ end}} {{- end}}) {
{{.Name}}Payload payload;
// Payload-Daten zuweisen
{{- range .Payload}}
{{- if .ArrayLength }}
memcpy(payload.{{.Name}}, {{.Name}}, {{.ArrayLength}});
{{- else }}
payload.{{.Name}} = {{.Name}};
{{- end}}
{{- end}}
// Nachricht senden
send_message({{.Name}}, (PayloadUnion *)&payload);
}
{{end}}
{{end}}