Mindmentor_offline_app / tasks /shape_recall.py
jan01's picture
Upload 13 files
e5eed5b verified
import streamlit as st
import sqlite3
import random
import time
import json
def shape_recall(session_id):
st.subheader("🔷 Shape Recall Task")
# Load NCPT-style config for shape_recall
with open("data/ncpt_tasks.json", "r", encoding="utf-8") as f:
ncpt = json.load(f)
sr_config = next(task for task in ncpt if task["task"] == "shape_recall")
# Extract shapes and distractor from JSON
default_shapes = sr_config["stimuli"]
default_distractor = sr_config["distractor"]
# Step 1: Initialize
if "sr_stage" not in st.session_state:
st.session_state.sr_stage = "memorize"
st.session_state.sr_shapes = default_shapes
st.session_state.sr_start_time = None
st.session_state.sr_selected = None
st.session_state.sr_distractor = default_distractor
st.session_state.sr_options = default_shapes + [default_distractor]
random.shuffle(st.session_state.sr_options)
st.session_state.sr_result_displayed = False
# Step 2: Show shapes to memorize
if st.session_state.sr_stage == "memorize":
st.info("Memorize these shapes:")
st.markdown(" ".join(st.session_state.sr_shapes))
if st.button("I'm Ready"):
st.session_state.sr_stage = "recall"
st.session_state.sr_start_time = time.time()
st.rerun()
# Step 3: Recall stage
elif st.session_state.sr_stage == "recall":
st.warning("Which one of these shapes was NOT shown?")
st.session_state.sr_selected = st.radio("Choose:", st.session_state.sr_options, key="sr_radio")
if st.button("Submit") and not st.session_state.sr_result_displayed:
rt = round(time.time() - st.session_state.sr_start_time, 2)
score = 1 if st.session_state.sr_selected == st.session_state.sr_distractor else 0
# Save to DB
conn = sqlite3.connect("data/mindmentor.db")
conn.execute("INSERT INTO cognitive_logs (session_id, task_name, score, reaction_time) VALUES (?, ?, ?, ?)",
(session_id, "Shape Recall", score, rt))
conn.commit()
conn.close()
st.success(f"✅ Score: {score} | 🕒 Reaction Time: {rt} seconds")
st.session_state.sr_result_displayed = True
# Step 4: Retry option
if st.session_state.sr_result_displayed:
if st.button("Try Again"):
for key in list(st.session_state.keys()):
if key.startswith("sr_"):
del st.session_state[key]
st.rerun()