Ver la Versión Completa : [ IDEA ] Señal SOS con la linterna
GraphicAdventure
02/07/18, 16:45:23
El móvil es importante en situaciones de emergencia y no está demás tenerlo preparado para diferentes situaciones.
A modo de ejemplo, grabo audio si enciendo y apago la pantalla en menos de 1 segundo.
No me paré a pensar la mejor forma de hacer la tarea de este tema.
Podéis comentar las vuestras.
WillyWeb
02/07/18, 19:25:21
Es un proyecto interesante y entretenido. :ok:
Pero ya que nos ponemos ... mejor hacer una subtarea que traduzca a morse el texto que se pase en %par1 y lo transmita vía linterna. ;-)
Así también valdría para usar la linterna como sistema de notificación. Por ejemplo para transmitir las iniciales del contacto que te está llamando y cosas así.
Con las letras pude valer para empezar, ¿no?. :pensando:
SmartPhoneLover
02/07/18, 19:55:52
A1: Torch [ Set:On ]
A2: Wait [ MS:300 Seconds:0 Minutes:0 Hours:0 Days:0 ]
A3: Torch [ Set:Off ]
A4: Torch [ Set:On ]
A5: Wait [ MS:300 Seconds:0 Minutes:0 Hours:0 Days:0 ]
A6: Torch [ Set:Off ]
A7: Torch [ Set:On ]
A8: Wait [ MS:300 Seconds:0 Minutes:0 Hours:0 Days:0 ]
A9: Torch [ Set:Off ]
A10: Torch [ Set:On ]
A11: Wait [ MS:750 Seconds:0 Minutes:0 Hours:0 Days:0 ]
A12: Torch [ Set:Off ]
A13: Torch [ Set:On ]
A14: Wait [ MS:750 Seconds:0 Minutes:0 Hours:0 Days:0 ]
A15: Torch [ Set:Off ]
A16: Torch [ Set:On ]
A17: Wait [ MS:750 Seconds:0 Minutes:0 Hours:0 Days:0 ]
A18: Torch [ Set:Off ]
A19: Torch [ Set:On ]
A20: Wait [ MS:300 Seconds:0 Minutes:0 Hours:0 Days:0 ]
A21: Torch [ Set:Off ]
A22: Torch [ Set:On ]
A23: Wait [ MS:300 Seconds:0 Minutes:0 Hours:0 Days:0 ]
A24: Torch [ Set:Off ]
A25: Torch [ Set:On ]
A26: Wait [ MS:300 Seconds:0 Minutes:0 Hours:0 Days:0 ]
A27: Torch [ Set:Off ]
https://media.giphy.com/media/M9Dh3YtDvZj9u/giphy.gif
WillyWeb
02/07/18, 20:05:35
:oh:
Un SOS mondo y lirondo.
Al menos pon las pausas entre letras y ajusta las duraciones al convenio internacional.
SmartPhoneLover
02/07/18, 20:31:37
:oh:
Un SOS mondo y lirondo.
Al menos pon las pausas entre letras y ajusta las duraciones al convenio internacional.
Era una pequeña broma WillyWeb. X-D
WillyWeb
02/07/18, 20:39:08
Era una pequeña broma WillyWeb. X-D
Tranquilo hombre. Ya lo suponía. :risitas:
GraphicAdventure
02/07/18, 21:02:31
Es un proyecto interesante y entretenido. :ok:
Pero ya que nos ponemos ... mejor hacer una subtarea que traduzca a morse el texto que se pase en %par1 y lo transmita vía linterna. ;-)
Así también valdría para usar la linterna como sistema de notificación. Por ejemplo para transmitir las iniciales del contacto que te está llamando y cosas así.
Con las letras pude valer para empezar, ¿no?. :pensando:
Pensé en usarlo solamente como señal SOS pero supongo que cualquier planteamiento es válido.
SmartPhoneLover,
¿sabes si esas pausas son las correctas?
Con las 3 primeras acciones valen, lo demás por bucle y variables.
GraphicAdventure
02/07/18, 21:21:39
Acabo de ver que no puedo encender la linterna sin root. :oh:
SmartPhoneLover
02/07/18, 21:26:34
Pensé en usarlo solamente como señal SOS pero supongo que cualquier planteamiento es válido.
SmartPhoneLover,
¿sabes si esas pausas son las correctas?
Con las 3 primeras acciones valen, lo demás por bucle y variables.
No, las pausas no estan estandarizadas. Tal como comentó WillyWeb arriba.
Y ya sé lo de los búcles ;) Ya estoy trabajando en la tarea para la conversión a código morse de texto.
SmartPhoneLover
02/07/18, 21:37:04
Acabo de ver que no puedo encender la linterna sin root. :oh:
Prueba estas acciones, aunque como yo lo creo todo siempre con root, no estoy seguro de si necesita o no también:
A1: Java Function [ Return:(CameraManager) temp Class Or Object:CONTEXT Function:getSystemService
{Object} (String) Param:camera Param: Param: Param: Param: Param: Param: ]
<On>
A2: Java Function [ Return: Class Or Object:temp Function:setTorchMode
{} (String, boolean) Param:0 Param:true Param: Param: Param: Param: Param: ]
<Off>
A3: Java Function [ Return: Class Or Object:temp Function:setTorchMode
{} (String, boolean) Param:0 Param:false Param: Param: Param: Param: Param: ]Nota: si lo necesita, prueba a otorgárle a Tasker el permiso 'WRITE_SECURE_SETTINGS'.
WillyWeb
03/07/18, 07:48:46
Acabo de ver que no puedo encender la linterna sin root. :oh:
Made Torch action available for all devices running Android Marshmallow or above.
¿Qué versión de Android tienes?
_EDITO_
Ese texto es del changelog de la versión 5.2 de Tasker.
https://tasker.joaoapps.com/changes/changes5.2.html
WillyWeb
03/07/18, 07:49:14
Prueba estas acciones, aunque como yo lo creo todo siempre con root, no estoy seguro de si necesita o no también
Funcionan perfectamente sin root.
SmartPhoneLover
03/07/18, 09:31:47
Funcionan perfectamente sin root.
Ohh, perfecto! ;)
WillyWeb
03/07/18, 10:28:24
Tenía hecha una subtarea casi desde mis inicios con Tasker y no la encontraba. Espera sólo letras en minúsculas y espacios en blanco. El que quiera otra cosa que lo añada/solucione.
sAntorchaMorse (666)
A1: Establecer variable [ Nombre:%par1 A:sos Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %caller1 ~ ui ]
A2: Establece Array [ Matriz de Variables (array):%morse Values:a=.-/b=-.../c=-.-./d=-../e=./f=..-./g=--./h=..../i=../j=.---/k=-.-/l=.-../m=--/n=-./o=---/p=.--./q=--.-/r=.-./s=.../t=-/u=..-/v=. -/w=.--/x=-..-/y=-.--/z=--../ =# Separador:/ ]
A3: Probar Variable [ Tipo:Longitud Datos:%par1 Almacenar Resultado en:%lon ]
A4: For [ Variable:%ind Ítems:1:%lon ]
A5: Sección de Variable [ Nombre:%par1 Desde:%ind Longitud:1 Encajar:Apagado Almacenar Resultado en:%let ]
A6: Establecer variable [ Nombre:%bus A:%morse(#?%let*) Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
A7: Establece Array [ Matriz de Variables (array):%cod Values:%morse(%bus) Separador:= ]
A8: Array Push [ Matriz de Variables (array):%tra Posición:%ind Valor:%cod2 Rellenar Espacios:Apagado ]
A9: End For
<punto>
A10: Establecer variable [ Nombre:%mspun A:125 Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
<raya = punto * 3>
A11: Establecer variable [ Nombre:%msray A:%mspun*3 Recurse Variables:Apagado Calcular:Encendido Añadir:Apagado ]
<entre signos = punto>
A12: Establecer variable [ Nombre:%mssig A:%mspun Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
<entre letras = punto * 3 (,)>
A13: Establecer variable [ Nombre:%mslet A:%mspun*2 Recurse Variables:Apagado Calcular:Encendido Añadir:Apagado ]
<entre palabras = punto * 7 (#)>
A14: Establecer variable [ Nombre:%mspal A:%mspun*4 Recurse Variables:Apagado Calcular:Encendido Añadir:Apagado ]
A15: Concatenar variable [ Nombre:%tra Criterio de fusión:, Borrar partes:Apagado ]
A16: Probar Variable [ Tipo:Longitud Datos:%tra Almacenar Resultado en:%lon ]
A17: For [ Variable:%ind Ítems:1:%lon ]
A18: Sección de Variable [ Nombre:%tra Desde:%ind Longitud:1 Encajar:Apagado Almacenar Resultado en:%sig ]
A19: Si (if) [ %sig ~ ./- ]
A20: Antorcha [ Establecer:Encendido ]
A21: Esperar [ MS:%mspun Segundos:0 Minutos:0 Horas:0 Días:0 ] Si (if) [ %sig ~ . ]
A22: Esperar [ MS:%msray Segundos:0 Minutos:0 Horas:0 Días:0 ] Si (if) [ %sig ~ - ]
A23: Antorcha [ Establecer:Apagado ]
A24: Esperar [ MS:%mssig Segundos:0 Minutos:0 Horas:0 Días:0 ] Si (if) [ %ind != %lon ]
A25: Else Si (if) [ %sig ~ , ]
A26: Esperar [ MS:%mslet Segundos:0 Minutos:0 Horas:0 Días:0 ]
A27: Else Si (if) [ %sig ~ # ]
A28: Esperar [ MS:%mspal Segundos:0 Minutos:0 Horas:0 Días:0 ]
A29: Fin si (End if)
A30: End For
La primera parte traduce la cadena pasada en %par1 a morse (%par1=sos para hacer pruebas).
La segunda parte define las duraciones de punto/raya y las pausas entre signos/letras/palabras. Todo está relacionado con la duración del punto (%mspun). Graduar al gusto del usuario. La pausa entre letras y palabras está ajustada teniendo en cuenta las pausas previas y/o posteriores.
La tercera parte recorre la cadena de texto de la traducción encendiendo/apagando la linterna y haciendo las pausas correspondientes a cada caso.
La tarea ya tiene su tiempo y posiblemente ahora lo haría de otra forma, pero funciona y lo mismo os vale para algo. :pensando:
_EDITO_
Estoy viendo que se podrían quitar media docena de acciones tranquilamente. :pensando:
WillyWeb
03/07/18, 10:56:12
Y si quieres una versión "mini" que sólo transmita un SOS ...
Establecer variable [ Nombre:%cod A:...|---|... Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
Probar Variable [ Tipo:Longitud Datos:%cod Almacenar Resultado en:%lon ]
For [ Variable:%ind Ítems:1:%lon ]
Sección de Variable [ Nombre:%cod Desde:%ind Longitud:1 Encajar:Apagado Almacenar Resultado en:%sig ]
Si (if) [ %sig ~ ./- ]
Antorcha [ Establecer:Encendido ]
Esperar [ MS:125 Segundos:0 Minutos:0 Horas:0 Días:0 ] Si (if) [ %sig ~ . ]
Esperar [ MS:250 Segundos:0 Minutos:0 Horas:0 Días:0 ] Si (if) [ %sig ~ - ]
Antorcha [ Establecer:Apagado ]
Esperar [ MS:125 Segundos:0 Minutos:0 Horas:0 Días:0 ] Si (if) [ %ind != %lon ]
Else Si (if) [ %sig ~ | ]
Esperar [ MS:250 Segundos:0 Minutos:0 Horas:0 Días:0 ]
Fin si (End if)
End For
... eso debería funcionar.
Y creo que todavía le podría quitar dos o tres acciones. :pensando:
SmartPhoneLover
03/07/18, 14:11:11
Gracias por compartir WillyWeb ;) IMPECABLE!
Yo aún sigo creando la tarea, pero me servirán de guía. Gracias!
GraphicAdventure
03/07/18, 22:28:29
Made Torch action available for all devices running Android Marshmallow or above.
¿Qué versión de Android tienes?
_EDITO_
Ese texto es del changelog de la versión 5.2 de Tasker.
https://tasker.joaoapps.com/changes/changes5.2.html
KitKat 4.4 con Tasker 4.9
Creo que no voy a tener suerte.
Gracias por el trabajo hecho :ok:
Veré que puedo hacer.
SmartPhoneLover
04/07/18, 11:20:32
Prueba estas acciones, aunque como yo lo creo todo siempre con root, no estoy seguro de si necesita o no también:
A1: Java Function [ Return:(CameraManager) temp Class Or Object:CONTEXT Function:getSystemService
{Object} (String) Param:camera Param: Param: Param: Param: Param: Param: ]
<On>
A2: Java Function [ Return: Class Or Object:temp Function:setTorchMode
{} (String, boolean) Param:0 Param:true Param: Param: Param: Param: Param: ]
<Off>
A3: Java Function [ Return: Class Or Object:temp Function:setTorchMode
{} (String, boolean) Param:0 Param:false Param: Param: Param: Param: Param: ]Nota: si lo necesita, prueba a otorgárle a Tasker el permiso 'WRITE_SECURE_SETTINGS'.
Mmm, he comprado la doc de Android y la clase 'CameraManager' esta disponible a partir de la API 21, pero más exáctamente la función 'setTorchMode', en la API 23.
Lamento comunicarte 'GraphicAdventure' que mis funciones tampoco te funcionarán. Veré a ver si doy con otra solución alternativa. Aunque si no fuese posible, siempre queda los plugins, o si tienes root, jugar de algún modo con los servicios de una app que permtia encender y apagar la luz.
SmartPhoneLover
04/07/18, 11:43:17
A ver si esto te sirve:
A1: Java Function [ Return:temp1 Class Or Object:CONTEXT Function:getPackageManager
{PackageManager} () Param: Param: Param: Param: Param: Param: Param: ]
A2: Java Function [ Return:%temp Class Or Object:temp1 Function:hasSystemFeature
{boolean} (String) Param:android.hardware.camera.flash Param: Param: Param: Param: Param: Param: ]
A3: If [ %temp ~ true ]
A4: Java Function [ Return:temp2 Class Or Object:Camera Function:open
{Camera} () Param: Param: Param: Param: Param: Param: Param: ]
A5: Java Function [ Return:temp3 Class Or Object:temp2 Function:getParameters
{android.hardware.Camera$Parameters} () Param: Param: Param: Param: Param: Param: Param: ]
A6: Java Function [ Return: Class Or Object:temp3 Function:setFlashMode
{} (String) Param:torch Param: Param: Param: Param: Param: Param: ]
A7: Java Function [ Return: Class Or Object:temp2 Function:setParameters
{} (android.hardware.Camera$Parameters) Param:temp3 Param: Param: Param: Param: Param: Param: ]
A8: Java Function [ Return: Class Or Object:temp2 Function:startPreview
{} () Param: Param: Param: Param: Param: Param: Param: ]
A9: Wait [ MS:0 Seconds:5 Minutes:0 Hours:0 Days:0 ]
A10: Java Function [ Return: Class Or Object:temp2 Function:stopPreview
{} () Param: Param: Param: Param: Param: Param: Param: ]
A11: Java Function [ Return: Class Or Object:temp2 Function:release
{} () Param: Param: Param: Param: Param: Param: Param: ]
A12: Else
A13: Flash [ Text:Error en API Long:Off ]
A14: End Ifo...
A1: Java Function [ Return:temp1 Class Or Object:CONTEXT Function:getPackageManager
{PackageManager} () Param: Param: Param: Param: Param: Param: Param: ]
A2: Java Function [ Return:%temp Class Or Object:temp1 Function:hasSystemFeature
{boolean} (String) Param:android.hardware.camera.flash Param: Param: Param: Param: Param: Param: ]
A3: If [ %temp ~ true ]
A4: Java Function [ Return:temp2 Class Or Object:Camera Function:open
{Camera} () Param: Param: Param: Param: Param: Param: Param: ]
A5: Java Function [ Return:temp3 Class Or Object:temp2 Function:getParameters
{android.hardware.Camera$Parameters} () Param: Param: Param: Param: Param: Param: Param: ]
A6: Java Function [ Return: Class Or Object:temp3 Function:setFlashMode
{} (String) Param:flash_mode_torch Param: Param: Param: Param: Param: Param: ]
A7: Java Function [ Return: Class Or Object:temp2 Function:setParameters
{} (android.hardware.Camera$Parameters) Param:temp3 Param: Param: Param: Param: Param: Param: ]
A8: Java Function [ Return: Class Or Object:temp2 Function:startPreview
{} () Param: Param: Param: Param: Param: Param: Param: ]
A9: Wait [ MS:0 Seconds:5 Minutes:0 Hours:0 Days:0 ]
A10: Java Function [ Return: Class Or Object:temp2 Function:stopPreview
{} () Param: Param: Param: Param: Param: Param: Param: ]
A11: Java Function [ Return: Class Or Object:temp2 Function:release
{} () Param: Param: Param: Param: Param: Param: Param: ]
A12: Else
A13: Flash [ Text:Error en API Long:Off ]
A14: End If A ver, aquí he llamado a la linterna usando otra clase, que usa funciones disponibles en APIs inferiores a 19. A mi no me funciona, ya que supongo que es porque tengo Nougat, pero no estoy seguro en absoluto.
Además, he creado dos versiones de la misma ya que tampoco estoy seguro del nombre correcto que debo pasar en la A6 del tipo de parámetro. Asique prueba.
EDITO
Si me funciona. Habia cometido un error en mi tarea.
WillyWeb
04/07/18, 13:00:53
VERSIÓN 1
A6: Java Function [ Return: Class Or Object:temp3 Function:setFlashMode
{} (String) Param:torch Param: Param: Param: Param: Param: Param: ]
VERSIÓN 2
A6: Java Function [ Return: Class Or Object:temp3 Function:setFlashMode
{} (String) Param:flash_mode_torch Param: Param: Param: Param: Param: Param: ]
EDITO
Si me funciona. Habia cometido un error en mi tarea.
:oskitar:
Te lo estás currando a base de bien ... ¿ya tienes claro qué versión es la buena?
SmartPhoneLover
04/07/18, 14:01:48
Bueno, al probarla me funciona la primera versión, con el argumento 'torch'. No la que contiene 'flash_mode_torch'. Por lo que yo me decantaría por la primera.
Lo que no estoy seguro es la API, es decir, desconozco si habrá alguna diferencia en API 19 (KK), en el modo de funcionamiento. Pero, desde ya que en Nougat (API 25 = yo) funciona.
Nota: He probado esas acciones, transladadas a código Java en Android Studio, y en éste en cambio el parámetro que SÍ funciona es 'FLASH_MODE_TORCH' (mayúscula), pero 'TORCH/torch' NO. Por lo que me reafirma lo que un usuario en el foro (https://groups.google.com/forum/#!topic/tasker/MOT-8IIutmM) de Tasker me explicó referente al uso de servicios (no es el caso, pero sí el formato en el que se llaman a los posibles parámetros extras) en Tasker, a diferencia de hacerlo en código nativo.
-> vibrator_service is the name of the constant. However, Tasker's Java functions require the value of the constant (vibrator) = + info en Android doc sobre ello -> Go! (https://developer.android.com/reference/android/content/Context#VIBRATOR_SERVICE)
WillyWeb
04/07/18, 14:06:01
Aclarado. Muchas gracias campeón. :ok:
EDITO
Ahora que me doy cuenta. Yo tengo Oreo (v8.0.0). En lo que tenga un rato lo pruebo y te cuento.
SmartPhoneLover
04/07/18, 14:18:47
Por si a 'GraphicAdventure' le sigue sin funcionar ninguna de las tareas anteriores, ya encontré la app, con integración en Tasker, que solía usar tiempo atrás: TeslaLED Flight (http://teslacoilsw.com/teslaled/)
Nota: si a alguien le sirve como referencia, de aquí (https://stackoverflow.com/questions/6068803/how-to-turn-on-front-flash-light-programmatically-in-android) obtuve los datos de las últimas acciones.
WillyWeb
04/07/18, 21:42:26
Nota: He probado esas acciones, transladadas a código Java en Android Studio, y en éste en cambio el parámetro que SÍ funciona es 'FLASH_MODE_TORCH' (mayúscula), pero 'TORCH/torch' NO ...
Claro. Es que FLASH_MODE_TORCH = Constant Value: "torch"
https://developer.android.com/reference/android/hardware/Camera.Parameters.html#FLASH_MODE_TORCH
Seguro que si en Android Studio pasas "torch" (como cadena de texto) en vez de la constante predefinida también funciona. :pensando:
Caravantes
05/07/18, 00:46:10
Hola.
Me ha parecido un reto estupendo hacer esa tarea que emite un texto en morse. Más abajo va el código, pero os sugiero que comencéis viendo el vídeo para que os hagáis una idea de cómo funciona:
https://www.dropbox.com/s/bp7sx4yie09mdbi/Tasker-Morse.MP4?dl=0
He hecho una tare que puede funcionar como una tarea simple, en cuyo caso emite el mensaje "HOLA MUNDO" que repite una y otra vez indefinidamente. La emisión morse se hace mediante destellos del luz (flash) y simultáneamente con pitidos (bip bip). Además puede funcionar como una subtarea. En el primer parámetro (%par1) se pone la palabra o frase a emitir en morse. En el segundo parámetro (%par2) se pueden poner las letras L (luz) y/o S (sonido) para elegir el canal o canales de salida; también se puede añadir una letra R para repetir indefinidamente la transmisión del mensaje, o bien la letra R seguida de un número para indicar el número de repeticiones (R25); todos estos parámetros se separan por comas. Por defecto el valor de %par2 es "L,S,R"
Por cierto, sin root yo no he tenido ningún problema con la acción ANTORCHA (encender/apagar), funciona perfectamente (S.Galaxy S7 con Android 8.0.0)
La tarea tiene dos matrices principales. La primera se llama %alfabeto y contiene los 46 caracteres que se pueden traducir a morse, más un último elemento que servirá para señalizar el final de la transmisión (en morse, al terminar una transmisión se añade un código especial para indicar que ya se acabó, no habrá continuación). Los elementos de esta matriz son los siguientes:
A|B|C|D|E|F|G|H|I|J|K|L|M|N|Ñ|O|P|Q|R|S|T|U|V|W|X| Y|Z|0|1|2|3|4|5|6|7|8|9|.|,|?|"|/|-|’|:| |-FIN
Se ha usado una separación por barras porque la coma es un carácter o elemento a utilizar.
De forma paralela hay otra matriz homóloga con los signos morse. Se llama %alfamorse y contiene el mismo alfabeto, en morse, con los siguientes elementos:
*-|-***|-*-*|-**|*|**-*|--*|****|**|*---|-*-|*-**|--|*|--*--|---|*--*|--*-|*-*|***|-|**-|***-|*--|-**-|-*--|--**|-----|*----|**---|***--|****-|*****|-****|--***|---**|----*|*-*-*-|-*-*--|--**--|*-**-*|-**-*|-****-|---***|*----*|silencio|*-*-*
Veréis que he sustituido los puntos por asteriscos, que son más visibles.
El proceso empieza cogiendo del texto inicial (HOLA MUNDO), el primer carácter (H). Localiza la posición de ese carácter en la primera matriz (8) y luego usa la segunda matriz para coger el elemento de la misma posición (8), que es la traducción a morse (****) de ese carácter (H).
Una vez que se tiene el grupo de puntos y rayas que corresponden al carácter, la tarea hace un segundo bucle para procesar cada uno de esos signos. Y luego se pasa al siguiente carácter de la frase.
Al terminar de procesar cada carácter, un Flash muestra la parte del texto que ya se ha emitido, para orientación de quienes no sabemos morse. De esta forma tenemos cierta constancia de lo que se está emitiendo. Hubiera sido mejor hacer esto con una escena, pero no he querido complicarme.
Tras emitir el texto completo, se añade el código de "fin-de-transmisión", que es el último elemento de la matriz ( *-*-* ). Actualmente está un poco en desuso, pero en la telegrafía clásica tenía mucho sentido, y yo lo he mantenido.
Luego, la tarea comprueba si hay que repetir la emisión, en cuyo caso vuelve a empezar.
En telegrafía clásica también se transmitía un encabezamiento o prólogo previo al mensaje. Ese encabezamiento indicaba la estación de destino a la que se dirigía el mensaje y también la estación remitente que lo enviaba. Esto no es aplicable en nuestro caso.
En la matriz morse, podéis ver que en el elemento penúltimo he puesto la palabra "silencio", lo cual es una anomalía que explico enseguida (luego he visto que Willy había usado un truco similar en su tarea).
El morse no es binario sino ternario. Hay puntos, rayas y silencios. Entre cada dos palabras escritas hay un espacio, que en morse se traduce como un silencio de una duración determinada. Resultaba un poco confuso chequear en la primera matriz el carácter espacio (porque es invisible) y he preferido chequear en la segunda matriz esta palabra bien llamativa para que la tarea sepa que -al encontrar esa palabra- debe hacer una espera sin emitir nada.
Después de haber completado la tarea, al ver la de Willy me he dado cuenta de que la suya es mejor en un concepto de diseño: Willy procesa todo el texto traduciendolo y preparando el código de salida (puntos y rayas), y luego de que ya ha completado la traducción es cuando empieza a emitir. Eso hace que la emisión sea más ágil, porque no necesita ir traduciendo al mismo tiempo que emite como he hecho yo. Por contra, mi sistema tiene la ventaja de que va mostrando por pantalla el texto simultáneo a la emisión morse.
La tarea es típica mía, mastodóntica (65 acciones), de las cuales hay algunas prescindibles, pero las he puesto porque me ayudan a organizarlo todo. Hay tres bloques de acciones bien diferenciados:
A) Acciones iniciales preparatorias.
B) Bucle principal que procesa los caracteres de la frase, los traduce y emite en morse.
C) Coletilla para añadir el código "fin-de-transmisión" y para controlar si hay que repetir.
Cada uno de estos bloques está dentro de un grupo Si (If) - Fin Si (End if). No están ahí para chequear el cumplimiento de una condición, no. Solo los he puesto porque en la parte derecha de la acción Si (If) hay un "pico" que permite replegar/ocultar todo el contenido de ese grupo de acciones, y si tocas de nuevo ahí vuelven a desplegarse/visualizarse todas las acciones que antes estaban ocultas. Creo que es una buena estrategia para tareas muy largas, como ésta, porque es una ventaja tener visible solo la parte en la que estás trabajando, y oculto el resto.
Seguramente Willy podría rehacer la tarea con la mitad de las acciones. Y supongo que también se podría mejorar mucho añadiendo expresiones regulares o javascript. O también exportándola como aplicación.
En la tarea he aprovechado muchas etiquetas para poner comentarios sobre las acciones. No os despistéis con eso, son líneas que comienzan con "<" y preceden a la acción a la que está asociado ese texto. Las acciones reales siempre tienen al principio de línea la letra A(acción) y un número.
Más detalles: el alfabeto morse no contiene todos los caracteres que usamos normalmente. Para empezar, no distingue entre mayúsculas y minúsculas. Carece de acentos, diéresis y otras zarandajas. Sí tiene los 10 dígitos y unos cuantos signos de puntuación, los más básicos. Recientemente se ha añadido la letra eñe, pero creo que su uso es todavía muy escaso incluso en entornos hispanos, y sigue habiendo quien no la considera como "letra oficial". La tarea incluye acciones para detectar los caracteres que no se pueden traducir a morse. El texto de entrada puede estar en mayúsculas o minúsculas, es indistinto.
En la wikipedia y otras páginas podéis informaros sobre lo que duran los puntos, las rayas, las pausas entre letras, y otras cuestiones técnicas o históricas. También hay páginas web en las que escribes un texto y te lo "traducen" a puntos y rayas. En algunas como la siguiente también puedes "emitir" eso mediante luces y/o sonidos.
https://morsecode.scphillips.com/translator.html
Ahí puedes poner tu frase favorita y descargarte el archivo de sonido o bien grabar un vídeo para enviárselo a tu cuñado. También puedes grabar un SOS para luego emitirlo en bucle con el reproductor multimedia.
Comparado con esa página, mi tarea es lenta y torpe, como si estuviera emitiendo un telegrafista principiante. Espero que funcione suficientemente bien para que pueda ser comprendido por un telegrafista. Hay páginas que traducen texto a morse e incluso hay alguna que traduce morse (puntos y rayas) a texto, pero no he encontrado ninguna que "escuche" morse, ni nada parecido. Tampoco conozco a ningún telegrafista que pueda escuchar y diga si se entiende algo.
Ha sido divertido como reto o ejercicio de verano, eso es todo. Si alguien quiere más explicaciones, o el fichero XML con la tarea exportada, que lo diga. Si alguien quiere mejorarla o adaptarla, me parecerá genial. Saludos.
MiscMorse (203)
<Esta tarea convierte un texto en código morse y lo emite por el flash de la cámara y/o mediante sonidos (bip). Primera parte: acciones preparatorias.>
A1: Si (if) [ 1 ~ 1 ]
<El primer parametro es el texto a procesar; si no se indica nada, se usar el texto "HOLA MUNDO".>
A2: Establecer variable [ Nombre:%par1 A:Hola Mundo Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %par1 No ajust. ]
A3: Convertir Variable [ Nombre:%par1 Función:A Mayúsculas Almacenar Resultado en: ]
<El segundo parametro define el modo de funcionamiento según algunos caracteres clave, separados por comas: L(luz);S(sonido); R35(repetir 35 veces el mensaje); R0(repetir indefinidamente); por omisin se usará "L, S,R0".>
A4: Establecer variable [ Nombre:%par2 A:L,S,R Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %par2 No ajust. ]
A5: Establecer variable [ Nombre:%par2 A:L,S,%par2 Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %par2 !~ *L* & %par2 !~ *S* ]
<Esta variable contiene la duración por defecto (en milisegundos) de un punto morse.>
A6: Establecer variable [ Nombre:%mspunto A:100 Recurse Variables:Apagado Calcular:Encendido Añadir:Apagado ]
<Las siguientes acciones averiguan el número de repeticiones del mensaje morse a emitir>
A7: Establece Array [ Matriz de Variables (array):%pardos Values:%par2 Separador:, ]
<indicativo de repeticiones?>
A8: Si (if) [ %pardos(#?R*) > 0 ]
<R seguido de algo?>
A9: Si (if) [ %pardos(#?R) = 0 ]
A10: Establecer variable [ Nombre:%repeticiones A:%pardos(#?R*) Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
A11: Establecer variable [ Nombre:%repeticiones A:%pardos(%repeticiones) Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
A12: Buscar y Reemplazar Contenido de Variable [ Variable:%repeticiones Buscar:R Ignorar Caso:Apagado Multilínea:Apagado Una sola coincidencia:Apagado Almacenar Coincidencias En: Reemplazar Coincidencias:Encendido Reemplazar Con: ]
A13: Establecer variable [ Nombre:%repeticiones A:%repeticiones Recurse Variables:Apagado Calcular:Encendido Añadir:Apagado ]
A14: Fin si (End if)
A15: Fin si (End if)
<A|B|C|D|E|F|G|H|I|J|K|L|M|N|Ñ|O|P|Q|R|S|T|U|V|W|X| Y|Z|0|1|2|3|4|5|6|7|8|9|.|,|?|"|/|-|’|:| |-FIN>
A16: Establece Array [ Matriz de Variables (array):%alfabeto Values:A|B|C|D|E|F|G|H|I|J|K|L|M|N|Ñ|O|P|Q|R|S|T|U |V|W|X|Y|Z|0|1|2|3|4|5|6|7|8|9|.|,|?|"|/|-|’|:| |-FIN Separador:| ]
<*-|-***|-*-*|-**|*|**-*|--*|****|**|*---|-*-|*-**|--|*|--*--|---|*--*|--*-|*-*|***|-|**-|***-|*... etc>
A17: Establece Array [ Matriz de Variables (array):%alfamorse Values:*-|-***|-*-*|-**|*|**-*|--*|****|**|*---|-*-|*-**|--|*|--*--|---|*--*|--*-|*-*|***|-|**-|***-|*--|-**-|-*--|--**|-----|*----|**---|***--|****-|*****|-****|--***|---**|----*|*-*-*-|-*-*--|--**--|*-**-*|-**-*|-****-|---***|*----*|silencio|*-*-* Separador:| ]
A18: Probar Variable [ Tipo:Longitud Datos:%par1 Almacenar Resultado en:%longtexto ]
<Comienza a procesar el mensaje>
A19: Establecer variable [ Nombre:%numcaracter A:1 Recurse Variables:Apagado Calcular:Encendido Añadir:Apagado ]
A20: Establecer variable [ Nombre:%procesados A: Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
A21: Establecer variable [ Nombre:%procesados A:%repeticiones - Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %repeticiones > 0 ]
A22: Fin si (End if)
<Segunda parte y principal: el bucle que procesa cada uno de los caracteres de la frase>
A23: Si (if) [ 1 ~ 1 ]
<Bucle caracteres>
A24: Sección de Variable [ Nombre:%par1 Desde:%numcaracter Longitud:1 Encajar:Apagado Almacenar Resultado en:%caracter ]
<Salto fin de mensaje>
A25: Establecer variable [ Nombre:%posarray A:%alfabeto(#?%caracter) Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
A26: Establecer variable [ Nombre:%caracter A:# Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ] Si (if) [ %posarray = 0 ]
A27: Ir a acción [ Tipo:Etiqueta Acción Número:1 Etiqueta:Fin del grupo morse y del caracter ] Si (if) [ %posarray = 0 ]
A28: Establecer variable [ Nombre:%morsegrupo A:%alfamorse(%posarray) Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
<Espacio entre palabras implica una pausa en la secuencia morse>
A29: Si (if) [ %morsegrupo ~ silencio ]
A30: Esperar [ MS:%mspunto*4 Segundos:0 Minutos:0 Horas:0 Días:0 ]
A31: Else
A32: Probar Variable [ Tipo:Longitud Datos:%morsegrupo Almacenar Resultado en:%signosgrupo ]
A33: Establecer variable [ Nombre:%numsigno A:1 Recurse Variables:Apagado Calcular:Encendido Añadir:Apagado ]
<Bucle signos morse>
A34: Sección de Variable [ Nombre:%morsegrupo Desde:%numsigno Longitud:1 Encajar:Apagado Almacenar Resultado en:%signo ]
A35: Establecer variable [ Nombre:%duracionsigno A:0 Recurse Variables:Apagado Calcular:Encendido Añadir:Apagado ]
A36: Establecer variable [ Nombre:%duracionsigno A:%mspunto Recurse Variables:Apagado Calcular:Encendido Añadir:Apagado ] Si (if) [ %signo ~ * ]
A37: Establecer variable [ Nombre:%duracionsigno A:4*%mspunto Recurse Variables:Apagado Calcular:Encendido Añadir:Apagado ] Si (if) [ %signo ~ - ]
A38: Ir a acción [ Tipo:Etiqueta Acción Número:1 Etiqueta:Fin del grupo morse y del caracter ] Si (if) [ %duracionsigno = 0 ]
A39: Antorcha [ Establecer:Encendido ] Si (if) [ %pardos(#?L) > 0 ]
A40: Si (if) [ %pardos(#?S) > 0 ]
A41: Bip [ Frecuencia:8000 Duración:%duracionsigno Amplitud:50 Stream:3 ]
A42: Else
A43: Esperar [ MS:%duracionsigno Segundos:0 Minutos:0 Horas:0 Días:0 ]
A44: Fin si (End if)
A45: Antorcha [ Establecer:Apagado ] Si (if) [ %pardos(#?L) > 0 ]
A46: Esperar [ MS:%mspunto/2 Segundos:0 Minutos:0 Horas:0 Días:0 ]
A47: Sumar a variable [ Nombre:%numsigno Valor:1 Módulo (wrap around):0 ]
A48: Ir a acción [ Tipo:Etiqueta Acción Número:1 Etiqueta:Bucle signos morse ] Si (if) [ %numsigno < %signosgrupo | %numsigno = %signosgrupo ]
A49: Esperar [ MS:%mspunto*2 Segundos:0 Minutos:0 Horas:0 Días:0 ]
A50: Fin si (End if)
<Fin del grupo morse y del caracter>
A51: Establecer variable [ Nombre:%procesados A:%procesados%caracter Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
A52: Flash [ Texto:%procesados Largo:Apagado ]
A53: Sumar a variable [ Nombre:%numcaracter Valor:1 Módulo (wrap around):0 ]
A54: Ir a acción [ Tipo:Etiqueta Acción Número:1 Etiqueta:Bucle caracteres ] Si (if) [ %numcaracter < %longtexto | %numcaracter = %longtexto ]
A55: Fin si (End if)
<Tercera y última parte. Acciones finales tras el bucle principal.>
A56: Si (if) [ 1 ~ 1 ]
<Añadir la señal de "Fin de mensaje">
A57: Si (if) [ %numcaracter = %longtexto+1 ]
A58: Establecer variable [ Nombre:%caracter A:-FIN Recurse Variables:Apagado Calcular:Apagado Añadir:Apagado ]
A59: Ir a acción [ Tipo:Etiqueta Acción Número:1 Etiqueta:Salto fin de mensaje ]
A60: Fin si (End if)
A61: Esperar [ MS:%mspunto*7 Segundos:0 Minutos:0 Horas:0 Días:0 ]
<Mirar a ver si hay que repetir el mensaje>
A62: Ir a acción [ Tipo:Etiqueta Acción Número:1 Etiqueta:Comienza a procesar el mensaje ] Si (if) [ %pardos(#?R) > 0 ]
A63: Restar de variable [ Nombre:%repeticiones Valor:1 Módulo (wrap around):0 ]
A64: Ir a acción [ Tipo:Etiqueta Acción Número:1 Etiqueta:Comienza a procesar el mensaje ] Si (if) [ %repeticiones > 0 ]
A65: Fin si (End if)
WillyWeb
05/07/18, 08:12:04
Decir que te lo has currado es quedarse muy corto. :thumbup:
Muy interesante el tema de los parámetros de la subtarea para ver/escuchar/repetir el mensaje. Gran idea que me apunto.
Tengo el morse muy oxidado (hace más de 20 años que no lo uso) pero yo diría que lo que sale de la tarea es razonablemente bueno. Si quieres una opinión no humana, en esa misma web que has puesto tienes un servicio de "escucha/traducción"...
https://morsecode.scphillips.com/labs/audio-decoder-adaptive/
O puedes comparar, a oreja, con lo que hace la acción "Morse" de Tasker. ;-)
SmartPhoneLover
05/07/18, 11:39:56
Hola.
Me ha parecido un reto estupendo hacer esa tarea que emite un texto en morse. Más abajo va el código, pero os sugiero que comencéis viendo el vídeo para que os hagáis una idea de cómo funciona:
https://www.dropbox.com/s/bp7sx4yie09mdbi/Tasker-Morse.MP4?dl=0
(...)
Te me has adelantado Carvantes :) IMPRESIONANTE CURRO QUE TE HAS DADO COMPAÑERO!!! :campeon: :abracito:
Mira por donde, yo también he dividido mi tarea en 3 partes, o fases, y en general seguimos una metodología algo parecida, aunque cada uno tira por caminos distintos. Cuando la tenga lista os la paso!
GraphicAdventure
05/07/18, 11:41:39
Bueno, al probarla me funciona la primera versión, con el argumento 'torch'.
Me funciona con la versión 1. :aplaudit:
SmartPhoneLover
05/07/18, 11:50:08
Me funciona con la versión 1. :aplaudit:
:ok:
Caravantes
06/07/18, 01:22:29
Si quieres una opinión no humana, en esa misma web que has puesto tienes un servicio de "escucha/traducción"...
https://morsecode.scphillips.com/labs/audio-decoder-adaptive/
Excelente herramienta (yo había buscado algo así, pero no lo supe encontrar). Ahí he podido hacer muchas comprobaciones y ajustes finos para mejorar el ritmo de salida de las señales. Pero hay problemas que no puedo arreglar. Por ejemplo, he puesto la tarea emitiendo cincos sucesivos separados por espacios (5 5 5 5...). He elegido el 5 porque en morse son cinco puntos y eso genera un patrón fácil de controlar: ***** ***** ***** *****, etc. La web tiene una zona inferior donde muestra en verde el gráfico de sonido que va captando y en negro su traducción a señales (puntos/rayas). Ejemplo
1110010
Podéis ver que la anchura de los puntos es bastante uniforme (bip de 100 milisegundos), pero los tiempos de pausa varían demasiado. El robot escuchador identifica el grupo de la izquierda como una secuencia de cinco puntos, que equivale a un número 5 (correcto), pero en el segundo grupo hay mayores anomalías. Quizá Android se entretuvo comprobando el wifi o recibiendo una señal de la antena de telefonía o cualquier otra cosa, el caso es que la tarea trataba de emitir otros cinco puntos seguidos, pero el robot escuchador ha interpretado eso como dos grupos separados (** ***) y por lo tanto lo ha traducido en las letras IS. En las pruebas que he hecho, errores de este tipo aparecen hasta en una de cada cinco letras, lo cual me parece inaceptable. Pero no todos los problemas están de mi lado. Ese robot escuchador es muy rígido; a veces incluso malinterpreta una pausa levemente más larga de lo debido, aunque sea por muy poca diferencia (bastante menos que en el gráfico mostrado); estoy seguro de que un telegrafista humano sería más tolerante con esas pequeñas desviaciones.
He intentado hacer una prueba en condiciones "optimas": modo avión y smartphone reiniciado 1 minuto antes. El resultado ha sido bastante mejor: el robot esuchador solo ha fallado en una letra de la última palabra
ABCD EFGH IJKL MNOP QRST UVW XYZ 12345 67890 EN UN LUGAR DE LA MANCHA DE CUYO NOMBRE NO QUIERO ACORDALME
R=*-*
L=*-**
Conclusión: Creo que Tasker no es la herramienta adecuada para hacer ésto seriamente, al menos no como tarea normal. Quizá funcione mejor compliando la tarea (exportarla como aplicación). Pero quien quiera directamente generar código morse desde el smartphone tiene otras opciones: hay unas cuantas apps que "traducen" a morse el texto que escribas, emitiendo por altavoces y/o linterna, y probablemente funcionen mejor. También, ya lo dije, hay páginas web como la siguiente que traducen el texto que quieras y puedes escucharlo y/o guardar el fichero de sonido para reproducirlo cuando quieras.
https://morsecode.scphillips.com/translator.html
WillyWeb
06/07/18, 08:24:36
Parece que esas "orejas automáticas" son muy finas. ;-)
Seguramente conseguirás algo más de estabilidad en los tiempos entre signos si preparas la secuencia antes de comenzar la transmisión en vez de ir traduciendo al vuelo.
SmartPhoneLover
06/07/18, 15:40:08
Chicos, mirando entre las acciones de Decir, me he percatado que había una de Morse (audio). Me he enterado recién ahora que Tasker tenía esta acción, o ya la incluía de antes?
GraphicAdventure
06/07/18, 15:58:37
Existe desde la versión 4.3.
Sabía pero ni me acordé.
WillyWeb
06/07/18, 15:58:56
Está, al menos, desde hace tres años.
SmartPhoneLover
06/07/18, 16:46:09
XD, vaya.
Bueno, pues ya tenemos algo nativo con lo que trabajar en cuanto al sonido, por lo menos.
Fff, ni me había fijado en esa acción. Nunca.
WillyWeb
06/07/18, 20:46:45
Fff, ni me había fijado en esa acción. Nunca.
Si te vale de consuelo, eso me ha pasado a mí con algunos contextos. X-D
SmartPhoneLover
07/07/18, 17:59:40
Aquí os dejo mis tareas de código morse ;)
-PERFILES-
Profile: MC - Notificación
Event: Notification Click [ Owner Application:Tasker Title:Morse Converter ]
Enter: MC - Detener
A1: Stop [ With Error:On Task:MC - Sonido ]
A2: Java Function [ Return:(Vibrator) temp Class Or Object:CONTEXT Function:getSystemService
{Object} (String) Param:vibrator Param: Param: Param: Param: Param: Param: ]
A3: Java Function [ Return: Class Or Object:temp Function:cancel
{} () Param: Param: Param: Param: Param: Param: Param: Continue Task After Error:On ]
A4: Stop [ With Error:On Task:MC - Vibrador ]
A5: Stop [ With Error:On Task:MC - Luz Flash ]
A6: Torch [ Set:Off ]
A7: Notify Cancel [ Title:Morse Converter Warn Not Exist:Off ]
A8: Profile Status [ Name:MC - Notificación Set:Off ]
-TAREAS-
MC - Iniciar
<• Escribir Contenido>
A1: Variable Set [ Name:%temp1 To:sos sos Tasker Recurse Variables:Off Do Maths:Off Append:Off ]
<• Tipo Contenido>
A2: Variable Set [ Name:%temp2 To:A/N/P Recurse Variables:Off Do Maths:Off Append:Off ]
A3: Perform Task [ Name:MC - Vibrador Priority:%priority Parameter 1 (%par1):%temp1 Parameter 2 (%par2):%temp2 Return Value Variable: Stop:Off ]
MC - Detener
A1: Stop [ With Error:On Task:MC - Sonido ]
A2: Java Function [ Return:(Vibrator) temp Class Or Object:CONTEXT Function:getSystemService
{Object} (String) Param:vibrator Param: Param: Param: Param: Param: Param: ]
A3: Java Function [ Return: Class Or Object:temp Function:cancel
{} () Param: Param: Param: Param: Param: Param: Param: Continue Task After Error:On ]
A4: Stop [ With Error:On Task:MC - Vibrador ]
A5: Stop [ With Error:On Task:MC - Luz Flash ]
A6: Torch [ Set:Off ]
A7: Notify Cancel [ Title:Morse Converter Warn Not Exist:Off ]
A8: Profile Status [ Name:MC - Notificación Set:Off ]
MC - Sonido
A1: Notify [ Title:Morse Converter Text:Procesando... Icon:mw_editor_linear_scale Number:0 Permanent:On Priority:5 ]
<-> FASE 1>
A2: Anchor
<Abecedario>
A3: Variable Set [ Name:%temp1 To:a|b|c|d|e|f|g|h|i|j|k|l|m|n|ñ|o|p|q|r|s|t|u|v|w |x|y|z| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *A* ]
A4: Variable Set [ Name:%temp2 To:.-|-...|-.-.|-..|.|..-.|--.|....|..|.---|-.-|.-..|--|-.|--.--|---|.--.|--.-|.-.|...|-|..-|...-|.--|-..-|-.--|--..| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *A* ]
<Números>
A5: Variable Set [ Name:%temp1 To:1|2|3|4|5|6|7|8|9|0| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *N* ]
A6: Variable Set [ Name:%temp2 To:.----|..---|...--|....-|.....|-....|--...|---..|----.|-----| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *N* ]
<Puntuación>
A7: Variable Set [ Name:%temp1 To:.|,|;|:|?|!|-|_|/|'|"|(|)|@|&|=|+|$|^| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *P* ]
A8: Variable Set [ Name:%temp2 To:.-.-.-|--..--|-.-.-.|---...|..--..|-.-.--|-....-|..--.-|-..-.|.----.|.-..-.|-.--.|-.--.-|.--.-.|.-...|-...-|.-.-.|...-..-|^| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *P* ]
A9: Array Set [ Variable Array:%temp1 Values:%temp1 Splitter:| ]
A10: Array Set [ Variable Array:%temp2 Values:%temp2 Splitter:| ]
<-> FASE 2>
A11: Anchor
A12: Variable Convert [ Name:%par1 Function:To Lower Case Store Result In:%par1 ]
A13: Test Variable [ Type:Length Data:%par1 Store Result In:%tempa ]
A14: Variable Set [ Name:%tempb To: Recurse Variables:Off Do Maths:Off Append:Off ]
A15: Variable Search Replace [ Variable:%par1 Search:%tempb Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In: Replace Matches:On Replace With:^ ]
A16: Variable Clear [ Name:%tempb Pattern Matching:Off Local Variables Only:Off ]
A17: Variable Set [ Name:%tempb To:(%tempb)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A18: Variable Section [ Name:%par1 From:%tempb Length:1 Adapt To Fit:Off Store Result In:%tempc ]
A19: For [ Variable:%tempd Items:%temp1() ]
A20: Variable Set [ Name:%tempe To:(%tempe)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A21: If [ %tempd ~ %tempc ]
A22: Variable Set [ Name:%tempf To:%temp2(%tempe) Recurse Variables:Off Do Maths:Off Append:On ]
A23: Goto [ Type:Action Number Number:30 Label: ]
A24: End If
A25: End For
A26: If [ %tempe ~ %temp1(#) ]
A27: Flash [ Text:Elemento '%tempc' no reconocido, posición (%tempb) Long:On ]
A28: Stop [ With Error:Off Task: ]
A29: End If
A30: Variable Clear [ Name:%tempe Pattern Matching:Off Local Variables Only:Off ]
A31: Goto [ Type:Action Number Number:17 Label: ] If [ %tempb !~ %tempa ]
<-> FASE 3>
A32: Anchor
A33: Test Variable [ Type:Length Data:%tempf Store Result In:%tempa ]
A34: Profile Status [ Name:MC - Notificación Set:On ]
A35: Notify [ Title:Morse Converter Text:Reproduciendo... (tocar para detener) Icon:mw_editor_linear_scale Number:0 Permanent:On Priority:5 ]
A36: For [ Variable:%tempb Items:1:%tempa ]
A37: Variable Section [ Name:%tempf From:%tempb Length:1 Adapt To Fit:Off Store Result In:%tempc ]
A38: Beep [ Frequency:6000 Duration:100 Amplitude:50 Stream:3 ] If [ %tempc ~ . ]
A39: Beep [ Frequency:6000 Duration:300 Amplitude:50 Stream:3 ] If [ %tempc ~ - ]
A40: Wait [ MS:100 Seconds:0 Minutes:0 Hours:0 Days:0 ] If [ %tempc ~ ./- ]
A41: Wait [ MS:700 Seconds:0 Minutes:0 Hours:0 Days:0 ] If [ %tempc ~ ^ ]
A42: End For
A43: Notify Cancel [ Title:Morse Converter Warn Not Exist:Off ]
A44: Profile Status [ Name:MC - Notificación Set:Off ]
MC - Vibrador
A1: Notify [ Title:Morse Converter Text:Procesando... Icon:mw_editor_linear_scale Number:0 Permanent:On Priority:5 ]
<-> FASE 1>
A2: Anchor
<Abecedario>
A3: Variable Set [ Name:%temp1 To:a|b|c|d|e|f|g|h|i|j|k|l|m|n|ñ|o|p|q|r|s|t|u|v|w |x|y|z| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *A* ]
A4: Variable Set [ Name:%temp2 To:.-|-...|-.-.|-..|.|..-.|--.|....|..|.---|-.-|.-..|--|-.|--.--|---|.--.|--.-|.-.|...|-|..-|...-|.--|-..-|-.--|--..| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *A* ]
<Números>
A5: Variable Set [ Name:%temp1 To:1|2|3|4|5|6|7|8|9|0| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *N* ]
A6: Variable Set [ Name:%temp2 To:.----|..---|...--|....-|.....|-....|--...|---..|----.|-----| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *N* ]
<Puntuación>
A7: Variable Set [ Name:%temp1 To:.|,|;|:|?|!|-|_|/|'|"|(|)|@|&|=|+|$|^| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *P* ]
A8: Variable Set [ Name:%temp2 To:.-.-.-|--..--|-.-.-.|---...|..--..|-.-.--|-....-|..--.-|-..-.|.----.|.-..-.|-.--.|-.--.-|.--.-.|.-...|-...-|.-.-.|...-..-|^| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *P* ]
A9: Array Set [ Variable Array:%temp1 Values:%temp1 Splitter:| ]
A10: Array Set [ Variable Array:%temp2 Values:%temp2 Splitter:| ]
<-> FASE 2>
A11: Anchor
A12: Variable Convert [ Name:%par1 Function:To Lower Case Store Result In:%par1 ]
A13: Test Variable [ Type:Length Data:%par1 Store Result In:%tempa ]
A14: Variable Set [ Name:%tempb To: Recurse Variables:Off Do Maths:Off Append:Off ]
A15: Variable Search Replace [ Variable:%par1 Search:%tempb Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In: Replace Matches:On Replace With:^ ]
A16: Variable Clear [ Name:%tempb Pattern Matching:Off Local Variables Only:Off ]
A17: Variable Set [ Name:%tempb To:(%tempb)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A18: Variable Section [ Name:%par1 From:%tempb Length:1 Adapt To Fit:Off Store Result In:%tempc ]
A19: For [ Variable:%tempd Items:%temp1() ]
A20: Variable Set [ Name:%tempe To:(%tempe)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A21: If [ %tempd ~ %tempc ]
A22: Variable Set [ Name:%tempf To:%temp2(%tempe) Recurse Variables:Off Do Maths:Off Append:On ]
A23: Goto [ Type:Action Number Number:30 Label: ]
A24: End If
A25: End For
A26: If [ %tempe ~ %temp1(#) ]
A27: Flash [ Text:Elemento '%tempc' no reconocido, posición (%tempb) Long:On ]
A28: Stop [ With Error:Off Task: ]
A29: End If
A30: Variable Clear [ Name:%tempe Pattern Matching:Off Local Variables Only:Off ]
A31: Goto [ Type:Action Number Number:17 Label: ] If [ %tempb !~ %tempa ]
<-> FASE 3>
A32: Anchor
A33: Test Variable [ Type:Length Data:%tempf Store Result In:%tempa ]
A34: Variable Set [ Name:%tempd To:0, Recurse Variables:Off Do Maths:Off Append:Off ]
A35: For [ Variable:%tempb Items:1:%tempa ]
A36: Variable Section [ Name:%tempf From:%tempb Length:1 Adapt To Fit:Off Store Result In:%tempc ]
A37: Variable Set [ Name:%tempd To:100,100, Recurse Variables:Off Do Maths:Off Append:On ] If [ %tempc ~ . ]
A38: Variable Set [ Name:%tempd To:300,100, Recurse Variables:Off Do Maths:Off Append:On ] If [ %tempc ~ - ]
A39: Variable Set [ Name:%tempd To:0,700, Recurse Variables:Off Do Maths:Off Append:On ] If [ %tempc ~ ^ ]
A40: End For
A41: Variable Clear [ Name:%tempc Pattern Matching:Off Local Variables Only:Off ]
A42: Array Set [ Variable Array:%tempd Values:%tempd Splitter:, ]
A43: For [ Variable:%tempb Items:1:%tempd(#) ]
A44: Variable Set [ Name:%tempc To:%tempd(%tempb) Recurse Variables:Off Do Maths:Off Append:On ]
A45: Variable Set [ Name:%tempc To:+ Recurse Variables:Off Do Maths:Off Append:On ] If [ %tempb !~ %tempd(#) ]
A46: End For
A47: Variable Set [ Name:%tempc To:%tempc Recurse Variables:Off Do Maths:On Append:Off ]
A48: Profile Status [ Name:MC - Notificación Set:On ]
A49: Notify [ Title:Morse Converter Text:Reproduciendo... (tocar para detener) Icon:mw_editor_linear_scale Number:0 Permanent:On Priority:5 ]
A50: Java Function [ Return:(Vibrator) temp Class Or Object:CONTEXT Function:getSystemService
{Object} (String) Param:vibrator Param: Param: Param: Param: Param: Param: ]
A51: Java Function [ Return: Class Or Object:temp Function:vibrate
{} (long[], int) Param:%tempd Param:-1 Param: Param: Param: Param: Param: ]
A52: Wait [ MS:%tempc Seconds:0 Minutes:0 Hours:0 Days:0 ]
A53: Notify Cancel [ Title:Morse Converter Warn Not Exist:Off ]
A54: Profile Status [ Name:MC - Notificación Set:Off ]
MC - Luz Flash
A1: Notify [ Title:Morse Converter Text:Procesando... Icon:mw_editor_linear_scale Number:0 Permanent:On Priority:5 ]
<-> FASE 1>
A2: Anchor
<Abecedario>
A3: Variable Set [ Name:%temp1 To:a|b|c|d|e|f|g|h|i|j|k|l|m|n|ñ|o|p|q|r|s|t|u|v|w |x|y|z| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *A* ]
A4: Variable Set [ Name:%temp2 To:.-|-...|-.-.|-..|.|..-.|--.|....|..|.---|-.-|.-..|--|-.|--.--|---|.--.|--.-|.-.|...|-|..-|...-|.--|-..-|-.--|--..| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *A* ]
<Números>
A5: Variable Set [ Name:%temp1 To:1|2|3|4|5|6|7|8|9|0| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *N* ]
A6: Variable Set [ Name:%temp2 To:.----|..---|...--|....-|.....|-....|--...|---..|----.|-----| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *N* ]
<Puntuación>
A7: Variable Set [ Name:%temp1 To:.|,|;|:|?|!|-|_|/|'|"|(|)|@|&|=|+|$|^| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *P* ]
A8: Variable Set [ Name:%temp2 To:.-.-.-|--..--|-.-.-.|---...|..--..|-.-.--|-....-|..--.-|-..-.|.----.|.-..-.|-.--.|-.--.-|.--.-.|.-...|-...-|.-.-.|...-..-|^| Recurse Variables:Off Do Maths:Off Append:On ] If [ %par2 ~ *P* ]
A9: Array Set [ Variable Array:%temp1 Values:%temp1 Splitter:| ]
A10: Array Set [ Variable Array:%temp2 Values:%temp2 Splitter:| ]
<-> FASE 2>
A11: Anchor
A12: Variable Convert [ Name:%par1 Function:To Lower Case Store Result In:%par1 ]
A13: Test Variable [ Type:Length Data:%par1 Store Result In:%tempa ]
A14: Variable Set [ Name:%tempb To: Recurse Variables:Off Do Maths:Off Append:Off ]
A15: Variable Search Replace [ Variable:%par1 Search:%tempb Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In: Replace Matches:On Replace With:^ ]
A16: Variable Clear [ Name:%tempb Pattern Matching:Off Local Variables Only:Off ]
A17: Variable Set [ Name:%tempb To:(%tempb)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A18: Variable Section [ Name:%par1 From:%tempb Length:1 Adapt To Fit:Off Store Result In:%tempc ]
A19: For [ Variable:%tempd Items:%temp1() ]
A20: Variable Set [ Name:%tempe To:(%tempe)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A21: If [ %tempd ~ %tempc ]
A22: Variable Set [ Name:%tempf To:%temp2(%tempe) Recurse Variables:Off Do Maths:Off Append:On ]
A23: Goto [ Type:Action Number Number:30 Label: ]
A24: End If
A25: End For
A26: If [ %tempe ~ %temp1(#) ]
A27: Flash [ Text:Elemento '%tempc' no reconocido, posición (%tempb) Long:On ]
A28: Stop [ With Error:Off Task: ]
A29: End If
A30: Variable Clear [ Name:%tempe Pattern Matching:Off Local Variables Only:Off ]
A31: Goto [ Type:Action Number Number:17 Label: ] If [ %tempb !~ %tempa ]
<-> FASE 3>
A32: Anchor
A33: Test Variable [ Type:Length Data:%tempf Store Result In:%tempa ]
A34: Variable Set [ Name:%tempd To:0, Recurse Variables:Off Do Maths:Off Append:Off ]
A35: Profile Status [ Name:MC - Notificación Set:On ]
A36: Notify [ Title:Morse Converter Text:Reproduciendo... (tocar para detener) Icon:mw_editor_linear_scale Number:0 Permanent:On Priority:5 ]
A37: For [ Variable:%tempb Items:1:%tempa ]
A38: Variable Section [ Name:%tempf From:%tempb Length:1 Adapt To Fit:Off Store Result In:%tempc ]
A39: Torch [ Set:On ]
A40: Wait [ MS:100 Seconds:0 Minutes:0 Hours:0 Days:0 ] If [ %tempc ~ . ]
A41: Wait [ MS:300 Seconds:0 Minutes:0 Hours:0 Days:0 ] If [ %tempc ~ - ]
A42: Torch [ Set:Off ]
A43: Wait [ MS:100 Seconds:0 Minutes:0 Hours:0 Days:0 ] If [ %tempc ~ ./- ]
A44: Wait [ MS:700 Seconds:0 Minutes:0 Hours:0 Days:0 ] If [ %tempc ~ ^ ]
A45: End For
A46: Notify Cancel [ Title:Morse Converter Warn Not Exist:Off ]
Os explico...
A ver, lo primero que veis es un perfil, pues ese perfil lo uso en una notificación que se genera recién en la 3ª fase de cada tarea, el cual estará a la escucha de un toque en dicha notificación. Ésta servirá para detener manualmente la reproducción del mensaje a morse cuando nosotros queramos, ejecutando su tarea asociada: 'MC - Detener'. Así de simple.
En cuanto a las tareas, ¿por qué tengo tantas? Pues...
Las tareas llamadas: 'MC - Sonido', 'MC - Vibrador' y 'MC - Luz Flash', hacen exactamente lo mismo, es decir, traducir cualquier cadena de texto, o números a código morse. Pero cada una la interpretará de un modo distinto, según queramos en cada caso. (con un poquito de trabajo extra se podría mezclar, pudiendo interpretar el código de salida con sonido y luz al mismo tiempo, por ejemplo)
Por otro lado, las tareas: 'MC - Iniciar' y 'MC - Detener', son las encargadas de pasar los datos necesarios a ser procesados y traducidos, y detener x tarea manualmente, respectivamente.
SmartPhoneLover
07/07/18, 18:09:00
Más preguntas que os podais hacer...
- ¿Por qué has creado 3 acciones distintas para el alfabeto, números y signos de puntuación, si podrías haberlos puestos todos en una sola acción (o Array Set)?
Pues, puede que no se de el caso, pero si nuestro texto no incluye ningún signo de puntuación, o ningún número, pues la tarea tardaría menos en finalizar, ya que tendría menos elementos que buscar. Por lo tanto, se comportaría de manera más eficiente, al buscar solo aquellos elementos que sabemos que se encuentran en nuestro "input". (los valores son pasados por la variable %par2, desde 'MC - Iniciar'.
- ¿Por qué el signo '^' para sustituirlo por los espacios entre palabras, si en morse los espacios se indican con '|' o '/'?
Pues quize hacer la entrada de texto lo más simplicada posible, evitando incluir cualquier otro signo extra para hacerle saber a Tasker que ahí hay algo que debe tener en cuenta. De esta forma, tendremos que escribir las cadenas tal y como las escribiríamos de manera natural.
WillyWeb
07/07/18, 18:33:45
Me has dejado ... :oh:
Usar la expresión "te lo has currado" no hace justicia al tremendo trabajo que te has dado. :ok:
Me pica la curiosidad ... :pensando:
¿Cuánto tiempo te ha llevado todo eso?
¿Por qué unas veces haces la vibración con JF y otras con la acción de Tasker?
¿Por qué un perfil para detectar la pulsación en la notificación y no acciones directas en la misma?
¿Tanto se nota en el tiempo de proceso como para hacer lo de %par2=A/N/P y todo lo que conlleva?
Por favor, no interpretes mis preguntas como críticas. Simplemente has optado por planteamientos y/o soluciones en las que no había pensado y quiero entenderlas.
SmartPhoneLover
07/07/18, 19:15:56
Me has dejado ... :oh:
Usar la expresión "te lo has currado" no hace justicia al tremendo trabajo que te has dado. :ok:
Me pica la curiosidad ... :pensando:.
No hay problema, te explico...
- ¿Cuánto tiempo te ha llevado todo eso?
En realidad lo finalizé el martes de esta misma semana, pero me estaba peleando con cómo poder agregarle también los comandos en la conversación. Bueno, yo los decidí llamar en las tareas así, pero son las 'señales de procedimiento' (Prosigns).
Al final decidí eliminarlas temporalemente ya que no encontraba la manera correcta, y sobretodo eficiente, de hacer que Tasker las detecte y las interprete. Más adelante veré como incluirlas, ya que me parece que son bastante útiles.
- ¿Por qué unas veces haces la vibración con JF y otras con la acción de Tasker?
Imagino que te referirás en otras ocaciones, no en las tareas que acabo de dejar arriba.
Bueno, en este caso decidí hacer uso de funciones porque entre los métodos ofrecidos (públicos), está el de vibrar en base a un patrón, cosa que Tasker no lo tiene. Y dejando de lado los plugins, me pareció más eficiente generar los tiempos de ésta manera, y reproducirlos todos de una, aunque la tarea, en específica ésta, se demore unos instantes más en finalizar el procesado del código.
- ¿Por qué un perfil para detectar la pulsación en la notificación y no acciones directas en la misma?
Ya había pensado en incluirle un butón para pulsar, y de éste modo ahorrarme el perfil; pero, aún teniendo el máximo de prioridad (5), a veces otras notificaciones de otras apps pasan a primer puesto, y ocultan el botón de acción. Por lo que debería de cerrar esas notificaciones para poder volver a ver el botón de Tasker. Además, me gustan las notificaciones limpias, sin botones. (manias mías)
- ¿Tanto se nota en el tiempo de proceso como para hacer lo de %par2=A/N/P y todo lo que conlleva?
Al procesar 2, 5 o 10 carácteres, no o casi no. Sobretodo si esos carácteres se encuentran al inicio de la array: a, b, c, d... y no r, s, t (..) z.
Pero si la cadena que le pasamos es una frase completa como por ejemplo, la pregunta que me acabas de hacer, con 96 caracteres, sí que se demoraría unos cuantos segundos en procesarla entera. Y más, si le indicamos que busque también números y signos.
WillyWeb
07/07/18, 19:41:40
... me estaba peleando con cómo poder agregarle también los comandos ... son las 'señales de procedimiento' (Prosigns).
Muy interesante. Con eso tendrías una máquina morse muy completa. ;-)
... vibrar en base a un patrón, cosa que Tasker no lo tiene.
Tasker tiene dos acciones para controlar la vibración y una es con patrón.
...me gustan las notificaciones limpias, sin botones. (manias mías)
Ni mil millones de palabras más. :D
... si la cadena que le pasamos es una frase completa como por ejemplo, la pregunta que me acabas de hacer, con 96 caracteres, sí que se demoraría unos cuantos segundos en procesarla entera ...
Tal vez la traducción requiera otra estrategia para mejorar el tiempo de ejecución. :pensando:
SmartPhoneLover
07/07/18, 20:13:54
- Tasker tiene dos acciones para controlar la vibración y una es con patrón
Madre mía, si es verdad! Otro despite a la lista XD
- Tal vez la traducción requiera otra estrategia para mejorar el tiempo de ejecución
Volveré a revisar las tareas anteriores que habeis pasado. Mmm, esto es un pique en toda regla :risitas:
Caravantes
08/07/18, 03:37:03
Aquí os dejo mis tareas de código morse ;)
Muchísimas gracias, está genial.
Smart, porfa, haznos un poquito de vídeo para que veamos cómo luce y cómo suena eso.
Y también hazte un test de audición en https://morsecode.scphillips.com/labs/audio-decoder-adaptive/
y nos cuentas qué tal te ha ido.
Gracias.
SmartPhoneLover
10/07/18, 22:23:42
Muchísimas gracias, está genial.
Smart, porfa, haznos un poquito de vídeo para que veamos cómo luce y cómo suena eso.
Y también hazte un test de audición en https://morsecode.scphillips.com/labs/audio-decoder-adaptive/
y nos cuentas qué tal te ha ido.
Gracias.
Os comunico que me puse a modificar el conjunto de tareas para realizar las siguientes modificaciones/mejoras:
- Condensación de los tres modos de interpretación de mensaje, en una única tarea. (el rendimiento a la hora de reproducir el mensaje no se verá afectado, pero la tarea aumentará en nº de acciones considerablemente)
- Permitir la traducción de Morse a Alfa.
- Permitir la encriptación del mensaje de salida a 'Morse', teniendo una generación aleatoria cada vez que se le pase el mismo mensaje a Tasker. (por ahora me basaré en el sistema Cesar con una ligera modificación en su funcionamiento original, que aunque es un método de encriptación muy básico, será suficiente para empezar)
Nota: evitaré por el momento añadir escenas, que si bien serían una gran ayuda a la hora de organizar todo, pero por ahora considero que es mejor centrarse en las tripas del proyecto.
Cuando todo listo, haré el video y la prueba que comentas Caravantes ;)
SmartPhoneLover
14/07/18, 22:21:49
Hola compañeros,
Comentaros que ya tengo todo listo para montar, y como adición, he sustituido las acciones de encriptación en método cesar por Cipher (AES), por lo que será más seguro, aunque requiera más tiempo de procesado y la cadena de texto generada posterior sea más larga.
Pero, me ha surgido un problema en la tarea principal, específicamente en la siguiente sección de código:
A1: Notify [ Title:Morse Converter Text:Procesando... Icon:mw_editor_linear_scale Number:0 Permanent:On Priority:5 ]
A2: Variable Split [ Name:%par2 Splitter:. Delete Base:Off ]
<Alfa > Morse>
A3: If [ %par21 ~ A-M ]
<-> FASE 1>
A4: Anchor
<Abecedario>
A5: Array Set [ Variable Array:%temp1a Values:a|b|c|d|e|f|g|h|i|j|k|l|m|n|ñ|o|p|q|r|s|t|u |v|w|x|y|z| Splitter:| ]
A6: Array Set [ Variable Array:%temp1b Values:.-|-...|-.-.|-..|.|..-.|--.|....|..|.---|-.-|.-..|--|-.|--.--|---|.--.|--.-|.-.|...|-|..-|...-|.--|-..-|-.--|--..| Splitter:| ]
<Números>
A7: Array Set [ Variable Array:%temp2a Values:1|2|3|4|5|6|7|8|9|0| Splitter:| ]
A8: Array Set [ Variable Array:%temp2b Values:.----|..---|...--|....-|.....|-....|--...|---..|----.|-----| Splitter:| ]
<Puntuación>
A9: Array Set [ Variable Array:%temp3a Values:.|,|;|:|?|!|-|_|/|'|"|(|)|@|&|=|+|$|^| Splitter:| ]
A10: Array Set [ Variable Array:%temp3b Values:.-.-.-|--..--|-.-.-.|---...|..--..|-.-.--|-....-|..--.-|-..-.|.----.|.-..-.|-.--.|-.--.-|.--.-.|.-...|-...-|.-.-.|...-..-|^| Splitter:| ]
<-> FASE 2>
A11: Anchor
A12: Variable Convert [ Name:%par1 Function:To Lower Case Store Result In:%par1 ]
A13: Variable Search Replace [ Variable:%par1 Search: Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In: Replace Matches:On Replace With:^ ]
A14: Test Variable [ Type:Length Data:%par1 Store Result In:%tempa ]
<{bucle n1}>
A15: Variable Set [ Name:%tempb To:(%tempb)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A16: Variable Section [ Name:%par1 From:%tempb Length:1 Adapt To Fit:Off Store Result In:%tempc ]
A17: For [ Variable:%tempd Items:%temp1a() ] If [ %tempc ~R [a-z] | %tempc ~ ñ ]
A18: Variable Set [ Name:%tempe To:(%tempe)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A19: Variable Set [ Name:%tempf To:%temp1b(%tempe) Recurse Variables:Off Do Maths:Off Append:On ] If [ %tempd ~ %tempc ]
A20: Goto [ Type:Action Label Number:32 Label:{bucle n2} ] If [ %tempd ~ %tempc ]
A21: End For
A22: For [ Variable:%tempd Items:%temp2a() ] If [ %tempc ~R [0-9] ]
A23: Variable Set [ Name:%tempe To:(%tempe)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A24: Variable Set [ Name:%tempf To:%temp2b(%tempe) Recurse Variables:Off Do Maths:Off Append:On ] If [ %tempd ~ %tempc ]
A25: Goto [ Type:Action Label Number:32 Label:{bucle n2} ] If [ %tempd ~ %tempc ]
A26: End For
A27: For [ Variable:%tempd Items:%temp3a() ] If [ %tempc ~ ./,/;/:/?/!/-/_/'/"/(/)/@/&/=/+/$/^ | %tempc ~ / ]
A28: Variable Set [ Name:%tempe To:(%tempe)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A29: Variable Set [ Name:%tempf To:%temp3b(%tempe) Recurse Variables:Off Do Maths:Off Append:On ] If [ %tempd ~ %tempc ]
A30: Goto [ Type:Action Label Number:32 Label:{bucle n2} ] If [ %tempd ~ %tempc ]
A31: End For
A32: Flash [ Text:Elemento '%tempc' no reconocido, posición (%tempb). Long:On ]
A33: Goto [ Type:Action Label Number:1 Label:{fin} ]
<{bucle n2}>
A34: Variable Clear [ Name:%tempe Pattern Matching:Off Local Variables Only:Off ]
A35: Goto [ Type:Action Label Number:19 Label:{bucle n1} ] If [ %tempb !~ %tempa ]
A36: (...)Bien, si le pegais un vistazo a esa porción entereis como funciona, o por lo menos como pretendo que lo haga. Se me ha ocurrido agregar condicionales a los bucles For para intentar hacerla un poco más eficiente a la hora de detectar y analizar solo aquella array que contenga los valores correctos. Por eso, ya no veis acciones que concatenen los elementos en una sola array.
El problema lo tengo en la acción '27'. Bueno, al menos eso creo. Con ese condicional lo que quiero es que el bucle procese el elemento almacenado en la variable '%tempc', con los almacenados en la array '%temp3a()', que son todos los signos de puntuación que he añadido, excluyendo números y letras en las búsquedas.
La cosa es que cuando, por ejemplo, al haberle pasado la cadena 'tasker /', me procesa correctamente los 7 elementos, pero siempre falla con el signo de la barra diagonal. Pero lo curioso es que con la antigua estructura que teneis unos cuantos mensajes antes que éste, sí me la detecta; aunque uso un método diferente para analizar. Quizás esté indicándole mal a Tasker ese signo, no lo sé.
Nota: he probado también con: 'if %var coin. */*', 'if %var coin.Regex /', y Tasker detecta la barra como elemento individual.
Por lo tanto, sabeis como podría solucionar ese pequeño inconveniente? Gracias!
WillyWeb
14/07/18, 22:48:51
Si cambias ... %tempc ~ / ... por %tempc ig / ... en A27 y te funcionará.
_EDITO_
Y pon nombres descriptivos a las variables. Si todas se llaman %tempxxx es complicado de narices seguir la pista a lo que pasa en la tarea. :estrellas:
SmartPhoneLover
15/07/18, 12:03:42
A no, ya está. Bueno, tu solución la tenía que agregar en la acción posterior también. Y con respecto a las variables, aunque parezca descabellada, me aclaro perfectamente XD. Veré a ver qué hago.
SmartPhoneLover
16/07/18, 17:04:05
Bueno compañer@s, ya esta ;)
-PERFILES-
MC - Notificación
Event: Notification Click [ Owner Application:Tasker Title:Morse Translator-TAREAS-
MC - Iniciar
<-> FASE 1>
A1: Anchor
<Mensaje>
A2: Variable Set [ Name:%temp1 To:sos Recurse Variables:Off Do Maths:Off Append:Off ]
<Traducción>
A3: Variable Set [ Name:%temp2 To:A-M Recurse Variables:Off Do Maths:Off Append:Off ]
<Encriptación>
A4: Variable Set [ Name:%temp3 To:0 Recurse Variables:Off Do Maths:Off Append:Off ]
<Interpretación>
A5: Variable Set [ Name:%temp4 To:V Recurse Variables:Off Do Maths:Off Append:Off ]
<Portapapeles>
A6: Variable Set [ Name:%temp5 To:1 Recurse Variables:Off Do Maths:Off Append:Off ]
<-> FASE 2>
A7: Anchor
A8: Perform Task [ Name:MC - Traductor Priority:%priority Parameter 1 (%par1):%temp1 Parameter 2 (%par2):%temp2.%temp3.%temp4.%temp5 Return Value Variable: Stop:Off ]
MC - Detener
A1: Stop [ With Error:On Task:MC - Traductor ]
A2: Shut Up
A3: Java Function [ Return:(Vibrator) temp Class Or Object:CONTEXT Function:getSystemService
{Object} (String) Param:vibrator Param: Param: Param: Param: Param: Param: ]
A4: Java Function [ Return: Class Or Object:temp Function:cancel
{} () Param:%tempd Param:-1 Param: Param: Param: Param: Param: Continue Task After Error:On ]
A5: Torch [ Set:Off ]
A6: Notify Cancel [ Title:Morse Translator Warn Not Exist:Off ]
A7: Profile Status [ Name:MC - Notificación Set:Off ]
MC - Traductor
A1: Profile Status [ Name:MC - Notificación Set:On ]
A2: Notify [ Title:Morse Translator Text:Procesando... Icon:mw_editor_linear_scale Number:0 Permanent:On Priority:5 ]
A3: Variable Split [ Name:%par2 Splitter:. Delete Base:Off ]
<Abecedario>
A4: Array Set [ Variable Array:%temp1a Values:a|b|c|d|e|f|g|h|i|j|k|l|m|n|ñ|o|p|q|r|s|t|u |v|w|x|y|z| Splitter:| ]
A5: Array Set [ Variable Array:%temp1b Values:.-|-...|-.-.|-..|.|..-.|--.|....|..|.---|-.-|.-..|--|-.|--.--|---|.--.|--.-|.-.|...|-|..-|...-|.--|-..-|-.--|--..| Splitter:| ]
<Números>
A6: Array Set [ Variable Array:%temp2a Values:1|2|3|4|5|6|7|8|9|0| Splitter:| ]
A7: Array Set [ Variable Array:%temp2b Values:.----|..---|...--|....-|.....|-....|--...|---..|----.|-----| Splitter:| ]
<Puntuación>
A8: Array Set [ Variable Array:%temp3a Values:.|,|;|:|?|!|-|_|/|'|"|(|)|@|&|=|+|$| | Splitter:| ]
A9: Array Set [ Variable Array:%temp3b Values:.-.-.-|--..--|-.-.-.|---...|..--..|-.-.--|-....-|..--.-|-..-.|.----.|.-..-.|-.--.|-.--.-|.--.-.|.-...|-...-|.-.-.|...-..-| | Splitter:| ]
<Abecedario + Números + Puntuación>
A10: Array Set [ Variable Array:%temp4a Values:a|b|c|d|e|f|g|h|i|j|k|l|m|n|ñ|o|p|q|r|s|t|u |v|w|x|y|z|1|2|3|4|5|6|7|8|9|0|.|,|;|:|?|!|-|_|/|'|"|(|)|@|&|=|+|$|^| Splitter:| ]
A11: Array Set [ Variable Array:%temp4b Values:.-|-...|-.-.|-..|.|..-.|--.|....|..|.---|-.-|.-..|--|-.|--.--|---|.--.|--.-|.-.|...|-|..-|...-|.--|-..-|-.--|--..|.----|..---|...--|....-|.....|-....|--...|---..|----.|-----|.-.-.-|--..--|-.-.-.|---...|..--..|-.-.--|-....-|..--.-|-..-.|.----.|.-..-.|-.--.|-.--.-|.--.-.|.-...|-...-|.-.-.|...-..-|^| Splitter:| ]
<<font color='#0D95FF'>ENCRIPTACIÓN (alfa > morse)</font>>
A12: If [ %par22 !~ 0 & %par21 ~ A-M ]
A13: Variable Split [ Name:%par22 Splitter:- Delete Base:Off ]
<<font color='#0D95FF'>ENCRIPTAR</font>>
A14: If [ %par221 ~ 1 ]
<<font color='#FFF52D'>-> Fase 1</font>>
A15: Anchor
A16: Variable Convert [ Name:%par1 Function:To Lower Case Store Result In:%par1 ]
A17: Test Variable [ Type:Length Data:%par1 Store Result In:%tempa ]
<{bucle n1}>
A18: Variable Set [ Name:%tempb To:(%tempb)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A19: Variable Section [ Name:%par1 From:%tempb Length:1 Adapt To Fit:Off Store Result In:%tempc ]
A20: Goto [ Type:Action Label Number:32 Label:{bucle n2} ] If [ %tempc ~R [a-z] | %tempc ~ ñ ]
A21: Goto [ Type:Action Label Number:32 Label:{bucle n2} ] If [ %tempc ~R [0-9] ]
A22: Goto [ Type:Action Label Number:32 Label:{bucle n2} ] If [ %tempc eq %temp3a1 | %tempc eq %temp3a2 | %tempc eq %temp3a3 | %tempc eq %temp3a4 | %tempc eq %temp3a5 | %tempc eq %temp3a6 | %tempc eq %temp3a7 | %tempc eq %temp3a8 | %tempc eq %temp3a9 | %tempc eq %temp3a10 | %tempc eq %temp3a11 | %tempc eq %temp3a12 | %tempc eq %temp3a13 | %tempc eq %temp3a14 | %tempc eq %temp3a15 | %tempc eq %temp3a16 | %tempc eq %temp3a17 | %tempc eq %temp3a18 | %tempc eq %temp3a19 ]
A23: Flash [ Text:Elemento '%tempc' no reconocido, posición (%tempb). Long:On ]
A24: Goto [ Type:Action Label Number:1 Label:{fin} ]
<{bucle n2}>
A25: Goto [ Type:Action Label Number:19 Label:{bucle n1} ] If [ %tempb !~ %tempa ]
<<font color='#FFF52D'>-> Fase 2</font>>
A26: Anchor
A27: Java Function [ Return:temp1 Class Or Object:String Function:new
{String} (String) Param:%par1 Param: Param: Param: Param: Param: Param: ]
A28: Java Function [ Return:temp2 Class Or Object:String Function:new
{String} (String) Param:%par222 Param: Param: Param: Param: Param: Param: ]
A29: Java Function [ Return:temp1 Class Or Object:temp1 Function:getBytes
{byte[]} () Param: Param: Param: Param: Param: Param: Param: ]
A30: Java Function [ Return:temp2 Class Or Object:temp2 Function:getBytes
{byte[]} () Param: Param: Param: Param: Param: Param: Param: ]
A31: Java Function [ Return:temp3 Class Or Object:SecretKeySpec Function:new
{SecretKeySpec} (byte[], String) Param:temp2 Param:AES Param: Param: Param: Param: Param: ]
A32: Java Function [ Return:temp4 Class Or Object:Cipher Function:getInstance
{Cipher} (String) Param:AES Param: Param: Param: Param: Param: Param: ]
A33: Java Function [ Return: Class Or Object:temp4 Function:init
{} (int, Key) Param:1 Param:temp3 Param: Param: Param: Param: Param: ]
A34: Java Function [ Return:temp5 Class Or Object:temp4 Function:doFinal
{byte[]} (byte[]) Param:temp1 Param: Param: Param: Param: Param: Param: ]
A35: Java Function [ Return:%par1 Class Or Object:Base64 Function:encodeToString
{String} (byte[], int) Param:temp5 Param:64 Param: Param: Param: Param: Param: ]
A36: Variable Set [ Name:%xxx To:
Recurse Variables:Off Do Maths:Off Append:Off ]
A37: Variable Search Replace [ Variable:%par1 Search:%xxx Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In: Replace Matches:On Replace With: ]
<<font color='#FFF52D'>-> Fase 3</font>>
A38: Anchor
A39: Test Variable [ Type:Length Data:%par1 Store Result In:%tempa ]
A40: Variable Set [ Name:%tempd To: - ( Recurse Variables:Off Do Maths:Off Append:Off ]
A41: For [ Variable:%tempb Items:1:%tempa ]
A42: Variable Section [ Name:%par1 From:%tempb Length:1 Adapt To Fit:Off Store Result In:%tempc ]
A43: If [ %tempc ~R [A-Z] ]
A44: Array Push [ Variable Array:%tempd Position:%tempb Value:%tempb Fill Spaces:Off ]
A45: End If
A46: End For
A47: For [ Variable:%tempb Items:%tempd() ]
A48: Variable Set [ Name:%tempd To:%tempb Recurse Variables:Off Do Maths:Off Append:On ]
A49: Variable Set [ Name:%tempd To:, Recurse Variables:Off Do Maths:Off Append:On ] If [ %tempb !~ %tempd(<) ]
A50: End For
A51: Variable Set [ Name:%tempd To:) Recurse Variables:Off Do Maths:Off Append:On ]
A52: Variable Set [ Name:%par1 To:%tempd Recurse Variables:Off Do Maths:Off Append:On ]
<<font color='#0D95FF'>DESENCRIPTAR</font>>
A53: Else If [ %par221 ~ 2 ]
<<font color='#FFF52D'>-> Fase 1</font>>
A54: Anchor
A55: Variable Set [ Name:%xxx To: - ( Recurse Variables:Off Do Maths:Off Append:Off ]
A56: Variable Split [ Name:%par1 Splitter:%xxx Delete Base:Off ]
A57: Variable Split [ Name:%par12 Splitter:) Delete Base:Off ]
A58: Test Variable [ Type:Length Data:%par11 Store Result In:%tempa ]
A59: Array Set [ Variable Array:%tempb Values:%par121 Splitter:, ]
A60: For [ Variable:%tempc Items:1:%tempa ]
A61: Variable Section [ Name:%par11 From:%tempc Length:1 Adapt To Fit:Off Store Result In:%tempd ]
A62: If [ %tempc ~ %tempb(>) ]
A63: Array Pop [ Variable Array:%tempb Position:1 To Var: ]
A64: Variable Convert [ Name:%tempd Function:To Upper Case Store Result In:%tempd ]
A65: Variable Set [ Name:%tempe To:%tempd Recurse Variables:Off Do Maths:Off Append:On ]
A66: Else If [ %tempc !~ %tempb(>) ]
A67: Variable Set [ Name:%tempe To:%tempd Recurse Variables:Off Do Maths:Off Append:On ]
A68: End If
A69: End For
A70: Variable Set [ Name:%par1 To:%tempe Recurse Variables:Off Do Maths:Off Append:Off ]
<<font color='#FFF52D'>-> Fase 2</font>>
A71: Anchor
A72: Java Function [ Return:temp1 Class Or Object:Base64 Function:decode
{byte[]} (String, int) Param:%par1 Param:64 Param: Param: Param: Param: Param: ]
A73: Java Function [ Return:temp2 Class Or Object:String Function:new
{String} (String) Param:%par222 Param: Param: Param: Param: Param: Param: ]
A74: Java Function [ Return:temp2 Class Or Object:temp2 Function:getBytes
{byte[]} () Param: Param: Param: Param: Param: Param: Param: ]
A75: Java Function [ Return:temp3 Class Or Object:SecretKeySpec Function:new
{SecretKeySpec} (byte[], String) Param:temp2 Param:AES Param: Param: Param: Param: Param: ]
A76: Java Function [ Return:temp4 Class Or Object:Cipher Function:getInstance
{Cipher} (String) Param:AES Param: Param: Param: Param: Param: Param: ]
A77: Java Function [ Return: Class Or Object:temp4 Function:init
{} (int, Key) Param:2 Param:temp3 Param: Param: Param: Param: Param: ]
A78: Java Function [ Return:temp5 Class Or Object:temp4 Function:doFinal
{byte[]} (byte[]) Param:temp1 Param: Param: Param: Param: Param: Param: ]
A79: Java Function [ Return:%par1 Class Or Object:String Function:new
{String} (byte[]) Param:temp5 Param: Param: Param: Param: Param: Param: ]
A80: End If
<<font color='#0D95FF'>ENCRIPTACIÓN (morse > alfa)</font>>
A81: Else If [ %par22 !~ 0 & %par21 ~ M-A ]
<<font color='#0D95FF'>ENCRIPTAR</font>>
A82: If [ %par221 ~ 1 ]
<<font color='#FFF52D'>-> Fase 1</font>>
A83: Anchor
A84: Java Function [ Return:temp1 Class Or Object:String Function:new
{String} (String) Param:%par1 Param: Param: Param: Param: Param: Param: ]
A85: Java Function [ Return:temp2 Class Or Object:String Function:new
{String} (String) Param:%par222 Param: Param: Param: Param: Param: Param: ]
A86: Java Function [ Return:temp1 Class Or Object:temp1 Function:getBytes
{byte[]} () Param: Param: Param: Param: Param: Param: Param: ]
A87: Java Function [ Return:temp2 Class Or Object:temp2 Function:getBytes
{byte[]} () Param: Param: Param: Param: Param: Param: Param: ]
A88: Java Function [ Return:temp3 Class Or Object:SecretKeySpec Function:new
{SecretKeySpec} (byte[], String) Param:temp2 Param:AES Param: Param: Param: Param: Param: ]
A89: Java Function [ Return:temp4 Class Or Object:Cipher Function:getInstance
{Cipher} (String) Param:AES Param: Param: Param: Param: Param: Param: ]
A90: Java Function [ Return: Class Or Object:temp4 Function:init
{} (int, Key) Param:1 Param:temp3 Param: Param: Param: Param: Param: ]
A91: Java Function [ Return:temp5 Class Or Object:temp4 Function:doFinal
{byte[]} (byte[]) Param:temp1 Param: Param: Param: Param: Param: Param: ]
A92: Java Function [ Return:%par1 Class Or Object:Base64 Function:encodeToString
{String} (byte[], int) Param:temp5 Param:64 Param: Param: Param: Param: Param: ]
A93: Variable Set [ Name:%xxx To:
Recurse Variables:Off Do Maths:Off Append:Off ]
A94: Variable Search Replace [ Variable:%par1 Search:%xxx Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In: Replace Matches:On Replace With: ]
<<font color='#FFF52D'>-> Fase 2</font>>
A95: Anchor
A96: Variable Set [ Name:%xxx To:
Recurse Variables:Off Do Maths:Off Append:Off ]
A97: Variable Search Replace [ Variable:%par1 Search:%xxx Ignore Case:Off Multi-Line:Off One Match Only:Off Store Matches In: Replace Matches:On Replace With: ]
A98: Test Variable [ Type:Length Data:%par1 Store Result In:%tempa ]
A99: Variable Set [ Name:%tempd To: - ( Recurse Variables:Off Do Maths:Off Append:Off ]
A100: For [ Variable:%tempb Items:1:%tempa ]
A101: Variable Section [ Name:%par1 From:%tempb Length:1 Adapt To Fit:Off Store Result In:%tempc ]
A102: If [ %tempc ~R [A-Z] ]
A103: Array Push [ Variable Array:%tempd Position:%tempb Value:%tempb Fill Spaces:Off ]
A104: End If
A105: End For
A106: For [ Variable:%tempb Items:%tempd() ]
A107: Variable Set [ Name:%tempd To:%tempb Recurse Variables:Off Do Maths:Off Append:On ]
A108: Variable Set [ Name:%tempd To:, Recurse Variables:Off Do Maths:Off Append:On ] If [ %tempb !~ %tempd(<) ]
A109: End For
A110: Variable Set [ Name:%tempd To:) Recurse Variables:Off Do Maths:Off Append:On ]
A111: Variable Set [ Name:%par1 To:%tempd Recurse Variables:Off Do Maths:Off Append:On ]
<<font color='#0D95FF'>DESENCRIPTAR</font>>
A112: Else If [ %par221 ~ 2 ]
<<font color='#FFF52D'>-> Fase 1</font>>
A113: Anchor
A114: Variable Set [ Name:%xxx To: - ( Recurse Variables:Off Do Maths:Off Append:Off ]
A115: Variable Split [ Name:%par1 Splitter:%xxx Delete Base:Off ]
A116: Variable Split [ Name:%par12 Splitter:) Delete Base:Off ]
A117: Test Variable [ Type:Length Data:%par11 Store Result In:%tempa ]
A118: Array Set [ Variable Array:%tempb Values:%par121 Splitter:, ]
A119: For [ Variable:%tempc Items:1:%tempa ]
A120: Variable Section [ Name:%par11 From:%tempc Length:1 Adapt To Fit:Off Store Result In:%tempd ]
A121: If [ %tempc ~ %tempb(>) ]
A122: Array Pop [ Variable Array:%tempb Position:1 To Var: ]
A123: Variable Convert [ Name:%tempd Function:To Upper Case Store Result In:%tempd ]
A124: Variable Set [ Name:%tempe To:%tempd Recurse Variables:Off Do Maths:Off Append:On ]
A125: Else If [ %tempc !~ %tempb(>) ]
A126: Variable Set [ Name:%tempe To:%tempd Recurse Variables:Off Do Maths:Off Append:On ]
A127: End If
A128: End For
A129: Variable Set [ Name:%par1 To:%tempe Recurse Variables:Off Do Maths:Off Append:Off ]
<<font color='#FFF52D'>-> Fase 2</font>>
A130: Anchor
A131: Java Function [ Return:temp1 Class Or Object:Base64 Function:decode
{byte[]} (String, int) Param:%par1 Param:64 Param: Param: Param: Param: Param: ]
A132: Java Function [ Return:temp2 Class Or Object:String Function:new
{String} (String) Param:%par2 Param: Param: Param: Param: Param: Param: ]
A133: Java Function [ Return:temp2 Class Or Object:temp2 Function:getBytes
{byte[]} () Param: Param: Param: Param: Param: Param: Param: ]
A134: Java Function [ Return:temp3 Class Or Object:SecretKeySpec Function:new
{SecretKeySpec} (byte[], String) Param:temp2 Param:AES Param: Param: Param: Param: Param: ]
A135: Java Function [ Return:temp4 Class Or Object:Cipher Function:getInstance
{Cipher} (String) Param:AES Param: Param: Param: Param: Param: Param: ]
A136: Java Function [ Return: Class Or Object:temp4 Function:init
{} (int, Key) Param:2 Param:temp3 Param: Param: Param: Param: Param: ]
A137: Java Function [ Return:temp5 Class Or Object:temp4 Function:doFinal
{byte[]} (byte[]) Param:temp1 Param: Param: Param: Param: Param: Param: ]
A138: Java Function [ Return:%par1 Class Or Object:String Function:new
{String} (byte[]) Param:temp5 Param: Param: Param: Param: Param: Param: ]
A139: End If
A140: End If
<<font color='#0D95FF'>ALFA > MORSE</font>>
A141: If [ %par21 ~ A-M ]
<<font color='#FFF52D'>-> Fase 1</font>>
A142: Anchor
A143: Variable Convert [ Name:%par1 Function:To Lower Case Store Result In:%par1 ]
A144: Test Variable [ Type:Length Data:%par1 Store Result In:%tempa ]
<{bucle n3}>
A145: Variable Set [ Name:%tempb To:(%tempb)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A146: Variable Section [ Name:%par1 From:%tempb Length:1 Adapt To Fit:Off Store Result In:%tempc ]
A147: For [ Variable:%tempd Items:%temp1a() ] If [ %tempc ~R [a-z] | %tempc ~ ñ ]
A148: Variable Set [ Name:%tempe To:(%tempe)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A149: If [ %tempd ~ %tempc ]
A150: Variable Set [ Name:%tempf To:%temp1b(%tempe) Recurse Variables:Off Do Maths:Off Append:On ]
A151: Goto [ Type:Action Label Number:32 Label:{bucle n4} ]
A152: End If
A153: End For
A154: For [ Variable:%tempd Items:%temp2a() ] If [ %tempc ~R [0-9] ]
A155: Variable Set [ Name:%tempe To:(%tempe)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A156: If [ %tempd ~ %tempc ]
A157: Variable Set [ Name:%tempf To:%temp2b(%tempe) Recurse Variables:Off Do Maths:Off Append:On ]
A158: Goto [ Type:Action Label Number:32 Label:{bucle n4} ]
A159: End If
A160: End For
A161: For [ Variable:%tempd Items:%temp3a() ] If [ %tempc eq %temp3a1 | %tempc eq %temp3a2 | %tempc eq %temp3a3 | %tempc eq %temp3a4 | %tempc eq %temp3a5 | %tempc eq %temp3a6 | %tempc eq %temp3a7 | %tempc eq %temp3a8 | %tempc eq %temp3a9 | %tempc eq %temp3a10 | %tempc eq %temp3a11 | %tempc eq %temp3a12 | %tempc eq %temp3a13 | %tempc eq %temp3a14 | %tempc eq %temp3a15 | %tempc eq %temp3a16 | %tempc eq %temp3a17 | %tempc eq %temp3a18 | %tempc eq %temp3a19 ]
A162: Variable Set [ Name:%tempe To:(%tempe)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A163: If [ %tempd eq %tempc ]
A164: Variable Set [ Name:%tempf To:%temp3b(%tempe) Recurse Variables:Off Do Maths:Off Append:On ] If [ %tempd neq %temp3a19 ]
A165: Variable Set [ Name:%tempf To:| Recurse Variables:Off Do Maths:Off Append:On ] If [ %tempd eq %temp3a19 ]
A166: Goto [ Type:Action Label Number:32 Label:{bucle n4} ]
A167: End If
A168: End For
A169: Flash [ Text:Elemento '%tempc' no reconocido, posición (%tempb). Long:On ]
A170: Goto [ Type:Action Label Number:1 Label:{fin} ]
<{bucle n4}>
A171: Variable Clear [ Name:%tempe Pattern Matching:Off Local Variables Only:Off ]
A172: Goto [ Type:Action Label Number:19 Label:{bucle n3} ] If [ %tempb !~ %tempa ]
A173: Set Clipboard [ Text:%tempf Add:Off ] If [ %par24 ~ 1 ]
<<font color='#FFF52D'>-> Fase 2</font>>
A174: Anchor
A175: Test Variable [ Type:Length Data:%tempf Store Result In:%tempa ]
<Sonido>
A176: If [ %par23 ~ S ]
A177: Notify [ Title:Morse Translator Text:Reproduciendo... Icon:mw_editor_linear_scale Number:0 Permanent:On Priority:5 ]
A178: For [ Variable:%tempb Items:1:%tempa ]
A179: Variable Section [ Name:%tempf From:%tempb Length:1 Adapt To Fit:Off Store Result In:%tempc ]
A180: Beep [ Frequency:6000 Duration:100 Amplitude:50 Stream:3 ] If [ %tempc eq . ]
A181: Beep [ Frequency:6000 Duration:300 Amplitude:50 Stream:3 ] If [ %tempc eq - ]
A182: Wait [ MS:100 Seconds:0 Minutes:0 Hours:0 Days:0 ] If [ %tempc eq %temp3b19 ]
A183: Wait [ MS:700 Seconds:0 Minutes:0 Hours:0 Days:0 ] If [ %tempc eq | ]
A184: End For
<Vibrador>
A185: Else If [ %par23 ~ V ]
A186: Variable Set [ Name:%tempd To:0, Recurse Variables:Off Do Maths:Off Append:Off ]
A187: For [ Variable:%tempb Items:1:%tempa ]
A188: Variable Section [ Name:%tempf From:%tempb Length:1 Adapt To Fit:Off Store Result In:%tempc ]
A189: Variable Set [ Name:%tempd To:100,100, Recurse Variables:Off Do Maths:Off Append:On ] If [ %tempc eq . ]
A190: Variable Set [ Name:%tempd To:300,100, Recurse Variables:Off Do Maths:Off Append:On ] If [ %tempc eq - ]
A191: Variable Set [ Name:%tempd To:0,700, Recurse Variables:Off Do Maths:Off Append:On ] If [ %tempc eq | ]
A192: End For
A193: Variable Clear [ Name:%tempc Pattern Matching:Off Local Variables Only:Off ]
A194: Array Set [ Variable Array:%tempd Values:%tempd Splitter:, ]
A195: For [ Variable:%tempb Items:1:%tempd(#) ]
A196: Variable Set [ Name:%tempc To:%tempd(%tempb) Recurse Variables:Off Do Maths:Off Append:On ]
A197: Variable Set [ Name:%tempc To:+ Recurse Variables:Off Do Maths:Off Append:On ] If [ %tempb !~ %tempd(#) ]
A198: End For
A199: Variable Set [ Name:%tempc To:%tempc Recurse Variables:Off Do Maths:On Append:Off ]
A200: Notify [ Title:Morse Translator Text:Reproduciendo... Icon:mw_editor_linear_scale Number:0 Permanent:On Priority:5 ]
A201: Java Function [ Return:(Vibrator) temp Class Or Object:CONTEXT Function:getSystemService
{Object} (String) Param:vibrator Param: Param: Param: Param: Param: Param: ]
A202: Java Function [ Return: Class Or Object:temp Function:vibrate
{} (long[], int) Param:%tempd Param:-1 Param: Param: Param: Param: Param: ]
A203: Wait [ MS:%tempc Seconds:0 Minutes:0 Hours:0 Days:0 ]
<Luz Flash>
A204: Else If [ %par23 ~ L ]
A205: Notify [ Title:Morse Translator Text:Reproduciendo... Icon:mw_editor_linear_scale Number:0 Permanent:On Priority:5 ]
A206: For [ Variable:%tempb Items:1:%tempa ]
A207: Variable Section [ Name:%tempf From:%tempb Length:1 Adapt To Fit:Off Store Result In:%tempc ]
A208: Torch [ Set:On ]
A209: Wait [ MS:100 Seconds:0 Minutes:0 Hours:0 Days:0 ] If [ %tempc eq . ]
A210: Wait [ MS:300 Seconds:0 Minutes:0 Hours:0 Days:0 ] If [ %tempc eq - ]
A211: Torch [ Set:Off ]
A212: Wait [ MS:100 Seconds:0 Minutes:0 Hours:0 Days:0 ] If [ %tempc eq . | %tempc eq - ]
A213: Wait [ MS:700 Seconds:0 Minutes:0 Hours:0 Days:0 ] If [ %tempc eq | ]
A214: End For
A215: End If
<<font color='#0D95FF'>MORSE > ALFA</font>>
A216: Else If [ %par21 ~ M-A ]
<<font color='#FFF52D'>-> Fase 1</font>>
A217: Anchor
A218: Variable Split [ Name:%par1 Splitter: Delete Base:Off ]
<{bucle n5}>
A219: Variable Set [ Name:%tempb To:(%tempb)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A220: For [ Variable:%tempd Items:%temp4b() ]
A221: Variable Set [ Name:%tempe To:(%tempe)+1 Recurse Variables:Off Do Maths:On Append:Off ]
A222: If [ %tempd ~ %par1(%tempb) | %par1(%tempb) eq | ]
A223: Variable Set [ Name:%tempf To:%temp4a(%tempe) Recurse Variables:Off Do Maths:Off Append:On ] If [ %tempd ~ %par1(%tempb) ]
A224: Variable Set [ Name:%tempf To: Recurse Variables:Off Do Maths:Off Append:On ] If [ %par1(%tempb) eq | ]
A225: Goto [ Type:Action Label Number:28 Label:{bucle n6} ]
A226: End If
A227: End For
A228: If [ %tempe ~ %temp4b(#) ]
A229: Flash [ Text:Elemento '%par1(%tempb)' no reconocido, posición (%tempb) Long:On ]
A230: Goto [ Type:Action Label Number:1 Label:{fin} ]
A231: End If
<{bucle n6}>
A232: Variable Clear [ Name:%tempe Pattern Matching:Off Local Variables Only:Off ]
A233: Goto [ Type:Action Label Number:6 Label:{bucle n5} ] If [ %tempb !~ %par1(#) ]
A234: Set Clipboard [ Text:%tempf Add:Off ] If [ %par24 ~ 1 ]
<<font color='#FFF52D'>-> Fase 2</font>>
A235: Anchor
A236: Notify [ Title:Morse Translator Text:Reproduciendo... Icon:mw_editor_linear_scale Number:0 Permanent:On Priority:5 ]
A237: Say [ Text:%tempf Engine:Voice:com.ivona.tts:spa-ESP Stream:3 Pitch:7 Speed:5 Respect Audio Focus:On Network:Off Continue Task Immediately:Off ]
A238: End If
<{fin}>
A239: Notify Cancel [ Title:Morse Translator Warn Not Exist:Off ]
A240: Profile Status [ Name:MC - Notificación Set:Off ]
MC - Generador Clave
A1: Array Set [ Variable Array:%temp Values:a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v ,w,x,y,z,0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K ,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z Splitter:, ]
<16=128bits | 24=192bits | 32=256bits>
A2: For [ Variable:%xxx Items:1:16 ]
A3: Variable Randomize [ Name:%tempa Min:1 Max:62 ]
A4: Variable Set [ Name:%tempb To:%temp(%tempa) Recurse Variables:Off Do Maths:Off Append:On ]
A5: End For
A6: Set Clipboard [ Text:%tempb Add:Off ]
A7: Flash [ Text:Clave: %tempb Long:On ] Cosas a recalcar...
Cambios:
- Encriptación para alfa a morse, y viceversa, usando Cipher (AES de 128/192/256 bits)
- Ahora se puede controlar la tarea principal desde una única tarea: 'MC - Iniciar', donde tendremos que indicar los parametros que deseemos.
- Loops mejorados, al menos eso creo. :estrellas:
- Tarea a parte para generar la contraseña necesaria para poder encriptar/desencriptar mensajes: 'MC - Generador Clave'.
- He concentrado todas las tareas que antes estaban por separado, en una troncal.
- Ahora el mensaje a morse sale totalmente formateado para ser fácilmente interpretable, y leido (humano).
- Etiquetas rediseñadas (y algunas introducidas) para hacer más fácil la comprensión de cada grupo de acciones.
- He reintoducido las acciones JF para controlar el vibrador, debido a que no he hallado forma de detener manualmente la vibración, una vez iniciada. (WillyWeb, cuenta Tasker con alguna acción para ello? y que se me haya escapado?)
Notas:
· Desde mañana hasta el fin de semana no estaré disponible, por lo que me apresuré a finalizar el proyecto lo antes posible. Por lo tanto, os lo dejo para que lo reviseis y vayais entendiendo como funciona.
· Si encontrais algún error, comentadlo y discutirlo. (puede que se me haya pasado algo o algunas cosas)
· Y por si os parece larga para importarla manualmente, os dejo el proyecto XML adjunto al mensaje.
WillyWeb
16/07/18, 18:57:11
He reintoducido las acciones JF para controlar el vibrador, debido a que no he hallado forma de detener manualmente la vibración, una vez iniciada. (WillyWeb, cuenta Tasker con alguna acción para ello? y que se me haya escapado?)
Tanto "Vibrar" como "Vibrar con patrón" ofrecen un control preciso de la duración en milisegundos. ¿No te vale ninguna? :oh:
SmartPhoneLover
16/07/18, 19:43:57
Tanto "Vibrar" como "Vibrar con patrón" ofrecen un control preciso de la duración en milisegundos. ¿No te vale ninguna? :oh:
A qué te refieres? Pero por si...
- Si te refieres a la pausa que hago al final del conjunto de acciones de vibración en la tarea principal, es para detenerse antes de que se ejecuten las últimas acciones finales. Me parece que dichas acciones se ejecutan de modo que permiten la ejecución de acciones posteriores.
- Y si hablas de la acción detener, lo hago para detener la vibración de manera manual cuando pulso en la notificación. Sino, no me sería posible.
GraphicAdventure
21/07/18, 13:17:05
SmartPhoneLover, tu versión del comentario 3 funciona, ¿no? :D
¡Eso es para más que emitir un SOS!
vBulletin® v3.8.1, Copyright ©2000-2025, Jelsoft Enterprises Ltd.