123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- MODULE UsbTools; (** AUTHOR "staubesv"; PURPOSE "USB Tools"; *)
- (**
- * Usage:
- *
- * UsbTools.Mount prefix alias [volpar] ["|" fspar] ~ Starts a thread that waits for the disk device to become accessible and then mounts it.
- * (non-blocking)
- * Example: UsbTools.Mount USBDrive AosFS USB0#1 ~
- *
- *
- * UsbTools.BlockingMount prefix alias [volpar] ["|" fspar] ~ Waits for the disk device to become accessible and then mounts it. Should not be used by a user.
- * (blocking)
- * Example: UsbTools.BlockingMount USBDrive AosFS USB0#1 ~
- *
- * UsbTools.AwaitAndExecute devicename commandlist ~ Starts a thread that waits for the disk device to become accessible and then executes the commands.
- * (non-blocking)
- * Example: UsbTools.AwaitAndExecute USB0 FSTools.Mount USBDrive AosFS USB0#1+PET.Open USBDrive:/PET.Mod ~
- *
- * UsbTools.AwaitAndExecute0 devicename commandlist ~ Waits for the disk device to become accessible and then executes the commands. Not for users.
- * (blocking)
- * Example: UsbTools.AwaitAndExecute0 USB0 FSTools.Mount USBDrive AosFS USB0#1~
- *
- * System.Free UsbTools ~
- *
- * History:
- *
- * 28.06.2006 First release (staubesv)
- *)
- IMPORT
- KernelLog, Commands, Plugins, Disks, FSTools;
- CONST
- CommandSeparator = "+";
- (** Starts a thread that first waits until the device to be mounted becomes accessible and then mounts it *)
- PROCEDURE Mount*(context : Commands.Context); (** prefix alias [volpar] ["|" fspar] ~ *)
- VAR msg : ARRAY 8 OF CHAR; res : WORD;
- BEGIN
- Commands.Activate("UsbTools.BlockingMount", context, {}, res, msg); (* ignore result *)
- END Mount;
- (** Waits for the device to be mounted and then try to mount it *)
- PROCEDURE BlockingMount*(context : Commands.Context); (** prefix alias [volpar] ["|" fspar] ~ *)
- VAR
- plugin : Plugins.Plugin;
- devicename, string : ARRAY 128 OF CHAR;
- BEGIN
- (* Skip the first two parameters *)
- context.arg.SkipWhitespace; context.arg.String(string);
- context.arg.SkipWhitespace; context.arg.String(string);
- (* read dev#part string *)
- context.arg.SkipWhitespace; context.arg.String(string);
- IF ExtractDevicename(string, devicename) THEN
- IF (context.arg.CanSetPos()) THEN
- context.arg.SetPos(0);
- KernelLog.Enter; KernelLog.String("UsbTools: Waiting for USB device "); KernelLog.String(devicename); KernelLog.Exit;
- plugin := Disks.registry.Await(devicename);
- KernelLog.Enter; KernelLog.String("UsbTools: Device "); KernelLog.String(devicename); KernelLog.String(" connected."); KernelLog.Exit;
- FSTools.Mount(context);
- ELSE context.error.String("UsbTools.BlockingMount: Argument stream expected to support SetPos."); context.error.Ln;
- END;
- ELSE context.error.String("UsbTools.BlockingMount: Could not extract device name"); context.error.Ln;
- END;
- END BlockingMount;
- (** Waits for the specified disk device and then execute the commands *)
- PROCEDURE AwaitAndExecute*(context : Commands.Context); (** devicename commandlist ~ *)
- VAR msg : ARRAY 8 OF CHAR; res : WORD;
- BEGIN
- Commands.Activate("UsbTools.AwaitAndExecute0", context, {}, res, msg); (* ignore result *)
- END AwaitAndExecute;
- (** Waits for the specified disk device and then execute the commands. Note: Does NOT mount the device. *)
- PROCEDURE AwaitAndExecute0*(context : Commands.Context); (** devicename commandlist ~ *)
- VAR
- devicename, msg : ARRAY 128 OF CHAR;
- commandList : POINTER TO ARRAY OF CHAR;
- plugin : Plugins.Plugin;
- i, size, len : LONGINT; res : WORD;
- BEGIN
- context.arg.SkipWhitespace; context.arg.String(devicename);
- KernelLog.Enter; KernelLog.String("UsbTools: Waiting for USB device "); KernelLog.String(devicename); KernelLog.Exit;
- plugin := Disks.registry.Await(devicename);
- KernelLog.Enter; KernelLog.String("UsbTools: Device "); KernelLog.String(devicename); KernelLog.String(" connected."); KernelLog.Exit;
- (* read and copy command list *)
- context.arg.SkipWhitespace;
- size := context.arg.Available();
- IF size > 0 THEN
- NEW(commandList, size + 1);
- context.arg.Bytes(commandList^, 0, size, len);
- FOR i := 0 TO size DO IF commandList[i] = CommandSeparator THEN commandList[i] := ";"; END; END;
- commandList^[size] := 0X;
- Commands.Call(commandList^, {}, res, msg);
- IF res # Commands.Ok THEN
- KernelLog.Enter;
- KernelLog.String("UsbTools: AwaitAndExecute: Command execution error, res: "); KernelLog.Int(res, 0);
- KernelLog.String(" ("); KernelLog.String(msg); KernelLog.String(")");
- KernelLog.Exit;
- END;
- END;
- END AwaitAndExecute0;
- PROCEDURE ExtractDevicename(CONST devpart : ARRAY OF CHAR; VAR devicename : ARRAY OF CHAR) : BOOLEAN;
- VAR i : LONGINT;
- BEGIN
- WHILE (i < LEN(devpart)) & (devpart[i] # "#") & (i < LEN(devicename)) DO
- devicename[i] := devpart[i];
- INC(i);
- END;
- RETURN (i < LEN(devpart)) & (devpart[i] = "#");
- END ExtractDevicename;
- END UsbTools.
- UsbTools.Mount USB AosFS USB0#1 ~ System.Free UsbTools ~
|