#lang racket/gui

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(require "Cortex-vision-art.rkt")
(require "Cortex-tacto-art.rkt")
(require "Cortex-olfato-art.rkt")
(require "Red-discriminacion-vision.rkt")
(require "Red-discriminacion-tacto.rkt")
(require "Red-analisis-olfato.rkt")
(require "Cortex-frontal.rkt")
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define control%
  (class object%
    (init-field
     (cortex_vision 'cortex_vision)
     (cortex_tacto 'cortex_tacto)
     (cortex_olfato 'cortex_olfato)
     (Orden_vision 'discriminacion_visual)
     (Discriminacion_tacto 'discriminacion_tactil)
     (Analisis_olfativo 'analisis_olfativo)
     (automata_frontal  'decision)
     )
    (field
     (orden_ensayada #f)
     )
    (define/public set-orden_ensayada
      (lambda (orden)
        (set! orden_ensayada orden)
        ))
    (define/public proceso!
      (lambda (output_retina output_tactil output_olfativo energia)
        (let*-values 
            (
             [(output_vision)
              (send cortex_vision proceso! output_retina)]
             [(output_tacto)
              (send cortex_tacto proceso! output_tactil)]
             [(output_olfato)
              (send cortex_olfato proceso! output_olfativo)]
             [(orden_visual)
              (send Orden_vision proceso! output_vision)]
             [(Discriminacion_tactil)
              (send Discriminacion_tacto proceso! output_tacto)]
             [(Analisis_olfato)
              (send Analisis_olfativo proceso! output_olfato)]
             [(orden) 
              (automata_frontal orden_visual Discriminacion_tactil Analisis_olfato energia)]
             )
;Si la orden anterior fue comer y la de ahora es avanzar, avanza a la posición del objeto comido
          (set! orden
                (if (and orden_ensayada (= (car orden) 0) (member 1 (cdr orden)))
                    (cons 0 orden_ensayada) 
                  orden))
          (set! orden_ensayada (if (and (= (car orden) 1) (member 1 (cdr orden))) (cdr orden) #f))
          orden
          )
        ))
    (super-new)
    ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define cerebro1 (make-object control% cortex_vision cortex_tacto cortex_olfato discriminacion_visual discriminacion_tactil analisis_olfativo decision))
(define cerebro2 (make-object control% cortex_vision cortex_tacto cortex_olfato discriminacion_visual discriminacion_tactil analisis_olfativo decision))
(define cerebro3 (make-object control% cortex_vision cortex_tacto cortex_olfato discriminacion_visual discriminacion_tactil analisis_olfativo decision))
(define cerebro4 (make-object control% cortex_vision cortex_tacto cortex_olfato discriminacion_visual discriminacion_tactil analisis_olfativo decision))
(define cerebro5 (make-object control% cortex_vision cortex_tacto cortex_olfato discriminacion_visual discriminacion_tactil analisis_olfativo decision))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(provide cerebro1 cerebro2 cerebro3 cerebro4 cerebro5)

