main/calibration.c

Mon, 21 Jun 2021 19:04:10 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Mon, 21 Jun 2021 19:04:10 +0200
changeset 102
96e30a3a3980
parent 54
7b134c27fadb
permissions
-rw-r--r--

Finished experimental code to drive the German HendiControl board. Added BoilPower and RampPower buttons during the while boil process. RampPower (going to boil power) is now adjustable. Added PWM driver code to the driver task.

/**
 * @file calibration.c
 * @brief TFT screen calibration.
 */

#include "config.h"


static const char		*TAG = "calibration";


extern uint16_t                 tp_xleft;		///< Testpoint X left
extern uint16_t                 tp_xright;		///< Testpoint X right
extern uint16_t                 tp_ytop;		///< Testpoint Y top
extern uint16_t                 tp_ybottom;		///< Testpoint Y bottom


// Distance of the testpoints from the corders.
#define	CAL_DISTANCE		15			///< Testpoint size


int TS_set_calibration(int xleft, int xright, int ytop, int ybottom)
{
    if ((xleft > xright) || (ybottom > ytop)) {
	ESP_LOGE(TAG, "Touch Calibration error X=%d..%d Y=%d..%d", xleft, xright, ybottom, ytop);
	return 1;
    }

    tp_xleft = xleft;
    tp_xright = xright;
    tp_ytop = ytop;
    tp_ybottom = ybottom;
    ESP_LOGI(TAG, "Touch Calibration X=%d..%d Y=%d..%d", xleft, xright, ybottom, ytop);

    return 0;
}



void Calibration_Init(void)
{
    _fg = TFT_ORANGE;
    TFT_setFont(DEJAVU24_FONT, NULL);
    TFT_print((char *)"Scherm calibratie", CENTER, 60);
    TFT_setFont(DEJAVU18_FONT, NULL);
    TFT_print((char *)"Druk op de oplichtende stippen", CENTER, 90);
}



/*
 * Run in a blocking loop
 */
void Calibration_Loop(void)
{
    int		tx, ty, pass, cx[8], cy[8], xl = 0, xh = 0, yl = 0, yh = 0;
    int		offset;

    pass = 0;
    ESP_LOGI(TAG, "Touchscreen calibration");

    while (1) {
	switch (pass) {
	    case 0:
	    case 4:	TFT_fillCircle(320 - CAL_DISTANCE, 240 - CAL_DISTANCE, 5, TFT_BLACK);
			TFT_fillCircle(CAL_DISTANCE,  CAL_DISTANCE, 5, TFT_YELLOW);
			xl = 2800;
			xh = 3800;
			yl = 2800;
			yh = 3800;
			break;
	    case 1:
	    case 5:	TFT_fillCircle(CAL_DISTANCE,  CAL_DISTANCE, 5, TFT_BLACK);
			TFT_fillCircle(320 - CAL_DISTANCE, CAL_DISTANCE, 5, TFT_YELLOW);
			xl = 2800;
			xh = 3800;
			yl = 100;
			yh = 1000;
			break;
	    case 2:
	    case 6:	TFT_fillCircle(320 - CAL_DISTANCE, CAL_DISTANCE, 5, TFT_BLACK);
			TFT_fillCircle(CAL_DISTANCE, 240 - CAL_DISTANCE, 5, TFT_YELLOW);
			xl = 100;
			xh = 1000;
			yl = 2800;
			yh = 3800;
			break;
	    case 3:
	    case 7:	TFT_fillCircle(CAL_DISTANCE, 240 - CAL_DISTANCE, 5, TFT_BLACK);
			TFT_fillCircle(320 - CAL_DISTANCE, 240 - CAL_DISTANCE, 5, TFT_YELLOW);
			xl = 100;
			xh = 1000;
			yl = 100;
			yh = 1000;
			break;
	}
	if (TFT_read_touch(&tx, &ty, 1)) {  // Raw read touch.
	    printf(" Calibrarion loop %d %d %d\n", pass, tx, ty);
	    if ((tx >= xl) && (tx <= xh) && (ty >= yl) && (ty <= yh)) {
	    	cx[pass] = tx;
	    	cy[pass] = ty;
	    	pass++;
	    	if (pass == 8) {
		    break;
	    	}
	    } else {
		SoundPlay(SOUND_Warn);
	    }
	    WaitTouchReleased();
	}
	vTaskDelay(100 / portTICK_PERIOD_MS);
    }

    TFT_fillScreen(TFT_BLACK);
    TFT_setFont(DEJAVU18_FONT, NULL);
    TFT_print((char *)"Scherm calibratie is klaar.", CENTER, 60);
    /*
     * Calculate the new calibration values.
     * The testdots were 10 pixels of the corners, 
     * so take that in account.
     */
    offset = (CAL_DISTANCE * 3800) / 240;
    config.ts_xleft   = ((cx[2] + cx[3] + cx[6] + cx[7]) / 4) - offset;
    config.ts_xright  = ((cx[0] + cx[1] + cx[4] + cx[5]) / 4) + offset;
    offset = (CAL_DISTANCE * 3800) / 320;
    config.ts_ytop    = ((cy[0] + cy[2] + cy[4] + cy[6]) / 4) + offset;
    config.ts_ybottom = ((cy[1] + cy[3] + cy[5] + cy[7]) / 4) - offset;
    TS_set_calibration(config.ts_xleft, config.ts_xright, config.ts_ytop, config.ts_ybottom);
    write_config();

    Buttons_Add(130, 200, 60, 40, (char *)"Ok", 0);
    Buttons_Show();
    while (1) {
	vTaskDelay(20 / portTICK_PERIOD_MS);
	if (Buttons_Scan() == 0) {
	    return;
	    break;
    	}
    }
}

mercurial