###前提・実現したいこと
学校で現在armadilloを使った組込み課題をやっています。
わたしは1000円自販機を再現しようとプログラムを組んでいますが難しく、手詰まりの状態です。
確率を設けて豪華な賞品には低い確率を設けたいのですがどこにどういれていけばいいかわかりません。
最悪、乱数でやりますがその辺をぜひ教えてください、お願いします。
###該当のソースコード
C
1このメイン文を改造して実現させたいのでお力添えよろしくお願いします。 2 3int main(void) { 4 int fd; 5 int i; 6 int a; 7 int ret; 8 struct tsdev *ts; 9 struct ts_sample samp; 10 int enable = 1; 11 int led_state = 0; 12 13 int tmp; 14 15 // フレームバッファをオープンします。 16 // オープンに失敗した場合はエラーで終了します。 17 if ((fd = open(FBDEV_FILE, O_RDWR)) < 0) { 18 perror("open(fb)"); 19 return 1; 20 } 21 22 // mmapによりバッファの先頭アドレスを取得します。 23 pfb = mmap(0, SCREENSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); 24 // 取得に失敗した場合はエラーで終了します。 25 if (pfb == MAP_FAILED){ 26 perror("mmap"); 27 return 1; 28 } 29 30 // LCDの画面表示を全て消去するために、 31 // 取得したアドレスから確保領域を0で初期化します。 32 for (i = 0; i < SCREENSIZE / BYTES_PER_PIXCEL; i++) 33 pfb[i] = 0; 34 35 // タッチスクリーンイベントファイルをオープンします。 36 ts = ts_open(TSDEV_FILE, 0); 37 // オープンに失敗した場合はエラーで終了します。 38 if (!ts){ 39 perror("ts_open"); 40 return 1; 41 } 42 43 // コンフィグファイルを読み込み、フィルタモジュールをロードします。 44 ret = ts_config(ts); 45 // ロードに失敗した場合はエラーで終了します。 46 if (ret){ 47 perror("ts_config"); 48 return 1; 49 } 50 51 52 53 // 画像データを読み込み、ボタンのカラーデータを取得します。 54 if (ret = load_bmp()) 55 return ret; 56///////////////////////////////////////////////// 57 // LCDに各種ボタンを表示します。 58// update_button(BTN_deru, BTN_kieru); 59 60 61 update_button(BTN_LIGHT1, BTN_OFF); 62 update_button(BTN_LIGHT2, BTN_OFF); 63 update_button(BTN_LIGHT3, BTN_OFF); 64 update_button(BTN_LIGHT4, BTN_OFF); 65 update_button(BTN_LIGHT5, BTN_OFF); 66 update_button(BTN_LIGHT6, BTN_OFF); 67 update_button(BTN_LIGHT7, BTN_OFF); 68 update_button(BTN_LIGHT8, BTN_OFF); 69 70 71////////////////////////////////////////////////// 72 73 74 // タッチスクリーンイベントを受け付ける間ループさせます。 75 for(;;){ 76 // タッチスクリーンイベントから、圧力・x座標・y座標を読み込みます。 77 ret = ts_read(ts, &samp, 1); 78 // 読み込みに失敗した場合はエラーで終了します。 79 if (ret < 0){ 80 perror("ts_read"); 81 return 1; 82 } 83 84 // タッチイベントが1個以外の場合は無視します。 85 if (ret != 1) 86 continue; 87 88 // 圧力がなくなったら、次に圧力がかかった初回のみ処理を実行するように、 89 // enable に 1を設定します。 90 if (samp.pressure == 0){ 91 enable = 1; 92 continue; 93 } 94 95 96 97//////////////////////////////////////////////////////////////////////////////////////////////// 98 99 100 // タッチされたボタンに該当する処理を実行します。 101 if (enable){ 102 // タッチされた座標を調べ、識別子を取得します。 103 ret = xy2button(samp.x, samp.y); 104 105 106/* while(0){ 107 //ランダムに画像を出す処理 108 109 } 110*/ 111 112 113//////////////////////////////////////////////////////////////////////////////////////////////////// 114 115 // 識別子によって処理を変えます。 116 switch(ret){ 117 118 119 // 画像を出す処理 120 case BTN_LIGHT1 : 121 // 対象のLEDを点灯させるために、立てるビットを算出します。 122 tmp = ret - BTN_LIGHT1; 123 // 対象のLEDが点灯か消灯かを判定します。 124 if (led_state & (1 << tmp)){ 125 // 点灯していた場合はOFFボタンを表示します。 126 update_button(ret, BTN_OFF); 127 // タッチされたボタンに対応するLEDの対象ビットを落とします。 128 led_state &= ~(1 << tmp); 129 // 落としたビットを反映し、対象のLEDを消灯します。 130 change_led(led_state); 131 } else { 132 // 消灯していた場合はONボタンを表示します。 133 update_button(ret, BTN_ON); 134 // タッチされたボタンに対応するLEDの対象ビットを立てます。 135 led_state |= 1 << tmp; 136 // 立てたビットを反映し、対象のLEDを点灯します。 137 change_led(led_state); 138 } 139 break; 140 141 142 case BTN_LIGHT2 : 143 // 対象のLEDを点灯させるために、立てるビットを算出します。 144 tmp = ret - BTN_LIGHT1; 145 // 対象のLEDが点灯か消灯かを判定します。 146 if (led_state & (1 << tmp)){ 147 // 点灯していた場合はOFFボタンを表示します。 148 update_button(ret, BTN_OFF); 149 // タッチされたボタンに対応するLEDの対象ビットを落とします。 150 led_state &= ~(1 << tmp); 151 // 落としたビットを反映し、対象のLEDを消灯します。 152 change_led(led_state); 153 } else { 154 // 消灯していた場合はONボタンを表示します。 155 update_button(ret, BTN_ON); 156 // タッチされたボタンに対応するLEDの対象ビットを立てます。 157 led_state |= 1 << tmp; 158 // 立てたビットを反映し、対象のLEDを点灯します。 159 change_led(led_state); 160 } 161 break; 162 163 164 165 case BTN_LIGHT3 : 166 // 対象のLEDを点灯させるために、立てるビットを算出します。 167 tmp = ret - BTN_LIGHT1; 168 // 対象のLEDが点灯か消灯かを判定します。 169 if (led_state & (1 << tmp)){ 170 // 点灯していた場合はOFFボタンを表示します。 171 update_button(ret, BTN_OFF); 172 // タッチされたボタンに対応するLEDの対象ビットを落とします。 173 led_state &= ~(1 << tmp); 174 // 落としたビットを反映し、対象のLEDを消灯します。 175 change_led(led_state); 176 } else { 177 // 消灯していた場合はONボタンを表示します。 178 update_button(ret, BTN_ON); 179 // タッチされたボタンに対応するLEDの対象ビットを立てます。 180 led_state |= 1 << tmp; 181 // 立てたビットを反映し、対象のLEDを点灯します。 182 change_led(led_state); 183 } 184 break; 185 186 187 188 // 圧力がなくなるまで、同じ処理をしないように 189 // enableに0を設定します。 190 enable = 0; 191 } 192 } 193 194 195 // タッチスクリーンイベントファイルをクローズします。 196 ts_close(ts); 197 // フレームバッファのために確保した領域を開放します。 198 munmap(pfb, SCREENSIZE); 199 // フレームバッファをクローズします。 200 close(fd); 201 202 return 0; 203 204//関数の紹介 205 206// ビットマップ形式の画像ファイルを読み込み、 207// ボタンのカラーデータを取得する関数。 208int load_bmp(void) 209 210// LCDに画像を表示する関数。 211void draw_image(int index, int x0, int y0) 212 213// ボタンを表示する関数。 214void update_button(int index, int on) 215 216// 座標に対応するボタン識別子を返す関数。 217int xy2button(int x, int y)
###補足情報(言語/FW/ツール等のバージョンなど)
C言語 Linux
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。