/*******************************************/
/* PIXCIR AG, Switzerland */
/*******************************************/
//#include "compilation_definitions.h"
/*** Compiler options ***/
//#define AVR_gcc // ATMEL
#define NC30 // RENESAS
/*** protocol option ***/
#define PIXCIR_I2C
//#define AUO_I2C
#define BUTTONS
#define F48
//
// Max number of electrodes
//
#ifdef F48
#define XMAX 48
#define YMAX 48
#else // F32 or S32
#define XMAX 32
#define YMAX 32
#endif
//
// EEPROM allocation
//
typedef struct
{
unsigned char table[XMAX];
#ifdef NC30
int nbr;
unsigned int reserved;
#else // AVR_gcc
int offset[32];
#endif
#ifdef F48
unsigned int stamp[6];
#else // F32 or S32
unsigned int stamp[4];
#endif
unsigned char sensitivity[XMAX];
unsigned int setup;
unsigned char thr;
}
electrode_t;
typedef struct
{
unsigned char M0_spi;
unsigned char M1_spi;
unsigned char scan_en;
unsigned char version[4];
int X_res;
int Y_res;
unsigned char move_thr;
unsigned char ghost_thr;
unsigned char fast;
unsigned char special_borders;
unsigned char Z_thr;
unsigned char power_mode;
unsigned char INT_mode;
unsigned char INT_width;
unsigned char drift_comp;
unsigned char subversion;
unsigned char noise_thr;
unsigned char noise_delay;
unsigned char noise_mode;
#ifdef NC30
unsigned char I2C_timeout;
unsigned char I2C_timeout_period;
unsigned char interval;
//!!!!!!!!!!!!!!!!!!!!!!! BYTE ADDED !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
unsigned char extra_offset;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
unsigned char extra_offset_flag;
signed char extra_offset_out[4];
signed char extra_offset_in[4];
unsigned char raw1_delta_offset;
unsigned char raw2_delta_offset;
unsigned char M1_calibr;
#ifdef BUTTONS
unsigned char button_scan;
unsigned char button_axis;
int button_setup_command;
unsigned char button_nbr;
unsigned char button_spi_speed;
unsigned char button_thr_press;
unsigned char button_thr_release;
#ifdef F48
unsigned char custom[201];
#else // F32 or S32
unsigned char custom[273];
#endif
#else // NO BUTTONS
#ifdef F48
unsigned char custom[209];
#else // F32 or S32
unsigned char custom[281];
#endif
#endif
#else // AVR_gcc
// int offset_M1[30];
// signed char border_M1_Y[13][2];
signed char border_M1_X[20][6];
unsigned char I2C_timeout; // I2C time-out disabled if 0, enabled if 1 or 2
unsigned char I2C_timeout_period; // I2C time-out period = (I2C_timeout_period * 8.192) ms
unsigned char interval;
unsigned char extra_offset_flag;
signed char extra_offset_out[4];
signed char extra_offset_in[4];
unsigned char raw1_delta_offset;
unsigned char raw2_delta_offset;
// unsigned char M1_calibr;
#ifdef BUTTONS
unsigned char button_scan;
unsigned char button_axis;
int button_setup_command;
unsigned char button_nbr;
unsigned char button_spi_speed;
unsigned char button_thr_press;
unsigned char button_thr_release;
unsigned char custom[35];
#else
unsigned char custom[43];
#endif
#endif
unsigned char bootlock; // #511 from start of eeprom structure (pinmap)
}
ee_options_t;
typedef struct
{
char disto[32];
electrode_t x;
electrode_t y;
ee_options_t options;
}
eeprom_t;
#ifdef NC30
/
// ME0 offsets are stored in data Flash Block B
/
#define offset_x 0x3400
#define offset_y (offset_x + ((XMAX-1)*2))
/*
typedef struct
{
int x[31];
int y[31];
}
offset_t;
*/
/
// ME1 offsets are stored in data Flash Block C
/
#define offset_M1 0x3800
#endif
//
// RAM allocation
//
/****************************************************************************************************************************/
/************************************* AUO I2C protocol *************************************************/
/****************************************************************************************************************************/
#ifdef AUO_I2C
#define WAKE_UP_BUFFER_SIZE 16
typedef struct
{
int posx; // 1st finger
int posy;
int posx2; // 2nd finger
int posy2;
}
shadow_t;
typedef struct
{
//
// READ ONLY MEMBERS
//
// PIXCIR_algorithm () will write to these members
//
int posx; // 1st finger position
int posy;
int posx2; // 2nd finger position
int posy2;
// int reserved_1[6]; // Customer reserved space
/*
int raw1; // Customer reserved space used as debug variables
int raw2;
int raw3;
int raw4;
int raw5;
int raw6;
*/
// address +8
unsigned char cross_enable; // Customer reserved space used as crossnode function variables
unsigned char cross_x;
unsigned char cross_y;
int crossing;
// address +13
unsigned char internal_enable; // Customer reserved space used as internal algorithm check variables
int x_signal;
int y_signal;
// address +18
unsigned char noise_mode;
unsigned char noise_level;
// unsigned char reserved_1[2]; // Customer reserved space
unsigned char X1_W; // Touch areas of each coordinates
unsigned char Y1_W;
unsigned char X2_W;
unsigned char Y2_W;
// address +24
int initial_distance;
int distance;
int ratio;
// unsigned char reserved_2[6]; // Customer reserved space
unsigned char X1_Z; // Finger to panel distance of each coordinates
unsigned char Y1_Z;
unsigned char X2_Z;
unsigned char Y2_Z;
// address +34
// unsigned char synch; // Synchronization on LCM Vcom signal
// unsigned char reserved_3[8];
// int stack_count; // Monitors the remaining space between the top of the stack and the bottom of global data section
// unsigned char reserved_3[7];
unsigned char reserved_3[9]; // Customer reserved space
//
// AUO PARAMETERS
//
// PIXCIR_algorithm () will read from or write to
// these members at each iteration.
//
int xy_raw1[31]; // AUO channels, first part
unsigned char reserved_4;
// address +106
unsigned char subversion;
unsigned char reserved_5[4]; // Customer reserved space
unsigned char xthr; // Threshold for X axis (low => more sensitive)
unsigned char ythr; // same for Y electrodes
unsigned char INT_mode; // Interrupt mode
unsigned char INT_width; // Interrupt pulse width
unsigned char power_mode; // Power mode
unsigned char version[4]; // Firmware version
// address +120
unsigned char specop; // Special operation (addr +120 from beginning of RAM table)
unsigned int EEPROM_read_addr; // Start address of the EEPROM read operation
// address +123
unsigned int crc; // CRC checksum of whole program memory
unsigned char reserved_6[3]; // Customer reserved space
// address +128
int xy_raw2[31]; // AUO channels, second part
// address +190
unsigned char interval;
unsigned char buffer_level;
int buffer[2*WAKE_UP_BUFFER_SIZE];
//
// PIXCIR PARAMETERS
//
// PIXCIR_algorithm () will read from or write to
// these members at each iteration.
//
// address +256
unsigned char M0_spi; // Method 0 Sensing speed (SPI data rate)
// high nibble for X, low nibble for Y
// high/low pulse width = ((3*k)+2)/8 us
// 2 -> SPI CLK = 500 kHz
// 5 -> SPI CLK = 235 kHz
// A -> SPI CLK = 125 kHz
// F -> SPI CLK = 85 kHz
unsigned char M1_spi; // Method 1 Sensing speed (SPI data rate)
// high/low pulse width = ((3*k)+2)/8 us
// 2 -> SPI CLK = 500 kHz
// 5 -> SPI CLK = 235 kHz
// A -> SPI CLK = 125 kHz
// F -> SPI CLK = 85 kHz
unsigned int strength; // Signal strength estimation
unsigned char touching; // Number of fingers on the panel
unsigned char old_touching; // Previous scan number of fingers on the panel
unsigned char offset; // Autozero from EEPROM is done if cleared
int xxraw[XMAX-1+2]; // PIXCIR X raw data
int yyraw[YMAX-1+2]; // PIXCIR Y raw data
#ifdef AVR_gcc
} __attribute__((packed))
position_t;
#else
}
position_t;
#endif
#endif
/****************************************************************************************************************************/
/************************************* PIXCIR I2C protocol *************************************************/
/****************************************************************************************************************************/
#ifdef PIXCIR_I2C
#ifdef NC30
#define WAKE_UP_BUFFER_SIZE 16
#else // AVR_gcc
#define WAKE_UP_BUFFER_SIZE 8
#endif
typedef struct
{
unsigned char touching; // Number of fingers on the panel
unsigned char old_touching; // Previous scan number of fingers on the panel
int posx; // 1st finger
int posy;
int posx2; // 2nd finger
int posy2;
unsigned char X1_W; // Touch areas of each coordinates
unsigned char Y1_W;
unsigned char X2_W;
unsigned char Y2_W;
unsigned char X1_Z; // Finger to panel distance of each coordinates
unsigned char Y1_Z;
unsigned char X2_Z;
unsigned char Y2_Z;
}
shadow_t;
typedef struct
{
// ----------------------------------------------------------------------------------------------
// Shadow protected
// ----------------------------------------------------------------------------------------------
unsigned char touching; // Number of fingers on the panel
unsigned char old_touching; // Previous scan number of fingers on the panel
int posx; // 1st finger position
int posy;
int posx2; // 2nd finger position
int posy2;
unsigned char X1_W; // Touch areas of each coordinates
unsigned char Y1_W;
unsigned char X2_W;
unsigned char Y2_W;
unsigned char X1_Z; // Finger to panel distance of each coordinates
unsigned char Y1_Z;
unsigned char X2_Z;
unsigned char Y2_Z;
// ----------------------------------------------------------------------------------------------
// End of shadow protection
// ----------------------------------------------------------------------------------------------
unsigned int strength; // Signal strength estimation
unsigned char power_mode; // Power mode
unsigned char INT_mode; // Interrupt mode
unsigned char INT_width; // Interrupt pulse width
unsigned char noise_mode;
unsigned char noise_thr;
unsigned char noise_level;
#ifdef BUTTONS
char reserved_1[15];
// address +41
char button_flags;
#else
char reserved_1[16];
// char reserved_1[14];
// address +40
// int stack_count; // Monitors the remaining space between the max top of the stack and the bottom of global data section
#endif
// address +42
int initial_distance;
int distance;
int ratio;
unsigned char version[4]; // Firmware version
unsigned char subversion;
unsigned int crc; // CRC checksum of whole program memory
unsigned char specop; // Special operation
unsigned int EEPROM_read_addr; // Start address of the EEPROM read operation
unsigned char xthr; // Threshold for X axis. Low => more sensible
unsigned char ythr; // same for Y electrodes
unsigned char synch; // Synchronization on LCM Vcom signal
// ----------------------------------------------------------------------------------------------
// PRIVILEGE 1 (necessary for production testing)
// ----------------------------------------------------------------------------------------------
#ifdef F48
int xy_raw1[XMAX-1]; // Customer channels, first part
int xy_raw2[XMAX-1]; // Customer channels, second part. Used for buttons RAW
#else
int xy_raw1[32]; // Customer channels, first part
int xy_raw2[32]; // Customer channels, second part. Used for buttons RAW
#endif
unsigned char cross_enable; // crossnode function variables
unsigned char cross_x;
unsigned char cross_y;
int crossing;
unsigned char internal_enable; // internal algorithm check variables
int x_signal;
int y_signal;
unsigned char interval; // Wake-up buffer variables
unsigned char buffer_level;
int buffer[2*WAKE_UP_BUFFER_SIZE];
// ----------------------------------------------------------------------------------------------
// PRIVILEGE 2 (Private to PIXCIR)
// ----------------------------------------------------------------------------------------------
unsigned char offset; // Autozero from EEPROM is done if cleared
unsigned char M0_spi; // Method 0 Sensing speed (SPI data rate)
// high nibble for X, low nibble for Y
// high/low pulse width = ((3*k)+2)/8 us
// 2 -> SPI CLK = 500 kHz
// 5 -> SPI CLK = 235 kHz
// A -> SPI CLK = 125 kHz
// F -> SPI CLK = 85 kHz
unsigned char M1_spi; // Method 1 Sensing speed (SPI data rate)
// high/low pulse width = ((3*k)+2)/8 us
// 2 -> SPI CLK = 500 kHz
// 5 -> SPI CLK = 235 kHz
// A -> SPI CLK = 125 kHz
// F -> SPI CLK = 85 kHz
int xxraw[XMAX-1+2]; // PIXCIR X raw data
int yyraw[YMAX-1+2]; // PIXCIR Y raw data
#ifdef BUTTONS
int button_raw_max[8];
#endif
#ifdef AVR_gcc
} __attribute__((packed))
position_t;
#else
}
position_t;
#endif
#endif
/****************************************************************************************************************************/
/***************************** drift compensation filter structure *****************************************/
/****************************************************************************************************************************/
typedef struct
{
long filter_content[4];
int real_previous_raw[4];
}
calib_s;
/****************************************************************************************************************************/
/************************************* functions headers *************************************************/
/****************************************************************************************************************************/
char PIXCIR_algorithm (void);