#include "Configuration.h"
#ifdef COLOR
  
#include "color.h"


float g_SF[3];     //从TCS3200输出信号的脉冲数转换为RGB标准值的RGB比例因子
int   g_count = 0;  // 计算与反射光强相对应TCS3200颜色传感器输出信号的脉冲数
// 数组用于存储在1s内TCS3200输出信号的脉冲数，它乘以RGB比例因子就是RGB标准值
int   g_array[3];
int   g_array1[3];  
int   g_flag = 0;   // 滤波器模式选择顺序标志
bool  g_flag1=0;//用来判断是否需要在次定义印脚的输出模式，如果等于1，就不用再定义了
static int interval=500;//静态变量来存放测试脉冲的时间，单位是毫秒
 

void TSC_Init()
{
  // 初始化TSC3200各控制引脚的输入输出模式
  //设置TCS3002D的内置振荡器方波频率与其输出信号频率的比例因子为2%
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(OUT, INPUT);
  pinMode(LED, OUTPUT);
  digitalWrite(S0, LOW); 
  digitalWrite(S1, HIGH);
}
 

void TSC_FilterColor(int Level01, int Level02)
{
  //选择滤波器模式，决定让红、绿、蓝，哪种光线通过滤波器
  if(Level01 != 0)
    Level01 = HIGH;
  if(Level02 != 0)
    Level02 = HIGH;
  digitalWrite(S2, Level01);
  digitalWrite(S3, Level02);
}
 

void TSC_Count()
{
  //中断函数，计算TCS3200输出信号的脉冲数
  g_count ++ ;
}
 

void TSC_Callback()
{
  //定时器中断函数，每指定时间中断后，把该时间内的红、绿、蓝三种光线通过滤波器时，
  //TCS3200输出信号脉冲个数分别存储到数组g_array[3]的相应元素变量中
  switch(g_flag)
  {
    case 1:

         SERIAL_PROTOCOLPGM("->Frequency R=");
         SERIAL_ECHOLN("");
         SERIAL_PROTOCOL(g_count);
         SERIAL_ECHOLN("");//打印1s内的红光通过滤波器时，TCS3200输出的脉冲个数
         g_array[0] = g_count;    //存储1s内的红光通过滤波器时，TCS3200输出的脉冲个数
         TSC_WB(HIGH, HIGH);  //选择让绿色光线通过滤波器的模式
         break;
    case 2:
  
         SERIAL_PROTOCOLPGM("->Frequency G=");
         SERIAL_ECHOLN("");
         SERIAL_PROTOCOL(g_count);
         SERIAL_ECHOLN("");//打印1s内的绿光通过滤波器时，TCS3200输出的脉冲个数
         g_array[1] = g_count;    //存储1s内的绿光通过滤波器时，TCS3200输出的脉冲个数
         TSC_WB(LOW, HIGH);  //选择让蓝色光线通过滤波器的模式
         break;
 
    case 3:

         SERIAL_PROTOCOLPGM("->Frequency B=");//打印1s内的蓝光通过滤波器时，TCS3200输出的脉冲个数
         SERIAL_ECHOLN("");
         SERIAL_PROTOCOL(g_count);
         SERIAL_ECHOLN("");
         SERIAL_PROTOCOLPGM("->WB End");
         SERIAL_ECHOLN("");
         g_array[2] = g_count;     //存储1s内的蓝光通过滤波器时，TCS3200输出的脉冲个数
         TSC_WB(HIGH, LOW);   //选择无滤波器的模式  
         break;
   default:
         g_count = 0;     //计数值清零
         break;
  }
}


void TSC_WB(int Level0, int Level1)    
{
  //设置反射光中红、绿、蓝三色光分别通过滤波器时如何处理数据的标志
  //设置通过滤波器的光线类型
  //该函数被TSC_Callback( )调用
  g_count = 0;   //计数值清零
  g_flag ++;     //输出信号计数标志
  TSC_FilterColor(Level0, Level1); //滤波器模式
  
  //设置输出信号脉冲计数时长，这里又加一个的原因是为了重新是计时器开始计时，来防止这一段中断程序的执行影响接受脉冲。
  FlexiTimer2::set(interval, TSC_Callback);
  FlexiTimer2::start();
}


void initial()
{
  g_flag = 0;//一定要加上这个，因为如果不加上这个，再次初始化就会不准。
  
  if(g_flag1==0){
  attachInterrupt(0, TSC_Count, RISING);
  TSC_Init();
  g_flag1=1;}//使用标志位来使不管运行多少次初始化，都只定义一次按键模式，放置未知错误出现

  
 //设置定时器1的中断，中断调用函数为TSC_Callback()

   SERIAL_PROTOCOLPGM("->WB Start");
   SERIAL_ECHOLN("");
   TSC_WB(LOW, LOW);   //选择让红色光线通过滤波器的模式
   
  
  digitalWrite(LED, HIGH);//点亮LED灯
  delay(4*interval);
  digitalWrite(LED, LOW);//关闭LED灯
  
  FlexiTimer2::stop();
  
  //通过白平衡测试，计算得到白色物体RGB值255与1s内三色光脉冲数的RGB比例因子
  g_SF[0] = 255.0/ g_array[0];     //红色光比例因子
  g_SF[1] = 255.0/ g_array[1] ;    //绿色光比例因子
  g_SF[2] = 255.0/ g_array[2] ;    //蓝色光比例因子
  
  //打印白平衡后的红、绿、蓝三色的RGB比例因子
  SERIAL_PROTOCOL(g_SF[0]);
  SERIAL_ECHOLN("");
  SERIAL_PROTOCOL(g_SF[1]);
  SERIAL_ECHOLN("");
  SERIAL_PROTOCOL(g_SF[2]);
  SERIAL_ECHOLN("");
    
  //红、绿、蓝三色光分别对应的1s内TCS3200输出脉冲数乘以相应的比例因子就是RGB标准值
  //打印被测物体的RGB值
  for(int i=0; i<3; i++){
      SERIAL_PROTOCOL(int(g_array[i] * g_SF[i]));
      SERIAL_ECHOLN("");}     
}


void rgb_value()
{
   g_flag = 0;//颜色标志位重新修改为0

   //重新启用定时器中断
   SERIAL_PROTOCOLPGM("->WB Start");
   SERIAL_ECHOLN("");
   TSC_WB(LOW, LOW);   //选择让红色光线通过滤波器的模式
   
   //每获得一次被测物体RGB颜色值需时4s
   digitalWrite(LED, HIGH);//打开LED灯
   delay(4*interval);//多延时一定时间来保证测光程序一定完全运行结束
   digitalWrite(LED, LOW);//关闭
   
   //打印出被测物体RGB颜色值
  for(int i=0; i<3; i++){
    //Serial.println(int(g_array[i] * g_SF[i]));
    g_array1[i]=int(g_array[i] * g_SF[i]);
      SERIAL_PROTOCOL(g_array1[i]);
      SERIAL_ECHOLN("");
     }
  FlexiTimer2::stop();
}

#endif






