MODULE UsbTargLog; (** © NTB/AS 12.01.2006 *) (** Changes: *) IMPORT USB := UsbBDI, Log := StdLog, Services, TextModels, XUT := XdeUtilities; CONST logTitle = "USB Target Log"; PERIOD = 200; TYPE Receiver = POINTER TO RECORD (Services.Action) time: LONGINT; period: INTEGER END; VAR receiver: Receiver; logTextModel: TextModels.Model; logWriter: TextModels.Writer; PROCEDURE (receiver: Receiver) Do; VAR length, i: INTEGER; done: BOOLEAN; data: ARRAY USB.MAX_UART_DATA_LENGTH OF SHORTCHAR; BEGIN done := USB.UART0_read(data, length); IF done THEN length := MIN(length, USB.MAX_UART_DATA_LENGTH ); FOR i := 0 TO length - 1 DO logWriter.WriteChar(data[i]) END END; INC( receiver.time, receiver.period ); Services.DoLater(receiver, receiver.time ) END Do; PROCEDURE Stop * ; BEGIN IF receiver # NIL THEN Services.RemoveAction(receiver ); receiver := NIL END; logWriter := NIL; logTextModel := NIL END Stop; PROCEDURE StartReceiver; BEGIN IF receiver # NIL THEN Services.RemoveAction(receiver ); receiver := NIL END; NEW(receiver); receiver.time := Services.Ticks(); receiver.period := PERIOD; Services.DoLater(receiver, receiver.time) END StartReceiver; PROCEDURE Start * ; VAR beg, end: INTEGER; BEGIN IF ~USB.DeviceOpen() THEN USB.ConnectDevice; END; Stop; Log.String("opening USB target log"); Log.Ln; XUT.GetTextModel("", logTextModel, beg, end); logWriter := logTextModel.NewWriter(NIL); XUT.ShowTextView(logTextModel, logTitle); StartReceiver; END Start; PROCEDURE SendSelToTarget * ; (** send all visible char of the current selection to the target *) VAR reader: TextModels.Reader; textModel: TextModels.Model; beg, end, currentLen: INTEGER; ch: CHAR; data: ARRAY USB.MAX_UART_DATA_LENGTH OF SHORTCHAR; done, error: BOOLEAN; BEGIN XUT.GetTextModel("@", textModel, beg, end); IF textModel # NIL THEN reader := textModel.NewReader(NIL); reader.SetPos(beg); currentLen := 0; error := FALSE; WHILE reader.Pos() < end DO reader.ReadChar(ch); data[currentLen] := SHORT(ch); INC(currentLen); IF currentLen >= USB.MAX_UART_DATA_LENGTH THEN done := USB.UART0_write(data, currentLen); IF ~done THEN error := TRUE; Log.String("Sending data failed"); Log.Ln; END; currentLen := 0; END END; IF currentLen > 0 THEN done := USB.UART0_write(data, currentLen); IF ~done THEN error := TRUE; Log.String("Sending data failed"); Log.Ln; END END; IF ~error THEN Log.String("Data sent successfully"); Log.Ln; END END END SendSelToTarget; PROCEDURE ClearText * ; BEGIN IF logTextModel # NIL THEN logTextModel.Delete(0, logTextModel.Length()); logWriter.SetPos(0) END END ClearText; CLOSE Stop END UsbTargLog .