#lang racket

(define tabla-tacto
  '(
    ((2 2 2) (2 0 0))
    ((2 2 _) (2 0 0))
    ((2 _ 2) (2 0 0))
    ((2 _ _) (2 0 0))
    ((_ 2 2) (0 2 0))
    ((_ 2 _) (0 2 0))
    ((_ _ 2) (0 0 2))

    ((1 1 1) (1 0 0))
    ((1 1 _) (1 0 0))
    ((1 _ 1) (1 0 0))
    ((1 _ _) (1 0 0))
    ((_ 1 1) (0 1 0))
    ((_ 1 _) (0 1 0))
    ((_ _ 1) (0 0 1))
    ((-1 -1 -1) (0 0 0)))
  )
(define tabla-vista
  '(((1 1 1) (1 0 0)) 
    ((1 1 _) (1 0 0)) 
    ((1 _ 1) (1 0 0)) 
    ((1 _ _) (1 0 0)) 
    ((_ 1 1) (0 1 0)) 
    ((_ 1 _) (0 1 0)) 
    ((_ _ 1) (0 0 1)) 
    ((-1 -1 -1) (-1 -1 -1)))
  )
(define tabla-automata
  (list tabla-tacto tabla-vista))
;; CLASE AUTOMATA
(define automata%
  (class object%
    (init-field
     (tabla '(tabla))
     )
    (field
     (estado 0);;sensor de energia
     (respuesta 0)
     )
    
    (define/public proceso!
      (lambda (pre_orden_visual pre_orden_tactil energia)
        ;;cambio en el sensor: funcion de cambio de estado
        (set! estado
              (if (< energia 0)
                  1
                  0) )
        ;;prevalece tacto
        (if (= estado 1)
            (let ((table (first tabla))
                  )
              (set! respuesta
                    (orden table pre_orden_tactil))
                 )
            ;;prevalece visión
            (let ((table (second tabla))
                  )
              (set! respuesta
                    (orden table pre_orden_visual))
              )
            )
        (values
         estado
         respuesta)
        ))
    (define orden
      (lambda (tabl pre-orden)
        (if 
         (andmap
          (lambda (c o)
            (cond
              ((eq? c o) #t)
              ((eq? c '_) #t)
              (else #f)
              )
            )
          (first (car tabl))
          pre-orden)
         (second (car tabl))
         (orden (cdr tabl) pre-orden)
         )
        ))
    (super-new)
    ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define automata_frontal (make-object automata% tabla-automata))

(require "Red-discriminacion-vision.rkt")
(require "Red-discriminacion-tactoB.rkt")

(provide discriminacion_visual discriminacion_tactil automata_frontal)