//***************************(C) COPYRIGHT 2014 CZQ******************************
//*******************************************************************************
//        Joinmax Digital Module library 0.0
//*******************************************************************************
// File Name   	: JMDKernel.h
// Version		: V0.0
// Compiler		: GCCARM
// Target		: X3RCU (STM32F407ZET6)
// Author		: CZQ
// Date			: 2014/08/17
// Description  :
//*******************************************************************************
//
//*******************************************************************************
#ifndef _JMDKERNEL_H_
#define _JMDKERNEL_H_

#ifdef __cplusplus
 extern "C" {
#endif

#include <stdio.h>
#include <math.h>
#include "stm32f4xx_conf.h"
#include "stm32f4xx.h"
#include "LCD_COLOR.h"
typedef char* string;
#ifdef  APP_GLOBALS
	#define  _APP_EXT
#else
	#define  _APP_EXT  extern
#endif

#ifndef  _PinFormat_H_
#define  _PinFormat_H_
const u32 portarray[8]={GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,GPIOF,GPIOG};

struct select
{
	unsigned type:4;   //硬件类型
	unsigned group1:3; //第一针组号
	unsigned bit1:4;   //第一针位号
	unsigned group2:3; //第二针组号
	unsigned bit2:4;   //第二针位号
	unsigned group3:3; //第三针组号
	unsigned bit3:4;   //第三针位号
	unsigned group4:3; //第四针组号
	unsigned bit4:4;   //第四针位号
};
#endif

#define Servo1 2
#define Servo2 1
#define Servo3 0
#define Servo4 9

#define ON		1
#define OFF	0
//typedef---------------------------------------------------------
typedef struct
{
	u8 state;//触摸状态0没有检测到触摸,1检测到触摸
	u16 x;	 //X轴触摸坐标1~240,0代表没有触摸值
	u16 y;	 //Y轴触摸坐标1-320,0代表没有触摸值
	u8 sr;	 //读取坐标值状态寄存器，当x,y都被读出或者重复读取x/y坐标值时置0，只读取当前坐标其中一个值时置1/2
}SysThouch_Typedef;
typedef struct
{
	//普通马达
	u16 eep[8];
	u8  dir[8];		//马达方向
	u8  power[8];	//马达功率
	//编码马达
	u16 mceep[3];	
	s32 code[3];	//编码器值
	u8  mcdir[3];	//编码方向
	u8  codedir[3];	//编码器值方向
	u8  mcpower[3];	//编码马达功率
	u8  mode[3];	//编码马达模式 2伺服模式
}SysMotor_Typedef;
typedef struct
{
	u8 buffer[1024];//串口接收缓存
	u16 lenght;//串口接收计数
	u16 readbufcnt;//读缓存指针

	u8 rxmode;//接收模式:0只缓存数据,1数据包模式(数据包长度)
	//数据包格式:0x56+0xAB+sizeL+sizeH+id+D0+D1+…+sum
	//0x56,0xAB:字头
	//size:数据包总长2Byte/1Byte
	//id:传感器ID(1Byte)
	//检验和(1Byte)sum=0x56^0xAB^sizeL^sizeH^id^D0^D1^…
	u8 id;//传感器ID
	u16 packetsize;//数据包长度
	u8 packetflag;//接收到数据包标志
	u16 sum;//检验和
	u16 packetstart;//数据包起始指针(从ID开始)
	u8 packetnew;//0:没有接收到数据包,1:新数据包,并且校验通过,2检验出错但数据包长度对
	u16 pacnketcnt;//数据包计数
}SysCom_Typedef;//串口
_APP_EXT SysMotor_Typedef SysMotor;

vu8 g_Servo8to10Flag=0;
vu8 g_MotorCode2Motor=0;
vu8 g_MotorCode2MotorIC=0;
vu8 TTSC_Flag=0;
vu16 g_MotorPowerFlag=0;//马达功率修改M1~M6:BIT0~BIT5
vu8 g_MSpeedPer[6]={100,100,100,100,100,100};
vu8 g_LcdBackLignt=1;//默认背光灯亮
//*** include *******************************************************************
void X3RCU_Init(void);
void GPIO_Setting(GPIO_TypeDef* port,u8 pin,u8 mode,u8 OType,u8 PuPd);

void Button_PinInit(void);
void SysBeep_Init(void);
void System_Touch_ADC3_Init(void);

void SystemRTC_init(void);
void SetSystemTime(void);
u32 GetSystemTime(void);
void delayms(unsigned long ms);

u16 GetTouchXFilter(SysThouch_Typedef *Thouch);
u16 GetTouchYFilter(SysThouch_Typedef *Thouch);
u16 GetTouchState(SysThouch_Typedef *Thouch);

u16 GetAdcResult(u8 port,u8 pin);

u8 Motor_Init(u8 MotorX);//普通马达端口初始化
u8 SetMotorPWMFreq(u32 freq);
void ReadSysMotorEeprom(u8 which,SysMotor_Typedef *mMotor);
void ReadSysMotorCodeEeprom(u8 which,SysMotor_Typedef *mMotor);
void SetMotorX(u8 MotorX,u8 Dir,u8 Speed);
void MotorCode_Init(u8 MotorX);
void SetMotorCntZero(u8 MotorX);
vs32 GetMotorCnt(u8 MotorX);
void SetMotorCodeMode(u8 MotorX,u8 mode);
void SetCodeServoAngle(u8 MotorX,u8 Dir,u8 speed,u32 Pulse);
void SetMotorY(u8 MotorX,u8 Dir,u8 Speed);

u8  ComServoInit(u8 ServoNo);
void ComServoAngle(u8 ServoX,u8 angle);

void SysADC_Init(void);
//外部eeprom
void I2CEep_SetIICSpeed(u16 speed);//设置外部eeprom的I2C读写速度,默认14(400K)
u8 I2CEep_Write(u16 addr,//0~256
		            u16 data);//0~65535 1个地址对应2Byte数据
u8 I2CEep_Read(u16 addr,//0~256
		           u16 *data);//0~65535 1个地址对应2Byte数据								
#ifdef __cplusplus
}
#endif//__cplusplus

#endif
