#lang racket

;;;;;;SENSOR OLFATIVO
(define quimiorreceptor%
  (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));get-al_olfato))
               (olor_intensidad (send obj-olfativo get-olor))
               (tipo_olor (car olor_intensidad))
               (intensidad (cdr olor_intensidad))
               )
          (set! 
           estado
           (if (and (equal? tipo_olor tipo) (> intensidad 0))
               1
               0)
           )
          estado
          )
        ))
    (super-new)
    ))
;;;;;GRUPO DE SENSORES
(define grupo_quimiorreceptores%
  (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_quimiorreceptores%
    (list
     (make-object quimiorreceptor% 0);inodora
     (make-object quimiorreceptor% 1);feromonas
     (make-object quimiorreceptor% 2);comida/verde
     (make-object quimiorreceptor% 3);
     (make-object quimiorreceptor% 4);
     )
    ))
;;;;;
;;;;;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 olfato
  (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% 10);negro
     )
    ))
;;;;;
;;;;;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 tacto
  (make-object olfato%
    (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
     )
    ))
(define retina 
  (make-object retina%
    (list agrupacion_retina agrupacion_retina agrupacion_retina)))
;;;;;;;;
(provide olfato tacto retina)

