Exemplo n.º 1
0
void cmd_captouchparams_run(char *line) {

  uint32_t mhd_r, nhd_r, ncl_r, fdl_r;
  uint32_t mhd_f, nhd_f, ncl_f, fdl_f;
  uint32_t dbr,touchthres,relthres;

  sscanf(line,"%"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32""
             ,&mhd_r,&nhd_r,&ncl_r,&fdl_r
             ,&mhd_f,&nhd_f,&ncl_f,&fdl_f
             ,&dbr,&touchthres,&relthres);

  char outline[1024];
  sprintf(outline,"Read values: %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32" %"PRIu32"\n"
             ,mhd_r,nhd_r,ncl_r,fdl_r
             ,mhd_f,nhd_f,ncl_f,fdl_f
             ,dbr,touchthres,relthres);
  serial_write_string(outline);

  cap_set_mhd_r(mhd_r);
  cap_set_nhd_r(nhd_r);
  cap_set_ncl_r(ncl_r);
  cap_set_fdl_r(fdl_r);

  cap_set_mhd_f(mhd_f);
  cap_set_nhd_f(nhd_f);
  cap_set_ncl_f(ncl_f);
  cap_set_fdl_f(fdl_f);

  cap_set_dbr  (dbr);
  cap_set_touch_threshold  (touchthres);
  cap_set_release_threshold(relthres);

  cap_deinit();
  cap_init();
  command_stack_pop();
}
Exemplo n.º 2
0
void cap_init(void) {

	// 63 2 4 1 63 2 4 1 0 8 4
	cap_set_mhd_r(63);
	cap_set_nhd_r(2);
	cap_set_ncl_r(4);
	cap_set_fdl_r(1);
	cap_set_mhd_f(63);
	cap_set_nhd_f(2);
	cap_set_ncl_r(4);
	cap_set_fdl_f(1);
	cap_set_dbr(0);
	cap_set_touch_threshold(8);
	cap_set_release_threshold(4);

	/**
	gpio_set_mode(PIN_MAP[BOARD_I2C_SDA].gpio_device, PIN_MAP[BOARD_I2C_SDA].gpio_bit, GPIO_OUTPUT_PP);
	gpio_set_mode(PIN_MAP[BOARD_I2C_SCL].gpio_device, PIN_MAP[BOARD_I2C_SCL].gpio_bit, GPIO_OUTPUT_PP);
	gpio_write_bit(PIN_MAP[BOARD_I2C_SDA].gpio_device, PIN_MAP[BOARD_I2C_SDA].gpio_bit, 1);
	gpio_write_bit(PIN_MAP[BOARD_I2C_SCL].gpio_device, PIN_MAP[BOARD_I2C_SCL].gpio_bit, 1);
	delay_us(1000);
	gpio_set_mode(PIN_MAP[BOARD_I2C_SDA].gpio_device, PIN_MAP[BOARD_I2C_SDA].gpio_bit, GPIO_INPUT_PD); // Can also be floating, but PD is safer if components misplaced.
	gpio_set_mode(PIN_MAP[BOARD_I2C_SCL].gpio_device, PIN_MAP[BOARD_I2C_SCL].gpio_bit, GPIO_INPUT_PD);
	*/

	i2c = CAPTOUCH_I2C;
	i2c_init(i2c);
	i2c_master_enable(i2c, I2C_BUS_RESET);

	mpr121Write(0x80, 0x63); // soft reset
	delay_us(1000);
	mpr121Write(ELE_CFG, 0x00);   // disable electrodes for config
	delay_us(100);

	// Section A and B - R (rise) F (fall) T (touch)
	mpr121Write(MHD_R, cap_mhd_r); // (1 to 63)
	mpr121Write(NHD_R, cap_nhd_r); // (1 to 63)
	mpr121Write(NCL_R, cap_ncl_r); // (0 to 255)
	mpr121Write(FDL_R, cap_fdl_r); // (0 to 255)

	mpr121Write(MHD_F, cap_mhd_f); // (1 to 63) largest value to pass through filer
	mpr121Write(NHD_F, cap_nhd_f); // (1 to 63) maximum change allowed
	mpr121Write(NCL_F, cap_ncl_f); // (0 to 255) number of samples required to determine non-noise
	mpr121Write(FDL_F, cap_fdl_f); // (0 to 255) rate of filter operation, larger = slower.

	// Section D
	// Set the Filter Configuration
	// Set ESI2

	// was 0x01, 0x25
	mpr121Write(AFE_CONF, 0x01); //AFE_CONF  0x5C
	mpr121Write(FIL_CFG, 0x04); //FIL_CFG   0x5D

	// Section F
	mpr121Write(ATO_CFG0, 0x0B); // ATO_CFG0 0x7B

	// limits
	// was0xFF,0x00,0x0E
	mpr121Write(ATO_CFGU, 0x9C); // ATO_CFGU 0x7D
	mpr121Write(ATO_CFGL, 0x65); // ATO_CFGL 0x7E
	mpr121Write(ATO_CFGT, 0x8C); // ATO_CFGT 0x7F

	// enable debouncing
	mpr121Write(DBR, cap_dbr); // set debouncing, in this case 7 for both touch and release.

	// Section C
	// This group sets touch and release thresholds for each electrode
	mpr121Write(ELE0_T, cap_touch_threshold);
	mpr121Write(ELE0_R, cap_release_threshold);
	mpr121Write(ELE1_T, cap_touch_threshold);
	mpr121Write(ELE1_R, cap_release_threshold);
	mpr121Write(ELE2_T, cap_touch_threshold);
	mpr121Write(ELE2_R, cap_release_threshold);
	mpr121Write(ELE3_T, cap_touch_threshold);
	mpr121Write(ELE3_R, cap_release_threshold);
	mpr121Write(ELE4_T, cap_touch_threshold);
	mpr121Write(ELE4_R, cap_release_threshold);
	mpr121Write(ELE5_T, cap_touch_threshold);
	mpr121Write(ELE5_R, cap_release_threshold);
	mpr121Write(ELE6_T, cap_touch_threshold);
	mpr121Write(ELE6_R, cap_release_threshold);
	mpr121Write(ELE7_T, cap_touch_threshold);
	mpr121Write(ELE7_R, cap_release_threshold);
	mpr121Write(ELE8_T, cap_touch_threshold);
	mpr121Write(ELE8_R, cap_release_threshold);
	mpr121Write(ELE9_T, cap_touch_threshold);
	mpr121Write(ELE9_R, cap_release_threshold);
	mpr121Write(ELE10_T, cap_touch_threshold);
	mpr121Write(ELE10_R, cap_release_threshold);
	mpr121Write(ELE11_T, cap_touch_threshold);
	mpr121Write(ELE11_R, cap_release_threshold);

	delay_us(100);

	// Section E
	// Electrode Configuration
	// Enable 6 Electrodes and set to run mode
	// Set ELE_CFG to 0x00 to return to standby mode
	mpr121Write(ELE_CFG, 0x0C);   // Enables all 12 Electrodes
	delay_us(100);

	// This can also be FLOATING, but PU is safer if components misplaced.
	gpio_set_mode(PIN_MAP[CAPTOUCH_GPIO].gpio_device,
			PIN_MAP[CAPTOUCH_GPIO].gpio_bit, GPIO_INPUT_PU);
	exti_attach_interrupt((afio_exti_num) (PIN_MAP[CAPTOUCH_GPIO].gpio_bit),
			gpio_exti_port(PIN_MAP[CAPTOUCH_GPIO].gpio_device), cap_change,
			EXTI_FALLING);

	// Clears the first interrupt
	uint32_t ts = realtime_get_unixtime();
	for (int n = 0; n < 16; n++)
		press_time[n] = ts;
	for (int n = 0; n < 16; n++)
		release_time[n] = ts;
	press_time_any = ts;
	release_time_any = ts;

	// Set the cap_enabled flag to remember the captouch is on
	cap_enabled = 1;

	return;
}