GadgetSeed  0.9.6
sysevent.c
[詳解]
1 /** @file
2  @brief システムイベント
3 
4  @date 2007.05.05
5  @author Takashi SHUDO
6 
7  @page system_event システムイベント
8 
9  GadgetSeed のシステムイベントは FIFO 構造のバッファにより管理されます。
10 
11  標準的なモデルのユーザアプリケーションは get_event() よりシステム
12  イベントを取得し、取得したシステムイベントに応じた処理を実行します。
13 
14  キーボード等のデバイスドライバは、システムイベントとして
15  set_event() で検知したイベントを登録します。
16 
17  割り込みハンドラからシステムイベントを登録する場合、 set_event_interrupt() を使用して下さい。
18 
19  システムイベントは最大 @ref GSC_KERNEL_MAX_SYSTEMEVENT_COUNT までバッファすることが出来ます。
20 
21  システムイベントには時間的寿命があります。
22 
23  登録されたシステムイベントは、取得されるまで
24  @ref GSC_KERNEL_SYSTEMEVENT_LIFE_TIME (ms)経過すると寿命切れイベントと
25  して取得されます。
26 
27 
28  ---
29  @section system_event_struct システムイベントデータ
30 
31  システムイベントデータ構造体は @ref st_sysevent で定義されています。
32 
33 
34  ---
35  @section system_event_api システムイベントAPI
36 
37  include ファイル : sysevent.h
38 
39  | API名 | 機能 |
40  |:--------------------------|:--------------------------------------|
41  | set_event() | @copybrief set_event |
42  | push_event_interrupt() | @copybrief push_event_interrupt |
43  | set_event_interrupt() | @copybrief set_event_interrupt |
44  | create_event() | @copybrief create_event |
45  | get_event() | @copybrief get_event |
46 
47 
48  ---
49  @section system_event_define 予約済みシステムイベント定義
50 
51  システムイベントデータ構造体のメンバ what は、発生したイベントの種類を示します。
52  what は以下のマクロが定義済みです。
53 
54  include ファイル : sysevent.h
55 
56  | イベント名(マクロ定義) | イベント説明 |
57  |:--------------------------|:------------------------------|
58  | @ref EVT_NULL | @copybrief EVT_NULL |
59  | @ref EVT_KEYDOWN | @copybrief EVT_KEYDOWN |
60  | @ref EVT_KEYUP | @copybrief EVT_KEYUP |
61  | @ref EVT_KEYDOWN_REPEAT | @copybrief EVT_KEYDOWN_REPEAT |
62  | @ref EVT_TOUCHSTART | @copybrief EVT_TOUCHSTART |
63  | @ref EVT_TOUCHMOVE | @copybrief EVT_TOUCHMOVE |
64  | @ref EVT_TOUCHEND | @copybrief EVT_TOUCHEND |
65 */
66 
67 #include "sysconfig.h"
68 #include "tkprintf.h"
69 #include "sysevent.h"
70 #include "timer.h"
71 #include "task/syscall.h"
72 #include "task/task.h"
73 #include "task/event.h"
74 
75 //#define DEBUGKBITS 0x01
76 #include "dkprintf.h"
77 
78 #ifndef GSC_KERNEL_MAX_SYSTEMEVENT_COUNT
79 #define GSC_KERNEL_MAX_SYSTEMEVENT_COUNT 8 ///< $gsc システムイベントの最大バッファ数
80 #endif
81 
82 #ifndef GSC_KERNEL_SYSTEMEVENT_LIFE_TIME
83 #define GSC_KERNEL_SYSTEMEVENT_LIFE_TIME 3000 ///< $gsc システムイベントの寿命(msec)
84 #endif
85 
86 #ifndef GSC_KEY_REPEAT_START_TIME
87 #define GSC_KEY_REPEAT_START_TIME 500 ///< $gsc キーリピート開始までの時間(msec)
88 #endif
89 
90 #ifndef GSC_KEY_REPEAT_INTERVAL_TIME
91 #define GSC_KEY_REPEAT_INTERVAL_TIME 50 ///< $gsc キーリピート間隔時間(msec)
92 #endif
93 
94 static struct st_event evtque;
95 
96 static struct st_sysevent event_buf[GSC_KERNEL_MAX_SYSTEMEVENT_COUNT+1]; ///< イベントバッファ
97 static unsigned short last_key; ///< 最後に押されたキー
98 static unsigned int key_repeat_start_time; ///< キーリピート開始までの時間
99 static unsigned int key_repeat_start_count; ///< キーリピート開始カウンタ
100 static unsigned int key_repeat_flg; ///< キーリピート開始フラグ
101 static unsigned int key_repeat_int_time; ///< キーリピート間隔時間
102 static unsigned long long key_repeat_int_count; ///< キーリピート時間カウンタ
103 
104 /**
105  @brief 全てのシステムイベントバッファのイベントを初期化(削除)する
106 */
107 void init_event(void)
108 {
109  eventqueue_register_ISR(&evtque, "event", (void *)event_buf, (unsigned int)sizeof(struct st_sysevent), GSC_KERNEL_MAX_SYSTEMEVENT_COUNT+1);
110 
111  last_key = 0;
114 
115  key_repeat_flg = 0;
116 
119 }
120 
121 /**
122  @brief システムイベントを登録する
123 
124  @param event 登録するシステムイベント
125 
126  @return !=0:エラー
127 */
128 int set_event(struct st_sysevent *event)
129 {
130  int rtn = 0;
131 
132  DKFPRINTF(0x01, "what = %d arg = %d\n", event->what, event->arg);
133 
134  event->when = get_kernel_time();
135  event_wakeup(&evtque, event);
136 
137  return rtn;
138 }
139 
140 /**
141  @brief 割り込みハンドラからシステムイベントを登録する
142 
143  @param sp スタックポインタ
144  @param event 登録するシステムイベント
145 */
146 void push_event_interrupt(void *sp, struct st_sysevent *event)
147 {
148  DKFPRINTF(0x01, "what = %d arg = %d\n", event->what, event->arg);
149 
150  event_push_ISR(sp, &evtque, event);
151 }
152 
153 /**
154  @brief 割り込みハンドラからシステムイベント待ちタスクを起床する
155 
156  @param sp スタックポインタ
157 */
158 void set_event_interrupt(void *sp)
159 {
160  event_set_ISR(sp, &evtque);
161 }
162 
163 /**
164  @brief システムイベントを作成し、追加する
165 
166  @param what システムイベントの種類
167  @param arg システムイベントの引数
168 
169  @return =0:成功
170  !=0:エラー
171 */
172 int create_event(unsigned short what, unsigned short arg, void *private_data)
173 {
174  struct st_sysevent event;
175 
176  event.what = what;
177  event.arg = arg;
178  event.private_data = private_data;
179 
180  return set_event(&event);
181 }
182 
183 /**
184  @brief システムイベントを待つ
185 
186  @param event 取得したシステムイベント
187  @param timeout システムイベント取得タイムアウト時間
188 
189  @note キーリピートを取得するには timeout は50以下に設定する必要がある
190 
191  @return 0:取得イベントなし
192  1:イベント取得成功
193  -1:寿命切れイベントの取得
194 */
195 int get_event(struct st_sysevent *event, unsigned int timeout)
196 {
197  int rtn = 0;
198 
199  rtn = event_wait(&evtque, event, timeout);
200 
201  if(rtn != 0) {
203  DKPRINTF(0x01, "get_event what = %d arg = %d\n",
204  event->what, event->arg);
205  return 1; // イベント有り
206  } else {
207  return -1; // 寿命切れイベント
208  }
209  } else {
210  if(key_repeat_flg) {
211  // キーリピート間隔
212  unsigned long long nt = get_kernel_time();
213  if(nt >= (key_repeat_int_count +
216  event->what = EVT_KEYDOWN_REPEAT;
217  event->arg = last_key;
218  return 1; // イベント有り
219  } else {
220  goto no_event;
221  }
222  } else {
223  if(last_key != 0) {
224  // キーリピートイベント追加処理
225  unsigned long long nt = get_kernel_time();
226  if(nt >=
229  // キーリピート開始
231  key_repeat_flg = 1;
232  }
233  goto no_event;
234  } else {
235  goto no_event;
236  }
237  }
238  }
239 
240 no_event:
241  event->what = EVT_NULL;
242  return 0; // イベント無し
243 }
int create_event(unsigned short what, unsigned short arg, void *private_data)
システムイベントを作成し、追加する
Definition: sysevent.c:172
void init_event(void)
全てのシステムイベントバッファのイベントを初期化(削除)する
Definition: sysevent.c:107
#define GSC_KERNEL_MAX_SYSTEMEVENT_COUNT
$gsc システムイベントの最大バッファ数
Definition: sysevent.c:79
unsigned long long when
イベントが発生したカーネル時間
Definition: sysevent.h:17
static unsigned long long key_repeat_int_count
キーリピート時間カウンタ
Definition: sysevent.c:102
void event_wakeup(struct st_event *evtque, void *arg)
イベントキューにイベントを登録する
Definition: syscall_api.c:453
void set_event_interrupt(void *sp)
割り込みハンドラからシステムイベント待ちタスクを起床する
Definition: sysevent.c:158
unsigned short arg
イベント引数
Definition: sysevent.h:14
#define GSC_KEY_REPEAT_INTERVAL_TIME
$gsc キーリピート間隔時間(msec)
Definition: sysevent.c:91
int set_event(struct st_sysevent *event)
システムイベントを登録する
Definition: sysevent.c:128
カーネルタイマ
static unsigned int key_repeat_flg
キーリピート開始フラグ
Definition: sysevent.c:100
void eventqueue_register_ISR(struct st_event *evtque, const char *name, void *args, unsigned int arg_size, int arg_count)
イベントキューを登録する
Definition: event.c:36
static struct st_sysevent event_buf[GSC_KERNEL_MAX_SYSTEMEVENT_COUNT+1]
イベントバッファ
Definition: sysevent.c:96
カーネル用機能限定printf
unsigned short what
イベント種類
Definition: sysevent.h:13
システムイベント
イベント
Definition: event.h:15
static unsigned int key_repeat_start_time
キーリピート開始までの時間
Definition: sysevent.c:98
#define EVT_KEYDOWN_REPEAT
キーを押した(リピート)
Definition: sysevent.h:29
システムコール
#define GSC_KEY_REPEAT_START_TIME
$gsc キーリピート開始までの時間(msec)
Definition: sysevent.c:87
#define GSC_KERNEL_SYSTEMEVENT_LIFE_TIME
$gsc システムイベントの寿命(msec)
Definition: sysevent.c:83
タスク制御
#define EVT_NULL
イベント無し
Definition: sysevent.h:25
システムイベント
Definition: sysevent.h:12
static unsigned int key_repeat_int_time
キーリピート間隔時間
Definition: sysevent.c:101
static unsigned int key_repeat_start_count
キーリピート開始カウンタ
Definition: sysevent.c:99
イベント待ちタスクキューの操作
void event_push_ISR(void *sp, struct st_event *evtque, void *arg)
イベントFIFOにイベントを登録する
Definition: task.c:857
unsigned long long get_kernel_time(void)
カーネル時間を取得する
Definition: timer.c:192
static unsigned short last_key
最後に押されたキー
Definition: sysevent.c:97
void push_event_interrupt(void *sp, struct st_sysevent *event)
割り込みハンドラからシステムイベントを登録する
Definition: sysevent.c:146
void event_set_ISR(void *sp, struct st_event *evtque)
イベント待ちタスクを起動する
Definition: task.c:879
int get_event(struct st_sysevent *event, unsigned int timeout)
システムイベントを待つ
Definition: sysevent.c:195
カーネル、ドライバ(非タスク)デバッグ用マクロ
int event_wait(struct st_event *evtque, void *argp, unsigned int timeout)
タスクをイベント待ち状態にする
Definition: syscall_api.c:364