diff --git a/README.md b/README.md index b91209b..695980d 100644 --- a/README.md +++ b/README.md @@ -733,3 +733,176 @@ El test que se realizó es acerca del estado de animo y ansiedad, el cuál luce Para la parte de actividades, se requiere crear de nuevo un Swift File, con el nombre de ActiveTaskManager +La estructura para la creacion de las tareas activas es la misma a los formularios, sin embargo, como mencionamos anteriormente los desarrolladores crearon distintos módulos en el formato ingles, asi que para personas que hablan español, es necesario poner indicaciones antes de la actividad. En esta ocasión se pondran # actividades que abarcan las distintas áreas precargadas de ResearchKit. + +EL fommato de archivo para actividades es el siguiente: + +``` +import Foundation +import ResearchKit +import ResearchKitUI +import ResearchKitActiveTask +import ResearchKitActiveTask_Private + + +class ActiveTaskManager { + static let shared = ActiveTaskManager() + + func createActiveTasks() -> ORKOrderedTask { + + + + return ORKOrderedTask(identifier: "activeTasks", steps: []) + } + } +``` + +en la función se irán colocando las actividades y seguido de step el orden en que se quiere mostrar. + +Las actividades están variadas, en algunas de las áreas que permite, ResearchKit, como por ejemplo, *Motor Activities, Cognition, Speech, Hearing, Hand Dexterity, Vision* los ejemplos se pueden observar en el siguiente código. + +``` +import Foundation +import ResearchKit +import ResearchKitUI +import ResearchKitActiveTask +import ResearchKitActiveTask_Private + + +class ActiveTaskManager { + static let shared = ActiveTaskManager() + + func createActiveTasks() -> ORKOrderedTask { + + let bienvenido = ORKInstructionStep(identifier: "bienvenido") + bienvenido.title = "Bienvenido" + bienvenido.iconImage = UIImage(systemName: "hand.wave") + bienvenido.detailText = "Bienvenido a la sección de tareas activas. Aquí encontrarás diversas actividades que podrás realizar para obtener información sobre algunos aspectos de tu salud." + + //Motor Activities + let tappingStep = ORKTappingIntervalStep(identifier: "tapping") + tappingStep.title = "Prueba de tapping" + tappingStep.detailText = "Toca repetidamente en las áreas designadas lo más rápido posible durante 10 segundos." + tappingStep.stepDuration = 10 // Duración en segundos + + + //Cognition + // Cognition - Trail Making (Solo números) + let trailMakingStep = ORKTrailmakingStep(identifier: "trail") + trailMakingStep.title = "Prueba de Trail Making" + trailMakingStep.detailText = "En este ejercicio, tendrás que conectar los círculos numerados en orden, lo más rápido posible." + + + let hanoitext = ORKInstructionStep(identifier: "towerOfHanoiInstructions") + hanoitext.title = "Torre de Hanoi" + hanoitext.iconImage = UIImage(systemName: "triangle") + hanoitext.detailText = "Transfiere los discos de la barra inicial a la barra final, siguiendo estas reglas:\n\n1. Solo puedes mover un disco a la vez.\n\n2. No puedes colocar un disco grande encima de uno más pequeño." + + + let towerOfHanoiStep = ORKTowerOfHanoiStep(identifier: "towerOfHanoiStep") + towerOfHanoiStep.numberOfDisks = 3 + towerOfHanoiStep.isOptional = false + + let flowerPatternInstructionStep = ORKInstructionStep(identifier: "flowerPatternInstructions") + flowerPatternInstructionStep.title = "Patrón de las Flores" + flowerPatternInstructionStep.iconImage = UIImage(systemName: "flower.fill") + flowerPatternInstructionStep.detailText = """ + En esta tarea, verás un patrón formado por flores en una cuadrícula. Tu objetivo será recordar el orden en que aparecen y reproducirlo correctamente. + + 1. Observa el patrón de flores que aparece en la pantalla. + 2. Memoriza el orden y la posición de cada flor. + 3. Una vez que el patrón desaparezca, toca en las celdas de la cuadrícula para reproducir el orden que viste. + 4. Trata de ser lo más preciso posible. + """ + + + let memoryStep = ORKSpatialSpanMemoryStep(identifier: "memory") + memoryStep.initialSpan = 2 + memoryStep.minimumSpan = 2 + memoryStep.maximumSpan = 3 + memoryStep.playSpeed = 1 + memoryStep.maximumTests = 3 + memoryStep.maximumConsecutiveFailures = 10 // Asegúrate de que sea un número válido + + + // Audio Capture - Speech Recording Step + let speechRecognitionStep = ORKSpeechInNoiseStep(identifier: "speechRecognition") + speechRecognitionStep.title = "Prueba de Reconocimiento de Voz" + speechRecognitionStep.detailText = "Escucha el siguiente audio, después escribe lo que escuchaste." + + let speechText = ORKQuestionStep( + identifier: "textoAudio", + title: "Escribe lo que escuchaste en el audio", + answer: { + let formatoTexto = ORKTextAnswerFormat(maximumLength: 500) + formatoTexto.multipleLines = true // Permite que el cuadro sea más grande + return formatoTexto + }() + ) + speechText.isOptional = false + + + //Hearing + let toneStep = ORKToneAudiometryStep(identifier: "toneAudiometry") + toneStep.toneDuration = 10 + toneStep.title = "Prueba de Audiometría de Tono" + toneStep.detailText = "En este ejercicio escucharás tonos a diferentes frecuencias y volúmenes. Por favor, indica cuándo puedas escuchar el tono y por cuál oido lo escuhas. El objetivo es evaluar tu capacidad auditiva." + + + //Hand Dexterity + let handStep = ORKHolePegTestPlaceStep(identifier: "hole") + handStep.title = "Prueba de Destreza Manual" + handStep.detailText = "En este ejercicio, debes insertar los pegs (barras) en los agujeros lo más rápido posible. Trata de ser preciso y rápido, y asegúrate de no dejar caer ninguna pieza." + handStep.numberOfPegs = 9 + handStep.stepDuration = 30 + + let visionInstructionStep = ORKInstructionStep(identifier: "amslerGridInstructions") + visionInstructionStep.title = "Rejilla de Amsler" + visionInstructionStep.iconImage = UIImage(systemName: "eye.fill") + visionInstructionStep.detailText = """ + En esta prueba, observa la rejilla de Amsler en la pantalla y responde a las preguntas a continuación. + + 1. Asegúrate de estar en un lugar cómodo y con buena iluminación. + 2. Si usas gafas, póntelas antes de comenzar. + 3. Mira la rejilla con ambos ojos, pero si es necesario, cierra un ojo a la vez. + 4. Indica si ves alguna distorsión, línea torcida o áreas vacías. + 5. cuando indiques sobre que areas hay distorsión, da swipe sobre la pantalla negra haceia la derecha. + """ + + // Vision - Amsler Grid + let visionStep = ORKAmslerGridStep(identifier: "vision") + visionStep.stepDuration = 30 + visionStep.title = "Prueba de la Rejilla de Amsler" + visionStep.detailText = "Este test se usa para detectar problemas visuales relacionados con la macula. Mira el centro de la rejilla y marca cualquier distorsión o área oscura que puedas ver en la cuadrícula." + + let completionStep = ORKCompletionStep(identifier: "taskCompletion") + completionStep.title = "¡Tareas Completadas!" + completionStep.iconImage = UIImage(systemName: "checkmark.circle.fill") + completionStep.detailText = """ + Has completado todas las tareas del estudio. ¡Gracias por tu participación! + + Recuerda que tu contribución es muy valiosa para esta investigación. + """ + + + return ORKOrderedTask(identifier: "activeTasks", steps: [bienvenido, tappingStep, trailMakingStep, hanoitext, towerOfHanoiStep, flowerPatternInstructionStep, memoryStep, speechRecognitionStep, speechText, toneStep, handStep, visionInstructionStep, visionStep, completionStep]) + } + } + +``` + +Unicamente quedaría correr el programa y observar las distintas etapas desarrolladas, en caso de querer agregar o quitar es necesario cambiar el formato, además de agregar condicionales, o algunas cararcteristicas más a nuestras actividades. + +Algunas imagenes de como se vería corriendo el simulador son las siguientes: + +![](imagenes/simu1.png) +![](imagenes/simu1.png) +![](imagenes/simu1.png) +![](imagenes/simu1.png) +![](imagenes/simu1.png) +![](imagenes/simu1.png) +![](imagenes/simu1.png) + +Así es como termina la introducción base a ResearchKit y las herramientas más importantes, sin embargo, esto está a tu creatividad y necesidad, puedes hacer test super grandes, formularios específicos, agregar imagenes a las preguntas, una infinidad de usos, es además que es multi variado, ya que este puede funcionar con frameworks como HealthKit y CareKit, y no solo podemos quedar hasta ahí, si no que todas las respuestas puedes ubirse a una base de datos, generar un CSV, JASON y más que nos ayudaran al procesamiento de los datos. + + diff --git a/RK-Journals/RK-Journals.xcodeproj/project.pbxproj b/RK-Journals/RK-Journals.xcodeproj/project.pbxproj index 6f93374..72f3e64 100644 --- a/RK-Journals/RK-Journals.xcodeproj/project.pbxproj +++ b/RK-Journals/RK-Journals.xcodeproj/project.pbxproj @@ -7,32 +7,32 @@ objects = { /* Begin PBXBuildFile section */ - F59EA2C72CEEC25C00E6EF4C /* ResearchKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F59EA2BE2CEEC24A00E6EF4C /* ResearchKit.framework */; }; - F59EA2C82CEEC25C00E6EF4C /* ResearchKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F59EA2BE2CEEC24A00E6EF4C /* ResearchKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - F59EA2C92CEEC25C00E6EF4C /* ResearchKitActiveTask.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F59EA2C42CEEC24A00E6EF4C /* ResearchKitActiveTask.framework */; }; - F59EA2CA2CEEC25C00E6EF4C /* ResearchKitActiveTask.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F59EA2C42CEEC24A00E6EF4C /* ResearchKitActiveTask.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - F59EA2CB2CEEC25C00E6EF4C /* ResearchKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F59EA2C22CEEC24A00E6EF4C /* ResearchKitUI.framework */; }; - F59EA2CC2CEEC25C00E6EF4C /* ResearchKitUI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F59EA2C22CEEC24A00E6EF4C /* ResearchKitUI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 8EE55B902CEFDC0F00389B25 /* ResearchKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8EE55B892CEFDC0200389B25 /* ResearchKit.framework */; }; + 8EE55B912CEFDC0F00389B25 /* ResearchKit.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8EE55B892CEFDC0200389B25 /* ResearchKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 8EE55B922CEFDC0F00389B25 /* ResearchKitActiveTask.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8EE55B8F2CEFDC0200389B25 /* ResearchKitActiveTask.framework */; }; + 8EE55B932CEFDC0F00389B25 /* ResearchKitActiveTask.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8EE55B8F2CEFDC0200389B25 /* ResearchKitActiveTask.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 8EE55B942CEFDC0F00389B25 /* ResearchKitUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8EE55B8D2CEFDC0200389B25 /* ResearchKitUI.framework */; }; + 8EE55B952CEFDC0F00389B25 /* ResearchKitUI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8EE55B8D2CEFDC0200389B25 /* ResearchKitUI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - F59EA2BD2CEEC24A00E6EF4C /* PBXContainerItemProxy */ = { + 8EE55B882CEFDC0200389B25 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = F59EA2B32CEEC24A00E6EF4C /* ResearchKit.xcodeproj */; + containerPortal = 8EE55B7E2CEFDC0200389B25 /* ResearchKit.xcodeproj */; proxyType = 2; remoteGlobalIDString = B183A5951A8535D100C76870; remoteInfo = ResearchKit; }; - F59EA2C12CEEC24A00E6EF4C /* PBXContainerItemProxy */ = { + 8EE55B8C2CEFDC0200389B25 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = F59EA2B32CEEC24A00E6EF4C /* ResearchKit.xcodeproj */; + containerPortal = 8EE55B7E2CEFDC0200389B25 /* ResearchKit.xcodeproj */; proxyType = 2; remoteGlobalIDString = CA1C7A5A288B0C68004DAB3A; remoteInfo = ResearchKitUI; }; - F59EA2C32CEEC24A00E6EF4C /* PBXContainerItemProxy */ = { + 8EE55B8E2CEFDC0200389B25 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = F59EA2B32CEEC24A00E6EF4C /* ResearchKit.xcodeproj */; + containerPortal = 8EE55B7E2CEFDC0200389B25 /* ResearchKit.xcodeproj */; proxyType = 2; remoteGlobalIDString = CAD08967289DD747007B2A98; remoteInfo = ResearchKitActiveTask; @@ -46,9 +46,9 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - F59EA2CC2CEEC25C00E6EF4C /* ResearchKitUI.framework in Embed Frameworks */, - F59EA2C82CEEC25C00E6EF4C /* ResearchKit.framework in Embed Frameworks */, - F59EA2CA2CEEC25C00E6EF4C /* ResearchKitActiveTask.framework in Embed Frameworks */, + 8EE55B952CEFDC0F00389B25 /* ResearchKitUI.framework in Embed Frameworks */, + 8EE55B912CEFDC0F00389B25 /* ResearchKit.framework in Embed Frameworks */, + 8EE55B932CEFDC0F00389B25 /* ResearchKitActiveTask.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -56,7 +56,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - F59EA2B32CEEC24A00E6EF4C /* ResearchKit.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ResearchKit.xcodeproj; path = "/Users/juandavidlopezregalado/Downloads/ResearchKit-main-3/ResearchKit.xcodeproj"; sourceTree = ""; }; + 8EE55B7E2CEFDC0200389B25 /* ResearchKit.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ResearchKit.xcodeproj; path = "/Users/JD2207/Downloads/ResearchKit-main/ResearchKit.xcodeproj"; sourceTree = ""; }; F5DB42F02CDD93D100121599 /* RK-Journals.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "RK-Journals.app"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -86,9 +86,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - F59EA2CB2CEEC25C00E6EF4C /* ResearchKitUI.framework in Frameworks */, - F59EA2C72CEEC25C00E6EF4C /* ResearchKit.framework in Frameworks */, - F59EA2C92CEEC25C00E6EF4C /* ResearchKitActiveTask.framework in Frameworks */, + 8EE55B942CEFDC0F00389B25 /* ResearchKitUI.framework in Frameworks */, + 8EE55B902CEFDC0F00389B25 /* ResearchKit.framework in Frameworks */, + 8EE55B922CEFDC0F00389B25 /* ResearchKitActiveTask.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -102,12 +102,12 @@ name = Frameworks; sourceTree = ""; }; - F59EA2B62CEEC24A00E6EF4C /* Products */ = { + 8EE55B812CEFDC0200389B25 /* Products */ = { isa = PBXGroup; children = ( - F59EA2BE2CEEC24A00E6EF4C /* ResearchKit.framework */, - F59EA2C22CEEC24A00E6EF4C /* ResearchKitUI.framework */, - F59EA2C42CEEC24A00E6EF4C /* ResearchKitActiveTask.framework */, + 8EE55B892CEFDC0200389B25 /* ResearchKit.framework */, + 8EE55B8D2CEFDC0200389B25 /* ResearchKitUI.framework */, + 8EE55B8F2CEFDC0200389B25 /* ResearchKitActiveTask.framework */, ); name = Products; sourceTree = ""; @@ -115,7 +115,7 @@ F5DB42E72CDD93D100121599 = { isa = PBXGroup; children = ( - F59EA2B32CEEC24A00E6EF4C /* ResearchKit.xcodeproj */, + 8EE55B7E2CEFDC0200389B25 /* ResearchKit.xcodeproj */, F5DB42F22CDD93D100121599 /* RK-Journals */, 8E66ED762CE2605300A8F5D1 /* Frameworks */, F5DB42F12CDD93D100121599 /* Products */, @@ -185,8 +185,8 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = F59EA2B62CEEC24A00E6EF4C /* Products */; - ProjectRef = F59EA2B32CEEC24A00E6EF4C /* ResearchKit.xcodeproj */; + ProductGroup = 8EE55B812CEFDC0200389B25 /* Products */; + ProjectRef = 8EE55B7E2CEFDC0200389B25 /* ResearchKit.xcodeproj */; }, ); projectRoot = ""; @@ -197,25 +197,25 @@ /* End PBXProject section */ /* Begin PBXReferenceProxy section */ - F59EA2BE2CEEC24A00E6EF4C /* ResearchKit.framework */ = { + 8EE55B892CEFDC0200389B25 /* ResearchKit.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; path = ResearchKit.framework; - remoteRef = F59EA2BD2CEEC24A00E6EF4C /* PBXContainerItemProxy */; + remoteRef = 8EE55B882CEFDC0200389B25 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - F59EA2C22CEEC24A00E6EF4C /* ResearchKitUI.framework */ = { + 8EE55B8D2CEFDC0200389B25 /* ResearchKitUI.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; path = ResearchKitUI.framework; - remoteRef = F59EA2C12CEEC24A00E6EF4C /* PBXContainerItemProxy */; + remoteRef = 8EE55B8C2CEFDC0200389B25 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - F59EA2C42CEEC24A00E6EF4C /* ResearchKitActiveTask.framework */ = { + 8EE55B8F2CEFDC0200389B25 /* ResearchKitActiveTask.framework */ = { isa = PBXReferenceProxy; fileType = wrapper.framework; path = ResearchKitActiveTask.framework; - remoteRef = F59EA2C32CEEC24A00E6EF4C /* PBXContainerItemProxy */; + remoteRef = 8EE55B8E2CEFDC0200389B25 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ diff --git a/RK-Journals/RK-Journals.xcodeproj/project.xcworkspace/xcuserdata/JD2207.xcuserdatad/UserInterfaceState.xcuserstate b/RK-Journals/RK-Journals.xcodeproj/project.xcworkspace/xcuserdata/JD2207.xcuserdatad/UserInterfaceState.xcuserstate index 76db185..e7b1e09 100644 Binary files a/RK-Journals/RK-Journals.xcodeproj/project.xcworkspace/xcuserdata/JD2207.xcuserdatad/UserInterfaceState.xcuserstate and b/RK-Journals/RK-Journals.xcodeproj/project.xcworkspace/xcuserdata/JD2207.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/RK-Journals/RK-Journals.xcodeproj/xcuserdata/JD2207.xcuserdatad/xcschemes/xcschememanagement.plist b/RK-Journals/RK-Journals.xcodeproj/xcuserdata/JD2207.xcuserdatad/xcschemes/xcschememanagement.plist index b4df92d..6c387e3 100644 --- a/RK-Journals/RK-Journals.xcodeproj/xcuserdata/JD2207.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/RK-Journals/RK-Journals.xcodeproj/xcuserdata/JD2207.xcuserdatad/xcschemes/xcschememanagement.plist @@ -7,7 +7,7 @@ RK-Journals.xcscheme_^#shared#^_ orderHint - 5 + 0 diff --git a/RK-Journals/RK-Journals/ActiveTaskManager.swift b/RK-Journals/RK-Journals/ActiveTaskManager.swift index e8fb611..8b00cf1 100644 --- a/RK-Journals/RK-Journals/ActiveTaskManager.swift +++ b/RK-Journals/RK-Journals/ActiveTaskManager.swift @@ -17,33 +17,117 @@ class ActiveTaskManager { func createActiveTasks() -> ORKOrderedTask { + let bienvenido = ORKInstructionStep(identifier: "bienvenido") + bienvenido.title = "Bienvenido" + bienvenido.iconImage = UIImage(systemName: "hand.wave") + bienvenido.detailText = "Bienvenido a la sección de tareas activas. Aquí encontrarás diversas actividades que podrás realizar para obtener información sobre algunos aspectos de tu salud." + + //Motor Activities + let tappingStep = ORKTappingIntervalStep(identifier: "tapping") + tappingStep.title = "Prueba de tapping" + tappingStep.detailText = "Toca repetidamente en las áreas designadas lo más rápido posible durante 10 segundos." + tappingStep.stepDuration = 10 // Duración en segundos + + + //Cognition + // Cognition - Trail Making (Solo números) + let trailMakingStep = ORKTrailmakingStep(identifier: "trail") + trailMakingStep.title = "Prueba de Trail Making" + trailMakingStep.detailText = "En este ejercicio, tendrás que conectar los círculos numerados en orden, lo más rápido posible." + + let hanoitext = ORKInstructionStep(identifier: "towerOfHanoiInstructions") hanoitext.title = "Torre de Hanoi" hanoitext.iconImage = UIImage(systemName: "triangle") hanoitext.detailText = "Transfiere los discos de la barra inicial a la barra final, siguiendo estas reglas:\n\n1. Solo puedes mover un disco a la vez.\n\n2. No puedes colocar un disco grande encima de uno más pequeño." - - + let towerOfHanoiStep = ORKTowerOfHanoiStep(identifier: "towerOfHanoiStep") towerOfHanoiStep.numberOfDisks = 3 - - let trailMakingStep = ORKTrailmakingStep(identifier: "trail") + towerOfHanoiStep.isOptional = false + + let flowerPatternInstructionStep = ORKInstructionStep(identifier: "flowerPatternInstructions") + flowerPatternInstructionStep.title = "Patrón de las Flores" + flowerPatternInstructionStep.iconImage = UIImage(systemName: "flower.fill") + flowerPatternInstructionStep.detailText = """ + En esta tarea, verás un patrón formado por flores en una cuadrícula. Tu objetivo será recordar el orden en que aparecen y reproducirlo correctamente. + 1. Observa el patrón de flores que aparece en la pantalla. + 2. Memoriza el orden y la posición de cada flor. + 3. Una vez que el patrón desaparezca, toca en las celdas de la cuadrícula para reproducir el orden que viste. + 4. Trata de ser lo más preciso posible. + """ + + let memoryStep = ORKSpatialSpanMemoryStep(identifier: "memory") - memoryStep.title = "Memoria Visual" - memoryStep.text = "Recuerda el patrón que aparece en la pantalla." memoryStep.initialSpan = 2 memoryStep.minimumSpan = 2 - memoryStep.maximumSpan = 5 + memoryStep.maximumSpan = 3 memoryStep.playSpeed = 1 - memoryStep.maximumTests = 5 - memoryStep.maximumConsecutiveFailures = 1 + memoryStep.maximumTests = 3 + memoryStep.maximumConsecutiveFailures = 10 // Asegúrate de que sea un número válido + - let tappingStep = ORKTappingIntervalStep(identifier: "tapping") - tappingStep.title = "Prueba de tapping" - tappingStep.text = "Toca repetidamente en las áreas designadas lo más rápido posible durante 10 segundos." - tappingStep.stepDuration = 10 // Duración en segundos + // Audio Capture - Speech Recording Step + let speechRecognitionStep = ORKSpeechInNoiseStep(identifier: "speechRecognition") + speechRecognitionStep.title = "Prueba de Reconocimiento de Voz" + speechRecognitionStep.detailText = "Escucha el siguiente audio, después escribe lo que escuchaste." + + let speechText = ORKQuestionStep( + identifier: "textoAudio", + title: "Escribe lo que escuchaste en el audio", + answer: { + let formatoTexto = ORKTextAnswerFormat(maximumLength: 500) + formatoTexto.multipleLines = true // Permite que el cuadro sea más grande + return formatoTexto + }() + ) + speechText.isOptional = false + + + //Hearing + let toneStep = ORKToneAudiometryStep(identifier: "toneAudiometry") + toneStep.toneDuration = 10 + toneStep.title = "Prueba de Audiometría de Tono" + toneStep.detailText = "En este ejercicio escucharás tonos a diferentes frecuencias y volúmenes. Por favor, indica cuándo puedas escuchar el tono y por cuál oido lo escuhas. El objetivo es evaluar tu capacidad auditiva." + + + //Hand Dexterity + let handStep = ORKHolePegTestPlaceStep(identifier: "hole") + handStep.title = "Prueba de Destreza Manual" + handStep.detailText = "En este ejercicio, debes insertar los pegs (barras) en los agujeros lo más rápido posible. Trata de ser preciso y rápido, y asegúrate de no dejar caer ninguna pieza." + handStep.numberOfPegs = 9 + handStep.stepDuration = 30 + + let visionInstructionStep = ORKInstructionStep(identifier: "amslerGridInstructions") + visionInstructionStep.title = "Rejilla de Amsler" + visionInstructionStep.iconImage = UIImage(systemName: "eye.fill") + visionInstructionStep.detailText = """ + En esta prueba, observa la rejilla de Amsler en la pantalla y responde a las preguntas a continuación. + + 1. Asegúrate de estar en un lugar cómodo y con buena iluminación. + 2. Si usas gafas, póntelas antes de comenzar. + 3. Mira la rejilla con ambos ojos, pero si es necesario, cierra un ojo a la vez. + 4. Indica si ves alguna distorsión, línea torcida o áreas vacías. + 5. cuando indiques sobre que areas hay distorsión, da swipe sobre la pantalla negra haceia la derecha. + """ + + // Vision - Amsler Grid + let visionStep = ORKAmslerGridStep(identifier: "vision") + visionStep.stepDuration = 30 + visionStep.title = "Prueba de la Rejilla de Amsler" + visionStep.detailText = "Este test se usa para detectar problemas visuales relacionados con la macula. Mira el centro de la rejilla y marca cualquier distorsión o área oscura que puedas ver en la cuadrícula." + + let completionStep = ORKCompletionStep(identifier: "taskCompletion") + completionStep.title = "¡Tareas Completadas!" + completionStep.iconImage = UIImage(systemName: "checkmark.circle.fill") + completionStep.detailText = """ + Has completado todas las tareas del estudio. ¡Gracias por tu participación! + + Recuerda que tu contribución es muy valiosa para esta investigación. + """ + - return ORKOrderedTask(identifier: "activeTasks", steps: [hanoitext, towerOfHanoiStep]) + return ORKOrderedTask(identifier: "activeTasks", steps: [bienvenido, tappingStep, trailMakingStep, hanoitext, towerOfHanoiStep, flowerPatternInstructionStep, memoryStep, speechRecognitionStep, speechText, toneStep, handStep, visionInstructionStep, visionStep, completionStep]) } } diff --git a/imagenes/simu1.png b/imagenes/simu1.png new file mode 100644 index 0000000..f4ff01c Binary files /dev/null and b/imagenes/simu1.png differ diff --git a/imagenes/simu2.png b/imagenes/simu2.png new file mode 100644 index 0000000..e6680c6 Binary files /dev/null and b/imagenes/simu2.png differ diff --git a/imagenes/simu3.png b/imagenes/simu3.png new file mode 100644 index 0000000..7e2e02a Binary files /dev/null and b/imagenes/simu3.png differ diff --git a/imagenes/simu4.png b/imagenes/simu4.png new file mode 100644 index 0000000..411ebae Binary files /dev/null and b/imagenes/simu4.png differ diff --git a/imagenes/simu5.png b/imagenes/simu5.png new file mode 100644 index 0000000..7c9aa66 Binary files /dev/null and b/imagenes/simu5.png differ diff --git a/imagenes/simu6.png b/imagenes/simu6.png new file mode 100644 index 0000000..834147b Binary files /dev/null and b/imagenes/simu6.png differ diff --git a/imagenes/simu7.png b/imagenes/simu7.png new file mode 100644 index 0000000..4399c4c Binary files /dev/null and b/imagenes/simu7.png differ diff --git a/imagenes/simu8.png b/imagenes/simu8.png new file mode 100644 index 0000000..f126cca Binary files /dev/null and b/imagenes/simu8.png differ