'Entrenador Bmorse
'================
'Inicialmente se enva 1 letra conforme vaya mejorando
'tu recepci¢n la cantidad de letras y velocidad se
'incrementar  hasta convertirte en un telegrafista avanzado.



DECLARE SUB CLOCK ()
DECLARE SUB DATOS (X AS INTEGER)
DECLARE FUNCTION VentAnas$ (X!, Y!, ANCHO!, ALTO!, COLORIN!)
DECLARE SUB TX (mensaje AS STRING, modo AS INTEGER)
DECLARE SUB MORSE (caracter AS STRING)
DECLARE SUB RAYA ()
DECLARE SUB ESPACIO ()
DECLARE SUB PUNTO ()
DIM mensaje AS STRING
DIM recibido AS STRING


COMMON SHARED freq AS INTEGER, wpm AS SINGLE, ticks AS SINGLE
COMMON SHARED respuesta AS STRING, Lmensaje AS INTEGER, modo AS INTEGER
COMMON SHARED mensajes AS INTEGER, correctos AS INTEGER, errores AS INTEGER
COMMON SHARED eficacia AS INTEGER, incremento AS INTEGER, nivel AS INTEGER


' === CONFIGURACION == '

freq = 700 'Frecuencia del Tono en HZ
wpm = 15   'Velocidad en palabras por minuto, m¡nimo 15
mensaje = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 'Texto para practicar
modo = 0 'Modo 0 es aleatorio, Modo 1 es normal
Lmensaje = 1 'Cantidad inicial de caracteres que se enviar n en la pr ctica
incremento = 10 'Cada cu nto avanzamos de nivel



CALL CLOCK
REM SCREEN 9 'Ventana de 640x 350y
REM TEXTO y=25, x = 40

SCREEN 1 'Ventana de 320x 200y
REM COLOR 1, 0
CLS
LOCATE 12, 5
PRINT "  Transmisi¢n empieza en..."
SLEEP 2
LOCATE 12, 5
PRINT "               3           "
CALL TX("E", 1)
LOCATE 12, 5
SLEEP 1
PRINT "               2"
CALL TX("E", 1)
LOCATE 12, 5
SLEEP 1
PRINT "               1"
CALL TX("E", 1)
SLEEP 2

RANDOMIZE TIMER

DO
 CLS
 LOCATE 12, 12
 PRINT "Transmisi¢n..."
 CALL TX(mensaje, 0)
 mensajes = mensajes + 1
 CLS
 CALL DATOS(0)
 LOCATE 12, 15
 INPUT "¨Mensaje"; recibido
 recibido = UCASE$(recibido)


 IF recibido = respuesta THEN
       CLS
       LOCATE 13, 13
       PRINT "!Correcto!: "; respuesta
       SOUND 1000, .5
       SOUND 1500, .5
       SOUND 0, .1
       correctos = correctos + 1
       CALL DATOS(1)
       SLEEP 1
       SALIDA = 1
 ELSE
       IF recibido = "" THEN
               SALIDA = 0
       ELSE
               SALIDA = 1
               CLS
               LOCATE 13, 13
               PRINT "!Error!: "; respuesta
               SOUND 100, .5
               SOUND 300, .5
               SOUND 100, 1
               SOUND 0, .3
               errores = errores + 1
               CALL DATOS(1)
               SLEEP 2
       END IF

 END IF
 respuesta = ""
LOOP WHILE SALIDA > 0

CLS

LOCATE 12, 12
PRINT "Fin de transmisi¢n"
SLEEP 2
LOCATE 19, 6
PRINT "Bmorse, entrenador telegr fico"
LOCATE 21, 14
PRINT "[email protected]"
LOCATE 22, 5
PRINT "Chiapas, M‚xico. noviembre 2024"
wpm = 30
CALL CLOCK
CALL TX("73", 1)
SLEEP 2

SUB CLOCK
       'Se calcula los wpm (Palabras por minuto) para convertirlo a
       'ticks del reloj del sistema porque esa es la base de tiempo
       'de QBasic para la funci¢n SOUND.

       unidades = wpm * 50 '50 por el est ndar PARIS
       dits = 60 / unidades
       ticks = dits * 18.2

END SUB

SUB DATOS (EVALUAR AS INTEGER)

 X = 19
 Y = 15


 IF EVALUAR = 1 THEN
       eficacia = ((correctos - errores) / mensajes) * 100
 END IF

 IF eficacia < 0 THEN
       eficacia = 0
 END IF

 IF eficacia >= 90 AND mensajes >= incremento THEN
       wpm = wpm + 1
       CALL CLOCK
       incremento = mensajes + 10
 END IF

 IF correctos < 0 THEN
       correctos = 0
 END IF

 IF errores < 0 THEN
       errores = 0
 END IF


 SELECT CASE wpm
    CASE 15 TO 16
       LOCATE 2, 2
       PRINT "Nivel: Aprendiz *"
    CASE 17 TO 18
       LOCATE 2, 2
       PRINT "Nivel: Principiante **"
       Lmensaje = 2
    CASE 19 TO 21
       LOCATE 2, 2
       PRINT "Nivel: Intermedio ***"
       Lmensaje = 3
    CASE 22 TO 30
       LOCATE 2, 2
       PRINT "Nivel: Avanzado ****"
       Lmensaje = 4
 END SELECT






 LOCATE X, Y
 PRINT "  Env¡os:"; mensajes
 LOCATE X + 1, Y
 PRINT "Correcto:"; correctos
 LOCATE X + 2, Y
 PRINT " Errores:"; errores
 LOCATE X + 3, Y
 PRINT "Eficacia:"; eficacia; "%"
 LOCATE X + 4, Y
 PRINT "     WPM:"; wpm
 LOCATE X + 5, 12
 PRINT "(Enter para salir)"

END SUB

SUB ESPACIO
  SOUND 0, ticks
END SUB

SUB MORSE (caracter AS STRING)

 SELECT CASE caracter
    CASE " "
        CALL ESPACIO
        CALL ESPACIO
        CALL ESPACIO
        CALL ESPACIO
        CALL ESPACIO
        CALL ESPACIO
        CALL ESPACIO
    CASE "A"
        CALL PUNTO
        CALL RAYA
    CASE "B"
        CALL RAYA
        CALL PUNTO
        CALL PUNTO
        CALL PUNTO
    CASE "C"
        CALL RAYA
        CALL PUNTO
        CALL RAYA
        CALL PUNTO
     CASE "D"
        CALL RAYA
        CALL PUNTO
        CALL PUNTO
     CASE "E"
        CALL PUNTO
     CASE "F"
        CALL PUNTO
        CALL PUNTO
        CALL RAYA
        CALL PUNTO
     CASE "G"
        CALL RAYA
        CALL RAYA
        CALL PUNTO
     CASE "H"
        CALL PUNTO
        CALL PUNTO
        CALL PUNTO
        CALL PUNTO
     CASE "I"
        CALL PUNTO
        CALL PUNTO
     CASE "J"
        CALL PUNTO
        CALL RAYA
        CALL RAYA
        CALL RAYA
     CASE "K"
        CALL RAYA
        CALL PUNTO
        CALL RAYA
     CASE "L"
        CALL PUNTO
        CALL RAYA
        CALL PUNTO
        CALL PUNTO
     CASE "M"
        CALL RAYA
        CALL RAYA
     CASE "N"
        CALL RAYA
        CALL PUNTO
     CASE "O"
        CALL RAYA
        CALL RAYA
        CALL RAYA
     CASE "P"
        CALL PUNTO
        CALL RAYA
        CALL RAYA
        CALL PUNTO
     CASE "Q"
        CALL RAYA
        CALL RAYA
        CALL PUNTO
        CALL RAYA
     CASE "R"
        CALL PUNTO
        CALL RAYA
        CALL PUNTO
     CASE "S"
        CALL PUNTO
        CALL PUNTO
        CALL PUNTO
     CASE "T"
        CALL RAYA
     CASE "U"
        CALL PUNTO
        CALL PUNTO
        CALL RAYA
     CASE "V"
        CALL PUNTO
        CALL PUNTO
        CALL PUNTO
        CALL RAYA
     CASE "W"
        CALL PUNTO
        CALL RAYA
        CALL RAYA
     CASE "X"
        CALL RAYA
        CALL PUNTO
        CALL PUNTO
        CALL RAYA
     CASE "Y"
        CALL RAYA
        CALL PUNTO
        CALL RAYA
        CALL RAYA
     CASE "Z"
        CALL RAYA
        CALL RAYA
        CALL PUNTO
        CALL PUNTO
     CASE "1"
        CALL PUNTO
        CALL RAYA
        CALL RAYA
        CALL RAYA
        CALL RAYA
     CASE "2"
        CALL PUNTO
        CALL PUNTO
        CALL RAYA
        CALL RAYA
        CALL RAYA
     CASE "3"
        CALL PUNTO
        CALL PUNTO
        CALL PUNTO
        CALL RAYA
        CALL RAYA
     CASE "4"
        CALL PUNTO
        CALL PUNTO
        CALL PUNTO
        CALL PUNTO
        CALL RAYA
     CASE "5"
        CALL PUNTO
        CALL PUNTO
        CALL PUNTO
        CALL PUNTO
        CALL PUNTO
     CASE "6"
        CALL RAYA
        CALL PUNTO
        CALL PUNTO
        CALL PUNTO
        CALL PUNTO
     CASE "7"
        CALL RAYA
        CALL RAYA
        CALL PUNTO
        CALL PUNTO
        CALL PUNTO
     CASE "8"
        CALL RAYA
        CALL RAYA
        CALL RAYA
        CALL PUNTO
        CALL PUNTO
     CASE "9"
        CALL RAYA
        CALL RAYA
        CALL RAYA
        CALL RAYA
        CALL PUNTO
     CASE "0"
        CALL RAYA
        CALL RAYA
        CALL RAYA
        CALL RAYA
        CALL RAYA



 END SELECT

CALL ESPACIO
CALL ESPACIO
CALL ESPACIO

END SUB

SUB PUNTO
SOUND freq, ticks
SOUND 0, ticks
END SUB

SUB RAYA
SOUND freq, ticks + ticks + ticks
SOUND 0, ticks
END SUB

SUB TX (mensaje AS STRING, modo AS INTEGER)

       DIM Pmensaje AS STRING
       Tmensaje = LEN(mensaje)

IF modo = 0 THEN

       FOR num = 1 TO Lmensaje
               Pmensaje = LEFT$(mensaje, RND * Tmensaje + 1)
               Pmensaje = RIGHT$(Pmensaje, 1)
               CALL MORSE(Pmensaje)
               respuesta = respuesta + Pmensaje
       NEXT num
ELSE
       FOR num = 1 TO Tmensaje
               Pmensaje = LEFT$(mensaje, num)
               Pmensaje = RIGHT$(Pmensaje, 1)
               CALL MORSE(Pmensaje)
               respuesta = ""
       NEXT num
END IF

END SUB