mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-06-08 02:15:53 +08:00
Teach gen_airframe.ml to generate SendCscFromActuators macro to allow
mapping actuators defined in airframe into fields of CSC messages.
Used to control servos over a CAN bus.
Airframe xml example for 2 csc boards:
<csc_boards>
<board id="0">
<msg id="SERVO_CMD_ID" type="ServoCmd">
<field_map field="servos[0]" servo_id="SERVO_S1"/>
<field_map field="servos[1]" servo_id="SERVO_S2"/>
</msg>
<msg id="PROP_CMD_ID" type="PropCmd">
<field_map field="speeds[0]" servo_id="SERVO_UPPER_LEFT"/>
<field_map field="speeds[1]" servo_id="SERVO_LOWER_RIGHT"/>
<field_map field="speeds[2]" servo_id="SERVO_LOWER_LEFT"/>
<field_map field="speeds[3]" servo_id="SERVO_UPPER_RIGHT"/>
</msg>
</board>
<board id="1">
<msg id="SERVO_CMD_ID" type="ServoCmd">
<field_map field="servos[0]" servo_id="SERVO_S_UPPER_LEFT"/>
<field_map field="servos[1]" servo_id="SERVO_S_LOWER_RIGHT"/>
<field_map field="servos[2]" servo_id="SERVO_S_LOWER_LEFT"/>
<field_map field="servos[3]" servo_id="SERVO_S_UPPER_RIGHT"/>
</msg>
</board>
</csc_boards>
This commit is contained in:
@@ -129,6 +129,39 @@ let parse_command_laws = fun command ->
|
||||
parse_element "" command
|
||||
| _ -> xml_error "set|let"
|
||||
|
||||
let parse_csc_fields = fun csc_fields ->
|
||||
let a = fun s -> ExtXml.attrib csc_fields s in
|
||||
match Xml.tag csc_fields with
|
||||
"field_map" ->
|
||||
let servo_id = a "servo_id"
|
||||
and field = a "field" in
|
||||
printf " temp.%s = actuators[%s]; \\\n" field servo_id;
|
||||
| _ -> xml_error "field_map"
|
||||
|
||||
let parse_csc_messages = (let msg_index_ref = ref 0 in fun csc_id csc_messages ->
|
||||
let a = fun s -> ExtXml.attrib csc_messages s in
|
||||
match Xml.tag csc_messages with
|
||||
"msg" ->
|
||||
let msg_id = a "id"
|
||||
and msg_type = a "type"
|
||||
and msg_index = msg_index_ref.contents in
|
||||
msg_index_ref.contents <- msg_index + 1;
|
||||
printf "{\\\n struct Csc%s temp; \\\n" msg_type;
|
||||
List.iter parse_csc_fields (Xml.children csc_messages);
|
||||
printf " can_write_csc(%s, CSC_%s, (uint8_t *)&temp, sizeof(struct Csc%s)); \\\n" csc_id msg_id msg_type;
|
||||
printf "} \\\n"
|
||||
| _ -> xml_error "msg"
|
||||
)
|
||||
|
||||
let parse_csc_boards = fun csc_board ->
|
||||
let a = fun s -> ExtXml.attrib csc_board s in
|
||||
match Xml.tag csc_board with
|
||||
"board" ->
|
||||
let csc_id = a "id" in
|
||||
List.iter (parse_csc_messages csc_id) (Xml.children csc_board);
|
||||
| "define" ->
|
||||
parse_element "" csc_board
|
||||
| _ -> xml_error "board"
|
||||
|
||||
let parse_rc_commands = fun rc ->
|
||||
let a = fun s -> ExtXml.attrib rc s in
|
||||
@@ -198,6 +231,12 @@ let parse_section = fun s ->
|
||||
List.iter parse_command_laws (Xml.children s);
|
||||
printf " ActuatorsCommit();\\\n";
|
||||
printf "}\n"
|
||||
| "csc_boards" ->
|
||||
let boards = Array.of_list (Xml.children s) in
|
||||
define "CSC_BOARD_NB" (string_of_int (Array.length boards + 1));
|
||||
printf "#define SendCscFromActuators() { \\\n";
|
||||
List.iter parse_csc_boards (Xml.children s);
|
||||
printf "}\n"
|
||||
| "makefile" ->
|
||||
()
|
||||
(** Ignoring this section *)
|
||||
|
||||
Reference in New Issue
Block a user