#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 olor%
        (let ((tipo_olor (send estimulo 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)))
(define olfato6
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa))); agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato7
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa))); agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato8
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa))); agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato9
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa))); agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato10
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa))); agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato11
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa))); agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato12
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa))); agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato13
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato14
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato15
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato16
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato17
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato18
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato19
  (make-object olfato%
    (list agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa agrupacion_olfativa)))
(define olfato20
  (make-object olfato%
    (list 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 agrupacion_tactil agrupacion_tactil))); agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto2
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil))); agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto3
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil))); agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto4
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil))); agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto5
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil))); agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto6
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil))); agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto7
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil))); agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto8
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil))); agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto9
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil))); agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto10
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil))); agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto11
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil))); agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto12
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil))); agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto13
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto14
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto15
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto16
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto17
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto18
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto19
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
(define tacto20
  (make-object tacto%
    (list agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil agrupacion_tactil)))
;;;;;;;;
(provide olfato1  olfato2  olfato3  olfato4  olfato5  olfato6  olfato7  olfato8  olfato9  olfato10  olfato11  olfato12
           olfato13  olfato14  olfato15  olfato16  olfato17  olfato18  olfato19  olfato20
         tacto1 tacto2 tacto3 tacto4 tacto5 tacto6 tacto7 tacto8 tacto9 tacto10 tacto11 tacto12
          tacto13 tacto14 tacto15 tacto16 tacto17 tacto18 tacto19 tacto20)

;;;;;;;;;;;;;;;;;;
;(require "Objetos.rkt")
;;;;
;(send olfato proceso! (list blanco azul blanco))
;(send olfato proceso! (list rojo marron negro)) 
;(send olfato 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 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 tacto proceso! (list verde marron verde))
;(newline)
;;(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
;)