hc
2025-02-14 bbb9540dc49f70f6b703d1c8d1b85fa5f602d86e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <pthread.h>
 
typedef enum {
   TOUCH_START = 0,
   TOUCH_DRAG = 1,
   TOUCH_RELEASE = 2,
   TOUCH_HOLD = 3,
   TOUCH_REPEAT = 4
} TOUCH_STATE;
 
#undef MAX
#define MAX(a,b)    ((a) > (b) ? (a) : (b))
#undef MIN
#define MIN(a,b)    ((a) < (b) ? (a) : (b))
#undef ABS
#define ABS(a)        ((a) >= 0 ? (a) : (-(a)))
 
static pthread_mutex_t gUpdateMutex = PTHREAD_MUTEX_INITIALIZER;
 
int draw_dot(int x, int y)
{
   if(x < 0 || y < 0){
//        LOGE("%s invalid dot! (%d,%d), \n", x, y);
       return -1;
   }
 
//    LOGE("draw (%d,%d)\n", x, y);
   pthread_mutex_lock(&gUpdateMutex);
//    drawline(0,0,255,255,x,y,2,2);
   gr_color(0, 0, 255, 255);
   gr_fill(x, y, 2, 2);
   //gr_flip();
   pthread_mutex_unlock(&gUpdateMutex);
 
   //FillColor(0, 0, 255, 255,x, y, 1, 1);
 
 
   return 0;
}
 
int draw_line(int x1, int y1, int x2, int y2)
{
   int x, y;
 
//    printf("line: (%d,%d)-(%d,%d)\n", x1, y1, x2, y2);
 
   if(x1 == x2){
       x = x1;
       for(y = MIN(y1, y2); y <= MAX(y1, y2); y++)
           draw_dot(x, y);
   }else if(y1 == y2){
       y = y1;
       for(x = MIN(x1, x2); x <= MAX(x1, x2); x++)
           draw_dot(x, y);
   }else if(ABS(x1-x2) > ABS(y1-y2)){
       for(x = MIN(x1, x2); x <= MAX(x1, x2); x++){
           y = ((y2 - y1) * (x - x1)) / (x2 - x1) + y1;
           draw_dot(x, y);
       }
   }else{
       for(y = MIN(y1, y2); y <= MAX(y1, y2); y++){
                        x = ((x2 - x1) * (y - y1)) / (y2 - y1) + x1;
                        draw_dot(x, y);
                }
   }
 
   return 0;
}
 
int last_x = 0, last_y = 0;
#ifdef SOFIA3GR_PCBA
extern int sync_screen_for_prompt(void);
#endif
 
int NotifyTouch(int action, int x, int y)
{
   switch(action){
   case TOUCH_START:
       draw_dot(x, y);
       last_x = x;
       last_y = y;
 
       break;
   case TOUCH_DRAG:
       draw_line(last_x, last_y, x, y);
       last_x = x;
       last_y = y;
       pthread_mutex_lock(&gUpdateMutex);
       gr_flip();
       pthread_mutex_unlock(&gUpdateMutex);
 
       break;
   case TOUCH_RELEASE:
       pthread_mutex_lock(&gUpdateMutex);
                gr_flip();
        pthread_mutex_unlock(&gUpdateMutex);
       #ifdef SOFIA3GR_PCBA
               sync_screen_for_prompt();
       #endif
       break;
   case TOUCH_HOLD:
       break;
   case TOUCH_REPEAT:
       break;
   default:
       break;
   }
 
   return 0;
}