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:
Allen Ibara
2009-07-22 22:51:42 +00:00
parent 0e5a63bd10
commit ec95cca605
+39
View File
@@ -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 *)