Commit Graph

1749 Commits

Author SHA1 Message Date
Peter Barker
6515df72f0 GCS_MAVLink: correct compilation when AP_Vehicle disabled 2023-12-13 18:34:40 +11:00
Peter Barker
70cc84dd89 GCS_Common: correct compilation when AP_RSSI_ENABLED is false 2023-12-13 18:30:32 +11:00
Peter Barker
71a64d5046 GCS_MAVLink: correct compilation when compass not enabled 2023-12-13 14:34:13 +11:00
Iampete1
423a218643 GCS_MAVLink: use new filesystem crc32 method 2023-12-05 11:03:58 +11:00
Bob Long
467e62b967 GCS_Common: allow fallback vert rate in VFR_HUD 2023-12-05 10:44:37 +11:00
Andrew Tridgell
f345d94e91 GCS_MAVLink: increase max mavlink connections when networking enabled 2023-11-28 12:18:55 +11:00
Peter Mullen
adc0ebf9de AP_RangeFinder: Add signal_quality_pct to range finder state 2023-11-21 22:24:12 +11:00
Peter Barker
bc03918ea4 GCS_MAVLink: create and use AP_MAVLINK_MSG_UAVIONIX_ADSB_OUT_STATUS_ENABLED
narrower define we can use when not compiling in the backends which use this
2023-11-21 13:21:13 +11:00
Peter Barker
6d172a1b22 GCS_MAVLink: exclude deadlock-creation based on FAILURE_CREATION_ENABLED 2023-11-21 09:35:50 +09:00
Peter Barker
170d96e8cc GCS_Common: remove mappings for non-supported messages 2023-11-20 19:25:25 +11:00
Peter Barker
70160c58e8 GCS_MAVLink: tidy sending of ADSB messages 2023-11-20 19:25:25 +11:00
Peter Barker
6f5ff2f952 GCS_MAVLink: tidy sending of HIGH_LATENCY2 messages 2023-11-20 19:25:25 +11:00
Peter Barker
031e5b1dab GCS_MAVLink: tidy sending of WATER_DEPTH messages 2023-11-20 19:25:25 +11:00
Peter Barker
a8906ac491 GCS_MAVLink: tidy sending of winch messages 2023-11-20 19:25:25 +11:00
Peter Barker
564e6ec77a GCS_MAVLink: tidy sending of efi messages 2023-11-20 19:25:25 +11:00
Peter Barker
892bafe951 GCS_MAVLink: tidy sending of esc telem generator messages 2023-11-20 19:25:25 +11:00
Peter Barker
a95b2b2497 GCS_MAVLink: tidy sending of queued generator messages 2023-11-20 19:25:25 +11:00
Peter Barker
d894281f2b GCS_MAVLink: tidy sending of queued SIM messages 2023-11-20 19:25:25 +11:00
Peter Barker
ec69867102 GCS_MAVLink: tidy sending of queued mcu status messages 2023-11-20 19:25:25 +11:00
Peter Barker
0983bd2d06 GCS_MAVLink: tidy sending of queued opticalflow messages 2023-11-20 19:25:25 +11:00
Peter Barker
c017c8acf4 GCS_MAVLink: tidy sending of queued mount messages 2023-11-20 19:25:25 +11:00
Peter Barker
24f00ddaf7 GCS_MAVLink: add and use AP_MAVLINK_COMMAND_LONG_ENABLED 2023-11-16 10:50:21 +11:00
Peter Barker
9ff9f8d216 GCS_MAVLink: remove no-longer-required location_from_command_t(command_long) 2023-11-16 10:50:21 +11:00
Peter Barker
485fa80f1c GCS_MAVLink: collapse un-needed method 2023-11-16 10:50:21 +11:00
Peter Barker
e0eacdc197 ArduPlane: handle DO_SET_MISSION_CURRENT as both long and int 2023-11-16 10:50:21 +11:00
Peter Barker
d7160aea2d GCS_MAVLink: handle DO_SET_MISSION_CURRENT as both long and int 2023-11-16 10:50:21 +11:00
Peter Barker
b572fe80ec GCS_MAVLink: handle request autopilot capabilities as both long and int 2023-11-16 10:50:21 +11:00
Nick Exton
59c5092810 GCS_MAVLink: Handle param2 (reset) in DO_SET_MISSION_CURRENT cmd 2023-11-14 10:22:45 +11:00
Nick Exton
0567d8576e GCS_MAVLink: Add explicit handling of DO_JUMP_TAG 2023-11-14 10:22:45 +11:00
Nick Exton
3ba63d33d5 GCS_MAVLink: Add handler for CAMERA_CAPTURE_STATUS request 2023-11-09 13:00:57 +09:00
Peter Barker
abf32906d2 GCS_MAVLink: support gripper commands as both long and int 2023-11-08 18:15:25 +11:00
Peter Barker
09ab14c69f GCS_MAVLink: handle battery reset as both long and int 2023-11-08 18:14:27 +11:00
Peter Barker
1d08900cb0 GCS_MAVLink: handle MAV_CMD_DO_SPRAYER as both long and int 2023-11-07 10:55:46 +11:00
Peter Barker
9285188d85 GCS_MAVLink: handle DO_ADSB_OUT_IDENT as both long and int 2023-11-07 10:32:39 +11:00
Asif Khan
8a791d6082 GCS_MAVLink: add SEND_FOV_STATUS support 2023-11-02 15:54:37 +11:00
Peter Barker
187ae07225 GCS_MAVLink: handle camera messages as COMMAND_INT as well as COMMAND_LONG 2023-11-02 15:54:13 +11:00
Peter Barker
9d9b95af15 GCS_MAVLink: correct mavlink result when airspeed not available
only in progress if we have started a task running
2023-11-02 15:52:30 +11:00
Peter Barker
e162e74c0c GCS_MAVLink: allow MAV_CMD_RUN_PREARMS as both long and int 2023-11-01 19:30:44 +11:00
Iampete1
d25d1c253e GCS_MAVLink: MissionItemProtocol_Rally: deal with alt frame 2023-11-01 19:06:39 +11:00
Peter Barker
78475cad5c GCS_MAVLink: handle FLASH_BOOTLOADER as command-long and command-int 2023-10-31 11:32:32 +11:00
Peter Barker
afd85c8613 GCS_MAVLink: handle MAV_CMD_START_RX_PAIR as both int and long 2023-10-31 11:18:57 +11:00
Nick Exton
57cead9052 GCS_MAVLink: Make handler for DO_SET_ROI_NONE common 2023-10-30 08:28:23 +09:00
Peter Barker
b5edc4c757 GCS_MAVLink: correct use of AP_MAVLINK_MSG_RELAY_STATUS_ENABLED define 2023-10-27 14:16:47 +11:00
Peter Barker
2ac9cc94c6 GCS_MAVLink: correct compilation if rangefinder disabled 2023-10-27 14:16:47 +11:00
Peter Barker
fbbadecfe3 GCS_MAVLink: tidy use of GPS mavlink defines 2023-10-27 14:16:47 +11:00
Peter Barker
1c7eebec3a GCS_MAVLink: tidy proximity message handling 2023-10-27 14:16:47 +11:00
Peter Barker
306caae6e5 GCS_MAVLink: tidy OSD param message handling 2023-10-27 14:16:47 +11:00
Peter Barker
1f0ae343b1 GCS_MAVLink: tidy ADSB message handling 2023-10-27 14:16:47 +11:00
Peter Barker
c1f0c9e70a GCS_MAVLink: tidy CAN message handling 2023-10-27 14:16:47 +11:00
Peter Barker
0f6718b23d GCS_MAVLink: remove FLASH_BOOTLOADER commandd if not compiled in
removes handling of MAV_CMD_FLASH_BOOTLOADER if AP_BOOTLOADER_FLASHING_ENABLED is disabled

Side-effect of correcting the mavlink result code in that case.
2023-10-27 14:16:47 +11:00
Peter Barker
d665d2c56e GCS_MAVLink: save bytes when AP_AIS_ENABLED is false 2023-10-27 14:16:47 +11:00
Peter Barker
e85f843c5d CS_MAVLink: tidy use of AP_BATTERY_ENABLED defines
remove entire functions rather than just their content
2023-10-26 13:23:57 +11:00
Peter Barker
2412ba495d GCS_MAVLink: remove handling of PREFLIGHT_SET_SENSOR_OFFSETS
This was the old offboard-calibration code.

We've checked MAVProxy, QGC and MissionPlanner and they're not using this code.

The onboard calibration stuff is better.
2023-10-26 13:19:59 +11:00
Peter Barker
740b939aa5 GCS_MAVLink: handle control-high-latency as both long and int 2023-10-26 13:19:29 +11:00
Peter Barker
21eaa08333 GCS_MAVLink: handle MAV_CMD_NAV_TAKEOFF via command_long and command_in 2023-10-24 12:59:19 +11:00
Peter Barker
0b04f765d4 GCS_MAVLink: factor out a virtual mav_frame_for_command_long method 2023-10-24 12:59:19 +11:00
Peter Barker
25846eb2bc GCS_MAVLink: handld MAV_CMD_DO_FENCE_ENABLE as both long and int 2023-10-24 11:37:18 +11:00
Peter Barker
37b02725b3 GCS_MAVLink: handle MAV_CMD_DO_SEND_BANNER as both long and int 2023-10-18 19:49:17 +11:00
Peter Barker
e71227fe3a GCS_MAVLink: handle MAV_CMD_GET_HOME_POSITION as both long and int 2023-10-18 19:48:23 +11:00
Peter Barker
7713b531a0 GCS_MAVLink: allow setting modes via COMMAND_INT and DO_SET_MODE 2023-10-17 10:41:36 +11:00
Peter Barker
90d39a6ee0 GCS_MAVLink: add build option for deprecated MISSION_REQUEST
replaced by MISSION_REQUEST_INT
2023-10-17 10:40:12 +11:00
Peter Barker
1ece48b2b3 GCS_MAVLink: handle MAV_CMD_DEBUG_TRAP as both long and int 2023-10-17 10:25:45 +11:00
stephan
0b24dc239f GCS_MAVlink: correct routing for Solo Gimbal
Check for a opro camera in a Solo gimbal added and re-enable the routing of Gopro Mavlink commands
2023-10-17 10:02:49 +11:00
Peter Barker
659db36efe GCS_MAVLink: accept accel cal vehicle positions as both int and long 2023-10-12 20:39:32 +11:00
Peter Barker
bb6287893d GCS_MAVLink: allow for compilation without AP_RTC_ENABLED 2023-10-11 19:17:27 +11:00
Peter Barker
ce1bb64686 GCS_MAVLink: handle EKF_SOURCE_SET as both long and int 2023-10-11 18:37:02 +11:00
Willian Galvani
107474b792 GCS_Common: use int8_t for rangefinder quality_pct 2023-10-11 08:29:58 +11:00
Peter Barker
805901dc18 GCS_MAVLink: allow PREFLIGHT_STORAGE as COMMAND_INT and COMMAND_LONG 2023-10-10 08:29:26 +09:00
Peter Barker
77945be031 GCS_MAVLink: cope with NaNs being passed in when doing conversion to command_int 2023-10-05 20:44:12 +11:00
Peter Barker
57c2f7b2de GCS_MAVLink: handle DO_AUX_FUNCTION as both long and int 2023-10-04 19:01:22 +11:00
Peter Barker
33b0bf699e GCS_MAVLink: allow compilation when GPS library not available 2023-10-04 18:10:58 +11:00
Peter Barker
423a88f9cd GCS_MAVLink: handle message interval commands as both long and int 2023-10-03 10:12:21 +09:00
Andrew Tridgell
92c0e7f860 GCS_MAVLink: use mavlink_frame_char_buffer()
and remove unnecessary extra mavlink_get_channel_status() function
2023-10-02 21:45:28 +11:00
Andrew Tridgell
ac3f4f0c5e GCS_MAVLink: use mavlink_XXX_encode_status() in example code 2023-10-02 21:45:28 +11:00
Andrew Tridgell
5f5de52984 GCS_MAVLink: allow for mavlink bindings only in GCS_MAVLink
this is used by SITL periph to allow for mavlink based simulators
2023-10-02 21:45:28 +11:00
Peter Barker
ef8cd449ec GCS_MAVLink: handle MAV_CMD_DO_FLIGHTTERMINATION as both long and int 2023-09-27 11:27:45 -07:00
Peter Barker
0f6bf8994f GCS_MAVLink: handle MAV_CMD_AIRFRAME_CONFIGURATION as both LONG and INT 2023-09-26 11:37:42 +10:00
Asif Khan
65be0bd1ba GCS_MAVLink: add MAV_CMD_IMAGE_STOP_CAPTURE support
Co-authored-by: Zachary Zalass <zachzalass@gmail.com>
2023-09-21 21:05:01 +10:00
Peter Barker
b44682d1a6 GCS_MAVLink: handle CAN_FORWARD as both command_INT and COMMAND_LONG 2023-09-20 17:50:56 +10:00
Peter Barker
5b0393e280 GCS_MAVLink: handle MAV_CMD_PREFLIGHT_REBOOT_SHUTDOWN as INT or LONG 2023-09-19 11:16:10 +10:00
Peter Barker
273b9ea354 GCS_MAVLink: correct sensors when no baros found
GCSs will know we have no baros on-board, as will the RC telemetry library
2023-09-19 07:28:30 +10:00
Peter Barker
4f0b328674 GCS_MAVLink: support preflight calibration via command_int 2023-09-13 17:24:07 +10:00
Nick Exton
d47b60b92a GCS_MAVLink: Fix CAMERA_SETTINGS payload size check 2023-09-08 15:31:33 +09:00
Peter Barker
ed5da4ead2 GCS_MAVLink: allow more libraries to compile with no HAL_GCS_ENABLED 2023-09-05 22:23:51 +10:00
Peter Barker
8473f05738 GCS_MAVLink: add defines for serial control, deviceop and servo_relay 2023-09-05 10:20:14 +10:00
Peter Barker
fe512f7074 GCS_MAVLink: handle servo/relay events as both command_long and command_int 2023-08-29 11:15:14 +10:00
Peter Barker
92192a7510 GCS_MAVLink: add build options for deprecated messages MOUNT_CONTROL/MOUNT_CONFIGURE
these are repalced by the command equivalents
2023-08-29 11:06:13 +10:00
Asif Khan
e3f0904616 GCS_MAVLink: move handling of all do-set-roi to AP_Mount library 2023-08-26 17:55:53 +10:00
Peter Barker
a2d5244b10 GCS_MAVLink: accept mount commands as command_int 2023-08-24 22:07:12 +10:00
Nick Exton
fad1f35d93 GCS_MAVLink: Remove unreachable return in handle_command_mount() 2023-08-24 11:57:55 +10:00
Tom Pittenger
732cd31f27 GCS_MAVLink: MSG_HOME_POSITION to use NaN for invalid 2023-08-23 08:53:29 -07:00
Peter Barker
b141cca3d5 GCS_MAVLink: pass mavlink_message_t to handle_command_*_packet
the "special case" blocks are getting longer and longer.  Merge the switch statements for the command type to be handled by passing around the message.
2023-08-22 10:11:33 +10:00
Peter Barker
1dd5778956 GCS_MAVLink: correct placement of AP_MAVLINK_MISSION_SET_CURRENT_ENABLED 2023-08-22 09:09:54 +10:00
muramura
62aee72820 GCS_MAVLink: Change a number to a defined name 2023-08-15 08:36:59 +09:00
Peter Barker
f2066d8e58 GCS_MAVLink: remove ap_message<->mavlinkid mappings for unused ids 2023-08-15 09:14:27 +10:00
Peter Barker
7764d1d904 GCS_MAVLink: add build_options.py option to remove rallypoint protocol 2023-08-15 08:37:17 +10:00
Peter Barker
808fcbda0e GCS_MAVLink: fix airspeed cal / format commands via non-USB telemetry 2023-08-15 08:13:32 +10:00
Andy Piper
9ac683a350 GCS_Common: report ARM CPUID on startup 2023-08-15 06:53:48 +10:00
Andy Piper
cf9a3ada28 GCS_MAVLink: print out IOMCU mcuid on startup 2023-08-15 06:53:48 +10:00
Andrew Tridgell
0d97b308b2 GCS_MAVLink: fixed corruption of FTP reply component ID
this led to not being able to do FTP transfers with
support.ardupilot.org unless MissionPlanner used the same component ID
as the support engineer GCS
2023-08-14 22:25:23 +10:00
olliw42
2f58d082f0 GCS_Common: brackets missing in switch case 2023-08-11 12:11:43 -07:00
davidsastresas
6a9b457be3 GCS_Common: autopilot_state_for_gimbal_device sends angular_velocity_z 2023-08-10 14:37:30 +09:00
Ryan Friedman
578ba20df0 GCS_MAVLink: Use renamed visual odom function
* Now called pose instead of position

Signed-off-by: Ryan Friedman <ryanfriedman5410+github@gmail.com>
2023-08-10 13:58:00 +09:00
Peter Barker
6097f1aa61 GCS_MAVLink: allow removal of preflight commands to fail the autopilot 2023-08-10 07:11:22 +10:00
Peter Barker
77b8c96eae GCS_MAVLink: add build_options.py option to remove fencepoint protocol
also gate more code on defines

Saves ~2kB
2023-08-09 17:53:54 +10:00
Peter Barker
13c83ee9f8 GCS_MAVLink: enable sending of RELAY_STATUS message 2023-08-09 07:44:07 +10:00
Peter Barker
d6979e62f0 GCS_MAVLink: handle mag cal as both COMMAND_LONG and COMMAND_INT 2023-08-08 10:06:13 +10:00
Peter Barker
8d30f84e73 GCS_MAVLink: move definition of HAL_HIGH_LATENCY2_ENABLED into config 2023-08-03 13:09:23 +10:00
Peter Barker
17ec5f7d3b GCS_MAVLink: use long-to-int conversion code for SET_ROI_SYSID
also remove more code based on the mount-enabled define
2023-08-01 10:16:14 +10:00
Peter Barker
274aedeaae GCS_MAVLink: rely on item conversion to run DO_SET_ROI_NONE when presented in COMMAND_LONG 2023-07-19 17:03:00 +09:00
Peter Barker
ae8d3724cd GCS_MAVLink: convert to COMMAND_INT to handle MAV_CMD_DO_SET_HOME 2023-07-18 09:10:26 +10:00
Andy Piper
504fdb4ca3 GCS_MAVLink: squash bitwise | operator warnings 2023-07-13 11:02:40 +10:00
Peter Barker
f3e5e28364 GCS_MAVLink: zero structured passed in to convert_COMMAND_LONG_to_COMMAND_INT 2023-07-12 18:51:07 +10:00
Peter Barker
527f3d5728 GCS_MAVLink: add infrastructure to handle command longs as command ints 2023-07-12 18:51:07 +10:00
Andrew Tridgell
62b2fdb8f8 GCS_MAVLink: update to new read_locked() API 2023-07-12 17:06:02 +10:00
Max-001
afc019e1ea EFI: added efi MavLink class 2023-07-11 12:32:19 +10:00
Iampete1
352f721626 GCS_MAVLink: allow scripting to block commands 2023-07-04 10:20:42 +10:00
Andrew Tridgell
7fa0de37c3 GCS_MAVLink: added mutex deadlock test code 2023-06-27 10:11:46 +10:00
Peter Barker
a2ecaf737d GCS_MAVLink: correct define around use of ins singleton 2023-06-21 22:28:48 +10:00
Peter Barker
ed96bb6dd4 GCS_MAVLink: rely on HAL_LOGGING_ENABLED for sending logs 2023-06-21 22:28:48 +10:00
Peter Barker
a6a691cce3 GCS_MAVLink: add and use AP_GPS_ENABLED 2023-06-21 22:28:48 +10:00
Peter Barker
61affcf4e4 GCS_MAVLink: add and use AP_BARO_ENABLED 2023-06-21 22:28:48 +10:00
Peter Barker
fc55bf0bc4 GCS_MAVLink: add and use AP_COMPASS_ENABLED 2023-06-21 22:28:48 +10:00
Peter Barker
42e42dc991 GCS_MAVLink: add and use AP_AHRS_ENABLED 2023-06-21 22:28:48 +10:00
Peter Barker
07bf38d7f8 GCS_MAVLink: create and use AP_BATTERY_ENABLED
simply as a way to get HAL_PERIPH_ENABLE_BATTERY out of the main code
2023-06-21 22:28:48 +10:00
Peter Barker
e3c4d9fd23 GCS_MAVLink: allocate mavlink status and send buffers dynamically
This makes ArduPilot responsible for supplying buffers to the mavlink layer, rather than that layer allocating them based on MAVLINK_COMM_NUM_BUFFERS.

We will want to rename MAVLINK_COMM_NUM_BUFFERS to AP_GCS_MAX_BACKENDS at some stage.
2023-06-21 17:50:31 +10:00
Andrew Tridgell
fc904011fb GCS_MAVLink: moved MAV_CMD_AIRFRAME_CONFIGURATION from copter 2023-06-21 17:38:28 +10:00
Peter Barker
86d09d9096 GCS_MAVLink: add option to disable relay and servorelay libraries 2023-06-20 09:36:39 +10:00
bugobliterator
e30cc65f14 GCS_MAVLink: move sysid_my_gcs to be public 2023-06-17 14:49:22 +10:00
Randy Mackay
02fdb8272f GCS_MAVLink: support camera info and settings 2023-06-16 14:30:46 +10:00
davidsastresas
e1e2d68815 GCS_Common: handle CMD_DO_SET_ROI_NONE for command int packets 2023-06-08 21:12:50 +10:00
Peter Barker
312254f761 GCS_MAVLink: correct detection of feature AP_FILESYSTEM_FORMAT_ENABLED 2023-06-08 08:55:26 +10:00
Andrew Tridgell
1ab278d127 GCS_MAVLink: support EXTERNAL_POSITION_ESTIMATE command_int 2023-06-06 15:19:12 +10:00
Peter Barker
4ee58c4496 GCS_MAVLink: remove more compass cal if it is not enabled 2023-05-30 23:05:29 +10:00
Peter Barker
92942137fa GCS_MAVLink: remove use of AP_Mount.h from headers 2023-05-29 09:08:55 +10:00
bugobliterator
9ce37e5f98 GCS_MAVLink: scripting sends mavlink messages directly 2023-05-24 19:03:28 +10:00
Michael du Breuil
a934c90e69 GCS_MAVLink: Route MAVLink data to/from scripting 2023-05-24 19:03:28 +10:00
Asif Khan
9ef3241949 GCS_MAVLink: add GIMBAL_MANAGER_SET_PITCHYAW message support 2023-05-24 12:36:37 +10:00
davidsastresas
e4428f538d GCS_MAVLink: support gimbal_manager_status and do_gimbal_manager_configure
Co-authored-by: Randy Mackay <rmackay9@yahoo.com>
2023-05-17 12:38:49 +10:00
Peter Barker
d46d2189ec GCS_MAVLink: replace HAVE_FILESYSTEM_SUPPORT with backend defines 2023-05-17 09:40:39 +10:00
Peter Barker
29d6c51f43 SITL: stop using mavlink channels for packing messages
precedent was set in the mavlink rangefinder; we don't need to re-use SITL buffers for this
2023-05-16 10:17:56 +10:00
Randy Mackay
858a1e8b40 GCS_MAVLink: pass image tracking messages to AP_Camera 2023-05-08 21:26:35 +10:00
Peter Barker
feaed97601 GCS_MAVLink: deprecate handling of MAV_CMD_REQUEST_AUTOPILOT_CAPABILITIES
AUTOPILOT_VERSION - the message this returns - can be requested with MAV_CMD_REQUEST_MESSAGE
2023-04-26 20:34:42 +10:00
Peter Barker
d0b96d4cd9 GCS_MAVLink: deprecate handling of AUTOPILOT_VERSION_REQUEST
This can be done equivalently with MAV_CMD_REQUEST_MESSAGE
2023-04-26 20:34:42 +10:00
Randy Mackay
bdb3618de7 GCS_MAVLink: support requests for gimbal-manager-information 2023-04-25 15:07:35 +10:00
Michael du Breuil
a9d696752d GCS_MAVLink: Factor accel cal work out to INS library 2023-04-21 21:33:16 +10:00
Peter Barker
15ec9f6f82 GCS_MAVLink: allow Copter to emit MISSION_STATE_PAUSED when paused in auto 2023-04-21 09:49:55 +10:00
Peter Barker
510ed4cf2f GCS_MAVLink: add support for more MISSION_CURRENT fields
- a state so someone can see if the mission is complete
 - total number of waypoints
2023-04-21 09:49:55 +10:00
Peter Barker
a657c6ea75 GCS_MAVLink: remove CANTester 2023-04-18 11:43:58 +10:00
Peter Barker
068443718e GCS_MAVLink: deprecate use of MISSION_SET_CURRENT message
The mavlink command MAV_CMD_DO_SET_MISSION_CURRENT has been in place since January 2019 and is superior to this.
2023-04-18 10:24:26 +10:00