Skip to content

Commit

Permalink
tweak for CST816S
Browse files Browse the repository at this point in the history
  • Loading branch information
lovyan03 committed Sep 27, 2023
1 parent 3484bfe commit 0859526
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 19 deletions.
54 changes: 35 additions & 19 deletions src/lgfx/v1/touch/Touch_CST816S.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@ Original Source:
/----------------------------------------------------------------------------*/

// CST816 info from here...
// https://github.com/lupyuen/hynitron_i2c_cst0xxse/blob/master/cst0xx_common.h
// https://blog.csdn.net/Distance_98/article/details/126408819
// https://www.waveshare.com/w/upload/c/c2/CST816S_register_declaration.pdf

#include "Touch_CST816S.hpp"

Expand Down Expand Up @@ -58,7 +57,14 @@ namespace lgfx
uint8_t tmp[3] = { 0 };
_inited = _write_reg(0x00, 0x00)
&& _read_reg(CST816S_CHIPID_REG, tmp, 3);
// _write_reg(0xFA, 0b00000101); // レジスタ0xFAはINTピンの動作設定に関与すると思われる。

// CST816SのINT機能には問題があり、LOWパルス出力期間中のタッチ精度が顕著に劣化する。
// 0xFAレジスタを0x40とすると接触中に定期的にINTパルスを発生できる。
// また、0xEDを操作するとパルスの長さを変更できるが、これらを併用するとタッチ性能が顕著に劣化する。
// _write_reg(0xFA, 0x40); // 0x40 = 触れている間、連続的にINTパルスを発生する。

_write_reg(0xFA, 0x20); // 0x20 = 変化を検出したときINTパルスを発生する。
_write_reg(0xED, 20); // INT LOW パルス長さ 20 == 2 msec
// ESP_LOGV("LGFX","CST816S id:%02x %02x %02x", tmp[0], tmp[1], tmp[2]);
return _inited;
}
Expand All @@ -78,28 +84,18 @@ namespace lgfx
}

if (_cfg.pin_int >= 0)
{ // intピンのプルアップ処理を行うが、「触れている間 LOW」の設定方法が不明のため、このピンを使用していない
{ // intピンのプルアップ処理を行うが、「触れている間 LOW」の設定方法がないため使用していない
// GPIO割込みを使用すれば良いが、Arduinoに依存せず解決する必要があるため、対応を保留する。
lgfx::pinMode(_cfg.pin_int, pin_mode_t::input_pullup);
}
lgfx::i2c::init(_cfg.i2c_port, _cfg.pin_sda, _cfg.pin_scl).has_value();

// 画面に触れていない時、I2C通信でCST816が見つからない事がある。
// CST816S の正確な仕様を確認することができていないが恐らく省電力モード中は通信応答しないものと思われる
// CST816S は恐らく省電力モード中はI2Cでの通信に応答しないものと思われる
// 通信の成否による初期化の成否の判定ができないため、ひとまず true を返す。
return true;
}

// void Touch_CST816S::wakeup(void)
// {
// }

// void Touch_CST816S::sleep(void)
// {
// if (!_check_init()) return;
// // _write_reg(CST816S_SLEEP_REG, CST816S_SLEEP_IN);
// }

size_t Touch_CST816S::_read_data(uint8_t* readdata)
{
size_t res = 0;
Expand Down Expand Up @@ -132,19 +128,39 @@ namespace lgfx
{
if (!_inited && !_check_init()) return 0;

if (count > max_touch_points) { count = max_touch_points; }
// if (count > max_touch_points) { count = max_touch_points; }

uint32_t msec = lgfx::millis();
uint32_t diff_msec = msec - _last_update;

if (diff_msec < 10 && _wait_cycle)
{
--_wait_cycle;
if (_cfg.pin_int < 0 || gpio_in(_cfg.pin_int)) {
return 0;
}
}
_last_update = msec;

uint8_t readdata[8];
uint8_t readdata[6];
int retry = 3;
do
{
// I2Cでの応答が得られない場合は触れていないものとして扱う。
if (!_read_reg(0x02, readdata, 6))
{
return 0;
count = 0;
break;
}
count = readdata[0];
} while ((count > 1 || readdata[5] != 0x10) && --retry);
if (retry && count)
if (!retry)
{
count = 0;
}
_wait_cycle = count ? 0 : 16;

if (count)
{
// ESP_LOGV("CST816S", "%02x %02x %02x %02x %02x %02x %02x %02x %d %d",
// readdata[0], readdata[1], readdata[2], readdata[3],
Expand Down
2 changes: 2 additions & 0 deletions src/lgfx/v1/touch/Touch_CST816S.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ namespace lgfx
{
max_touch_points = 1
};
uint32_t _last_update = 0;
uint8_t _wait_cycle = 0;

bool _check_init(void);
bool _write_reg(uint8_t reg, uint8_t val);
Expand Down

0 comments on commit 0859526

Please sign in to comment.