#lang racket

;;;;;;;;;;;;;;;;;TACTO;;;;;;;;;;;;;;;;;;;;;;;
;;Hay como una mano compuesta de tres sensores, uno para cada objeto
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define sensor-tactil%
  (class object%
    (field
     (sensor 'resistencia_obj)
     )
    (define/public toca!
      (lambda (obj)
        (set! sensor
              (exact->inexact (/ (send obj get-resistencia) 10)));atenuación
        ;sensor
        (list sensor)
        ))
    (super-new)
    ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define sensores-tactiles%
  (class object%
    (init-field
     (lista_sensores '())
     )
    (define/public proceso!
      (lambda (lista-obj)
        (let ((obj1 (first lista-obj))
              (obj2 (second lista-obj))
              (obj3 (third lista-obj))
              )
          (list
           (send (first lista_sensores) toca! obj1)
           (send (second lista_sensores) toca! obj2)
           (send (third lista_sensores) toca! obj3)
           )
          )
        ))
    (super-new)
    ))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define sensores_tacto 
  (make-object sensores-tactiles%
    (list
     (make-object sensor-tactil%)
     (make-object sensor-tactil%)
     (make-object sensor-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
  (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 agrupacion agrupacion)))

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(provide sensores_tacto retina)

