The Fortran binding

The generated clunkyard module uses ISO_C_BINDING for the core's C ABI. Records are interoperable derived types, enums are integer constants, and procedures return statuses and copy results into the caller's variables. CY_NONE means absent; negative statuses are errors. cy_last_error gives the error message. Text is UTF-8 with explicit byte lengths. A list takes an array, its capacity and a count; CY_SHORT gives the required capacity. The binding contains no protocol parser, tracker or physics implementation.

Install with make install SDK=/opt/clunkyard/sdk. Build with gfortran -std=f2018 -O2 -ffree-line-length-none -I/opt/clunkyard/sdk/bindings/fortran bot.f90 /opt/clunkyard/sdk/bindings/fortran/clunkyard.o /opt/clunkyard/sdk/lib/libclunkyard.a -lpthread -ldl -lm -o bot. Only the native executable is shipped in the artifact.

cy_open opens standard I/O and protects the protocol pipe. For tests, use cy_open_memory, cy_session_feed and cy_session_reply. Each successful cy_session_next reads a hello, state or end event. Send a reply with cy_session_send. After CY_E_INTERNAL, send the core's empty reply and continue; the next state recovers the session. cy_session_forfeit reports a robot forfeit.

A tiny robot

program tiny
use clunkyard
implicit none
type(c_ptr) :: robot
type(cy_contact) :: target
type(cy_solution) :: aim
type(cy_scan) :: last
integer(c_int32_t) :: status,event,can_fire
real(c_double) :: heading,power,delta,control
status=cy_open(2,0,'clunkyard-fortran',17,'2.0.0',5,robot)
do
  status=cy_session_next(robot,event)
  if(status==CY_E_INTERNAL)then
    status=cy_session_send(robot)
    if(status<0)exit
    cycle
  end if
  if(status/=CY_OK.or.event==CY_EVENT_END)exit
  if(event==CY_EVENT_STATE)then
    status=cy_me_heading(robot,heading)
    if(cy_sensors_nearest(robot,target)/=CY_OK)then
      status=cy_drive_throttle(robot,0.75_c_double);status=cy_drive_turn(robot,0.25_c_double)
      status=cy_scanner_heading(robot,heading);status=cy_scanner_arc(robot,40.0_c_double)
      status=cy_scanner_last(robot,last);status=cy_status_text(robot,'SEARCH',6);status=cy_status_value(robot,last%arc)
    else
      status=cy_gun_power_for_flight_time(robot,target%range,1.0_c_double,power)
      if(cy_gun_lead(robot,target,power,aim)/=CY_OK)then
        aim%heading=target%bearing;aim%pitch=target%elevation
      end if
      status=cy_gun_aim_heading(robot,aim%heading);status=cy_gun_aim_pitch(robot,aim%pitch)
      status=cy_gun_can_fire(robot,power,10.0_c_double,can_fire)
      if(can_fire/=0)then
        status=cy_gun_fire(robot);status=cy_gun_power(robot,power)
      end if
      status=cy_angles_angle_diff(target%bearing,heading,delta)
      status=cy_angles_clamp(delta,-1.0_c_double,1.0_c_double,control)
      status=cy_drive_throttle(robot,0.5_c_double);status=cy_drive_turn(robot,control)
      status=cy_scanner_heading(robot,target%bearing);status=cy_scanner_arc(robot,10.0_c_double)
      status=cy_status_text(robot,'TRACK',5);status=cy_status_value(robot,target%range)
    end if
  end if
  status=cy_session_send(robot)
end do
call cy_close(robot)
end program

make test calls every generated Fortran declaration against the core's conformance vectors. It verifies the foreign record layout and marshalling, exact floating-point results, optional values and serialized acts.

Names

Every entry of the robot API 2.0.0 in Fortran. names.md has every language side by side.

Canonical Form Fortran
match.mode property cy_match_mode
match.ruleset property cy_match_ruleset
match.control property cy_match_control
match.robots property cy_match_robots
match.is_3d property cy_match_is_3d
match.tick_rate property cy_match_tick_rate
match.max_ticks property cy_match_max_ticks
match.robot_id call cy_robot_id
clock.tick property cy_clock_tick
clock.seconds property cy_clock_seconds
clock.remaining_ticks property cy_clock_remaining_ticks
arena.size property cy_arena_size
arena.gravity property cy_arena_gravity
arena.terrain_kind property cy_arena_terrain_kind
arena.ground_height call cy_arena_ground_height
me.health property cy_me_health
me.position property cy_me_position
me.velocity property cy_me_velocity
me.heading property cy_me_heading
me.pitch property cy_me_pitch
me.roll property cy_me_roll
me.angular_velocity property cy_me_angular_velocity
me.attitude property cy_me_attitude
me.grounded property cy_me_grounded
me.altitude property cy_me_altitude
me.applied property cy_me_applied
battery.charge property cy_battery_charge
battery.capacity property cy_battery_capacity
battery.regen property cy_battery_regen
battery.sustainable_drive property cy_battery_sustainable_drive
battery.compute property cy_battery_compute
battery.drive_cost call cy_battery_drive_cost
drive.hover_lift property cy_drive_hover_lift
drive.set control cy_drive_throttle, cy_drive_turn, cy_drive_pitch_turn
drive.forces control cy_drive_thrust, cy_drive_strafe, cy_drive_lift, cy_drive_yaw_torque, cy_drive_pitch_torque, cy_drive_roll_torque, cy_drive_brake
drive.get call cy_drive_get_throttle, cy_drive_get_turn, cy_drive_get_pitch_turn, cy_drive_get_thrust, cy_drive_get_strafe, cy_drive_get_lift, cy_drive_get_yaw_torque, cy_drive_get_pitch_torque, cy_drive_get_roll_torque, cy_drive_get_brake
gun.aim_now property cy_gun_aim_now
gun.cooldown_ticks property cy_gun_cooldown_ticks
gun.spread property cy_gun_spread
gun.max_power property cy_gun_max_power
gun.damage_scale property cy_gun_damage_scale
gun.can_fire call cy_gun_can_fire
gun.shot_speed call cy_gun_shot_speed
gun.shot_cost call cy_gun_shot_cost
gun.reload_ticks call cy_gun_reload_ticks
gun.shot_damage call cy_gun_shot_damage
gun.power_for_speed call cy_gun_power_for_speed
gun.power_for_flight_time call cy_gun_power_for_flight_time
gun.lead call cy_gun_lead
gun.lead_point call cy_gun_lead_point
gun.aim control cy_gun_aim_heading, cy_gun_aim_pitch
gun.fire control cy_gun_fire, cy_gun_power
gun.get call cy_gun_get_aim_heading, cy_gun_get_aim_pitch, cy_gun_get_fire, cy_gun_get_power
scanner.last property cy_scanner_last
scanner.proximity_range property cy_scanner_proximity_range
scanner.reach call cy_scanner_reach
scanner.arc_for_reach call cy_scanner_arc_for_reach
scanner.set control cy_scanner_heading, cy_scanner_arc, cy_scanner_pitch
scanner.get call cy_scanner_get_heading, cy_scanner_get_arc, cy_scanner_get_pitch
sensors.contacts property cy_sensors_contacts
sensors.nearest property cy_sensors_nearest
sensors.cues property cy_sensors_cues
sensors.contact call cy_sensors_contact
sensors.position_of call cy_sensors_position_of
tracker.cue property cy_tracker_cue
tracker.nearest_bearing_rate property cy_tracker_nearest_bearing_rate
tracker.velocity call cy_tracker_velocity
tracker.position call cy_tracker_position
tracker.last_seen call cy_tracker_last_seen
tracker.configure call cy_tracker_configure
nav.zone property cy_nav_zone
nav.zone.margin call cy_nav_zone_margin
nav.zone.contains call cy_nav_zone_contains
nav.zone.distance_from call cy_nav_zone_distance_from
nav.storm property cy_nav_storm
nav.storm.margin call cy_nav_storm_margin
nav.storm.contains call cy_nav_storm_contains
nav.storm.distance_from call cy_nav_storm_distance_from
nav.hill property cy_nav_hill
nav.hill.margin call cy_nav_hill_margin
nav.hill.contains call cy_nav_hill_contains
nav.hill.distance_from call cy_nav_hill_distance_from
nav.pickups property cy_nav_pickups
nav.nearest_pickup call cy_nav_nearest_pickup
nav.field_distance call cy_nav_field_distance
score.me property cy_score_me
score.best property cy_score_best
score.armour property cy_score_armour
angles.normalize call cy_angles_normalize
angles.angle_diff call cy_angles_angle_diff
angles.bearing_to call cy_angles_bearing_to
angles.elevation_to call cy_angles_elevation_to
angles.direction call cy_angles_direction
angles.distance call cy_angles_distance
angles.clamp call cy_angles_clamp
status.set control cy_status_text, cy_status_value
status.get call cy_status_get_text, cy_status_get_value
raw.number call cy_raw_number
raw.text call cy_raw_text
raw.has call cy_raw_has
raw.flag call cy_raw_flag
raw.count call cy_raw_count
raw.line call cy_raw_line
raw.extra call cy_raw_extra
session.event property cy_session_event
session.next call cy_session_next
session.send call cy_session_send
session.forfeit call cy_session_forfeit
session.log call cy_session_log
session.feed call cy_session_feed
session.reply call cy_session_reply

Download this page as Markdown