#lang racket

;;;;;;SENSOR OLFATIVO
(define sensor-olfativo%
  (class object%
    (init-field
     (tipo 0);sustancia inodora
     )
    (field
     (estado 0)
     )
    (define/public proceso!
      (lambda (estimulo); 1 objeto clase elemento%
        (let* ((obj-olfativo (send estimulo get-olor))
               (tipo_olor (send obj-olfativo get-tipo))
               )
          (set! 
           estado
           (if (equal? tipo_olor tipo)
               1
               0)
           )
          estado
          )
        ))
    (super-new)
    ))
;;;;;GRUPO DE SENSORES
(define grupo_sensores_olfativos%
  (class object%
    (init-field
     (lista-neuronas '())
     )
    (field
     (salida '())
     )
    (define aux_proceso
      (lambda (neuronas e1)
        (if (null? neuronas)
            '()
            (cons
             (send (first neuronas) proceso! e1)
             (aux_proceso (rest neuronas) e1))
            )
        ))
    (define/public proceso!
      (lambda (un_estimulo)
        (set! 
         salida
         (aux_proceso 
          lista-neuronas 
          un_estimulo))
        salida
        ))
    (super-new)
    ))
;;;;;
(define agrupacion_olfativa
  (make-object grupo_sensores_olfativos%
    (list
     (make-object sensor-olfativo% 0);inodora
     (make-object sensor-olfativo% 1);feromonas
     (make-object sensor-olfativo% 2);comida/verde
     (make-object sensor-olfativo% 3);comida/amarillo
     (make-object sensor-olfativo% 4);olor hormiga
     (make-object sensor-olfativo% 5);olor otro autómata
     (make-object sensor-olfativo% 6);olor azul y marrón
     )
    ))
;;;;;EL OLFATO
(define olfato%
  (class object%
    (init-field
     (lista-grupos '())
     )
    (field
     (salida '())
     )
    (define aux_proceso
      (lambda (grupos estimulos)
        (if (null? grupos)
            '()
            (cons;append
             (send (first grupos) proceso! (first estimulos))
             (aux_proceso (rest grupos) (rest estimulos)))
            )
        ))
    (define/public proceso!
      (lambda (estimulos)
          (set! 
           salida
           (aux_proceso 
            lista-grupos 
            estimulos))
          salida
        ))
    (super-new)
    ))
;;;;;;
(define olfato1
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato2
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato3
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato4
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato5
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
;;;;;;;;
;;;;;;SENSOR TACTIL
(define sensor-tactil%
  (class object%
    (init-field
     (tipo 0);sustancia inodora
     )
    (field
     (estado 0)
     )
    (define/public proceso!
      (lambda (estimulo); 1 objeto clase elemento%
        (let ((obj (send estimulo get-dureza))
              )
          (set! 
           estado
           (if (equal? obj tipo)
               1
               0)
           )
          estado
          )
        ))
    (super-new)
    ))
;;;;;GRUPO DE SENSORES
(define grupo_sensores_tactiles%
  (class object%
    (init-field
     (lista-neuronas '())
     )
    (field
     (salida '())
     )
    (define aux_proceso
      (lambda (neuronas e1)
        (if (null? neuronas)
            '()
            (cons
             (send (first neuronas) proceso! e1)
             (aux_proceso (rest neuronas) e1))
            )
        ))
    (define/public proceso!
      (lambda (un_estimulo)
        (set! 
         salida
         (aux_proceso 
          lista-neuronas 
          un_estimulo))
        salida
        ))
    (super-new)
    ))
;;;;;
(define agrupacion_tactil
  (make-object grupo_sensores_tactiles%
    (list
     (make-object sensor-tactil% 5);rojo
     (make-object sensor-tactil% 2);verde
     (make-object sensor-tactil% 7);azul
     (make-object sensor-tactil% 0);blanco
     (make-object sensor-tactil% 6);negro
     (make-object sensor-tactil% 3);amarillo
     (make-object sensor-tactil% 8);marrón
     )
    ))
;;;;;
;;;;;EL TACTO
(define tacto%
  (class object%
    (init-field
     (lista-grupos '())
     )
    (field
     (salida '())
     )
    (define aux_proceso
      (lambda (grupos estimulos)
        (if (null? grupos)
            '()
            (cons;append
             (send (first grupos) proceso! (first estimulos))
             (aux_proceso (rest grupos) (rest estimulos)))
            )
        ))
    (define/public proceso!
      (lambda (estimulos)
          (set! 
           salida
           (aux_proceso 
            lista-grupos 
            estimulos))
          salida
        ))
    (super-new)
    ))
;;;;;;
(define tacto1
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto2
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto3
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto4
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto5
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
;;;;;;;;;;;;;;;;;RETINA;;;;;;;;;;;;;;;;;;;;;;;
;;;;;FOTORRECEPTORES
(define fotorreceptor%
  (class object%
    (init-field
     (tipo '(255 0 0 1.0));sensible al rojo
     )
    (field
     (estado 0)
     )
    (define/public proceso!
      (lambda (estimulo); 1 objeto clase elemento%
        (let ((estimulo-rgb (send estimulo get-rgb))
              )
          (set! 
           estado
           (if (equal? estimulo-rgb tipo)
               1
               0)
           )
          estado
          )
        ))
    (super-new) 
    ))
;;;;;GRUPO DE FOTORRECEPTORES
(define grupo_fotorreceptores%
  (class object%
    (init-field
     (lista-neuronas '())
     )
    (field
     (salida '())
     )
    (define aux_proceso
      (lambda (neuronas e1)
        (if (null? neuronas)
            '()
            (cons
             (send (first neuronas) proceso! e1)
             (aux_proceso (rest neuronas) e1))
            )
        ))
    (define/public proceso!
      (lambda (e1)
        (set! 
         salida
         (aux_proceso 
          lista-neuronas 
          e1))
        salida
        ))
    (super-new)
    ))
;;;;;LA RETINA
(define retina%
  (class object%
    (init-field
     (lista-grupos '())
     )
    (field
     (salida '())
     )
    (define aux_proceso
      (lambda (grupos estimulos)
        (if (null? grupos)
            '()
            (cons;append
             (send (first grupos) proceso! (first estimulos))
             (aux_proceso (rest grupos) (rest estimulos)))
            )
        ))
    (define/public proceso!
      (lambda (estimulos)
          (set! 
           salida
           (aux_proceso 
            lista-grupos 
            estimulos))
          salida
        ))
    (super-new)
    ))
    
;;;;UNA RETINA
(define agrupacion_retina
  (make-object grupo_fotorreceptores%
    (list
     (make-object fotorreceptor% '(255 0 0 1.0));rojo
     (make-object fotorreceptor% '(0 255 0 1.0));verde
     (make-object fotorreceptor% '(0 0 255 1.0));azul
     (make-object fotorreceptor% '(255 255 255 1.0));blanco
     (make-object fotorreceptor% '(0 0 0 1.0));negro
     (make-object fotorreceptor% '(255 255 0 1.0));amarillo
     (make-object fotorreceptor% '(132 60 36 1.0));marrón
     )
    ))
(define retina1 
  (make-object retina%
    (list agrupacion_retina agrupacion_retina agrupacion_retina)))
(define retina2 
  (make-object retina%
    (list agrupacion_retina agrupacion_retina agrupacion_retina)))
(define retina3 
  (make-object retina%
    (list agrupacion_retina agrupacion_retina agrupacion_retina)))
(define retina4 
  (make-object retina%
    (list agrupacion_retina agrupacion_retina agrupacion_retina)))
(define retina5 
  (make-object retina%
    (list agrupacion_retina agrupacion_retina agrupacion_retina)))
;;;;;;;;
;;;;;;;;
(provide olfato1  olfato2  olfato3  olfato4  olfato5
         tacto1 tacto2 tacto3 tacto4 tacto5
         retina1 retina2 retina3 retina4 retina5)

;;;;;;;;;;;;;;;;;;
;(require "Objetos.rkt")
;;;;;
;(send olfato1 proceso! (list rojo verde azul blanco negro amarillo marron rojo))
;;(send olfato2 proceso! (list rojo marron negro)) 
;;(send olfato3 proceso! (list rojo verde amarillo))
;;;(send tacto proceso! (list blanco rojo verde))
;;;;(newline)
;;(send tacto proceso! (list rojo verde azul blanco negro amarillo marron rojo))
;(send blanco set-olor olor1)
;(send olfato1 proceso! (list rojo verde azul blanco negro amarillo marron rojo))
;;(send olfato proceso! (list rojo verde azul blanco negro amarillo marron rojo))
;(newline)
;;;(send olfato proceso! (list verde verde verde blanco blanco blanco azul azul))
;(send tacto1 proceso! (list verde marron verde))
;(send tacto2 proceso! (list rojo azul verde))
;(send tacto3 proceso! (list blanco negro amarillo))
;(newline)
;(send retina1 proceso! (list verde marron verde))
;(send retina2 proceso! (list rojo azul verde))
;(send retina3 proceso! (list blanco negro amarillo))
;;;(send olfato proceso! (list azul azul azul blanco blanco blanco verde verde))
;;(send tacto proceso! (list azul azul azul))
;;(newline)
;;(send olfato proceso! (list negro negro negro blanco blanco blanco verde verde))
;(send tacto proceso! (list negro amarillo negro))
;;'((0 0 0 0 1 0) (0 0 0 0 0 1) (0 0 0 0 1 0))
;;                           -amarillo
;(list
; '(1 0 0 0 0 0 0);blanco inodoro
; '(0 1 0 0 0 0 0);blanco+feromona 
; '(0 0 1 0 0 0 0);verde
; '(0 0 0 1 0 0 0);amarillo
; '(0 0 0 0 1 0 0);negro 
; '(0 0 0 0 0 1 0);rojo
; '(0 0 0 0 0 0 1);azul y marrón
;)