Linux上で動作する REX-5055 DIO PC Card用 プログラムです。
IPO16と接続し、LEDをオンオフ制御を行います。
REX-5055からケーブルRCL-5055Tを使用してIPO16に接続します。
![]() |
あらかじめ ROOT ユーザでログインします。
# cd /root/Projects | Gladeのプロジェクトの上のディレクトリへ移動します |
# tar zxvf led_ctrl.tar.gz | ソースを展開すると新たに led_ctrl ディレクトリが作成されます |
# cd led_ctrl | led_ctrl プロジェクトのディレクトリへ移動します |
# make | makeを実行してプログラムを生成します |
/root/Projects/led_ctrl/src ディレクトリにプログラム led_ctrl が作成されます。
main.c | メイン |
callbacks.c | 各Widgetのcallback処理 |
interface.c | Gladeが作成管理するWidget Interface定義 |
support.c | Gladeが作成管理する |
rex5055.h | rex5055用ヘッダ |
シンボル | 機能 | CallBack |
---|---|---|
Device選択 | オープンするデバイススペシャルファイルを選択します。 | on_combo_entry1_changed |
Low Byte "1"〜"8" トグルボタン |
PIO0〜PIO7 各ラインのOn/Offを設定するためのトグルボタンです。 | Out_bLEDx_toggledt |
Low Byte "9"〜"16" トグルボタン |
PIO8〜PIO15 各ラインのOn/Offを設定するためのトグルボタンです。 | Out_bLEDx_toggledt |
Low Onボタン | PIO0〜PIO7 すべてをOnに設定します。 | Out_bLowOn_Clicked |
Low Offボタン | PIO0〜PIO7 すべてをOffに設定します。 | Out_bLowOff_Clicked |
High Onボタン | PIO8〜PIO15 すべてをOnに設定します。 | Out_bHighOn_Clicked |
High Offボタン | PIO8〜PIO15 すべてをOffに設定します。 | Out_bHighOff_Clicked |
Low-High Onボタン | PIO0〜PIO7, PIO8〜PIO15 すべてをOnに設定します。 | Out_bWordOn_clicked |
Low-High Offボタン | PIO0〜PIO7, PIO8〜PIO15 すべてをOffに設定します。 | Out_bWordOff_clicked |
dio_init | REX-5055デバイスファイルのオープンと初期化 |
dio_exit | REX-5055デバイスアファイルのクローズ |
dio_write | REX-5055デバイスファイルへの書き込み |
DevNameChanged | REX-5055デバイススペシャルファイルの変更 |
main | mainルーチン |
int dio_init() { char *sWrtCtrl = "WrtCtrl:0x03\n"; /* mode = low & high output mode */ char *sWrtMask = "WrtMask:0x00\n"; /* Int disable */ if (dio_dev[0] == '\0') { strcpy(dio_dev, "/dev/dio"); } Card_fd = open(dio_dev, O_RDWR); if (Card_fd == -1) { g_print("open error ...\n"); return (-1); } g_print("open : %s\n", dio_dev); /* Set Contorl */ if ( write(Card_fd, sWrtCtrl, strlen(sWrtCtrl)) == -1) { g_print("%s %s error...\n", dio_dev, sWrtCtrl); return (-1); } /* Set Int mask */ if ( write(Card_fd, sWrtMask, strlen(sWrtMask)) == -1) { g_print("%s %s error...\n", dio_dev, sWrtMask); return (-1); } return 0; } /* dio_init */ |
int dio_exit() { if (Card_fd == -1) return -1; g_print("dio_exit : start\n"); close(Card_fd); g_print("close : %s\n", dio_dev); return 0; } |
int dio_write(char *cmd) { int wlen, len; if (Card_fd == -1) return -1; wlen = strlen(cmd); len = write(Card_fd, cmd, wlen); if (len == -1) { g_print("write error...:[%d] %s\n", wlen, cmd); return (-1); } g_print("write : %s\n", cmd); return 0; } /* dio_write */ |
void DevNameChanged(char *new ) { dio_exit(); strcpy( dio_dev, new); dio_init(); } |
int main (int argc, char *argv[]) { GtkWidget *Topwin; #ifdef ENABLE_NLS bindtextdomain (PACKAGE, PACKAGE_LOCALE_DIR); textdomain (PACKAGE); #endif gnome_init ("gtkex2", VERSION, argc, argv); /* * The following code was added by Glade to create one of each component * (except popup menus), just so that you see something after building * the project. Delete any components that you don't want shown initially. */ Topwin = create_Topwin (); gtk_widget_show (Topwin); dio_init(); /* Initializing REX=5055 */ gtk_main (); return 0; } |
SetLED_Stat | トグルボタンのオンオフ設定 |
Out_LED_BitStat | 指定ビットのLEDのオンオフ制御 |
Out_LED_ByteStat | 上位または下位バイトのLEDのオンオフ制御 |
Out_LED_WordStat | 全LED(16ビット)のオンオフ制御 |
on_Topwin_delete_event | メインウィンドウ(Topwin)の "delete"シグナルに対するコールバック |
Out_bLED[1..16]_toggled | トグルボタン "1"〜"16"の "toggled"シグナルに対するコールバック |
Out_bHighOn_clicked Out_bHighOff_clicked Out_bLowOn_clicked Out_bLowOff_clicked |
ボタン "High On","High Off","Low On","Low Off"の "clicked"シグナルに対するコールバック |
Out_bWordOn_clicked Out_bWordOff_clicked |
ボタン "High-Low On","High-Low Off"の "clicked"シグナルに対するコールバック |
static void SetLED_stat(int Start, int End, gboolean BitOn, /* TRUE: on FALSE: off */ GtkButton *button ) { GtkToggleButton *togglebutton; GtkWidget *widget; char widget_name[8]; int LED_no; for (LED_no = Start; LED_no <= End; LED_no++) { bLED_stat[LED_no] = BitOn; sprintf(widget_name, "bLED%d", LED_no+1); widget = lookup_widget( GTK_WIDGET(button), (const gchar *)widget_name ); togglebutton = GTK_TOGGLE_BUTTON(widget); gtk_toggle_button_set_active( togglebutton, BitOn ); } } |
static int Out_LED_BitStat( int BitNo, GtkToggleButton *togglebutton ) { char *StrOnOff; /* TRUE: on FALSE: off */ bLED_stat[BitNo] = gtk_toggle_button_get_active( togglebutton ); StrOnOff = ( bLED_stat[BitNo] == TRUE) ? "On" : "Off"; g_print("LED%d is %s\n", BitNo + 1, StrOnOff); sprintf( dio_cmd, "SetBit%s:%d\n", StrOnOff, BitNo); dio_write(dio_cmd); return 0; } |
static int Out_LED_ByteStat( int sBit, gboolean BitOn, /* TRUE: on FALSE: off */ GtkButton *button ) { char *StrOnOff; char *StrLowHigh; int ByteVal; SetLED_stat( sBit, sBit + 7, BitOn, button ); if (BitOn == TRUE) { StrOnOff = "On"; ByteVal = 0xff; } else { StrOnOff = "Off"; ByteVal = 0x00; } StrLowHigh = ( sBit == 0 ) ? "Low" : "High"; g_print("%s LED%d-%d is %s\n", StrLowHigh, sBit + 1, sBit + 8, StrOnOff); sprintf( dio_cmd, "Write%sByte:0x%02X\n", StrLowHigh, ByteVal); dio_write(dio_cmd); return 0; } |
static int Out_LED_WordStat( gboolean BitOn, /* TRUE: on FALSE: off */ GtkButton *button ) { int WordVal; SetLED_stat( 0, 15, BitOn, button ); WordVal = (BitOn == TRUE) ? 0xffff : 0x0000 ; g_print("All LED are %s\n", (( BitOn == TRUE ) ? sOn : sOff ) ); sprintf( dio_cmd, "WriteWord:0x%04X\n", WordVal); dio_write(dio_cmd); return 0; } |
gboolean on_Topwin_delete_event (GtkWidget *widget, GdkEvent *event, gpointer user_data) { int result; result = dio_exit(); g_print("dio_exit: %d\n", result); gtk_main_quit(); g_print("on_Topwin_delete_event: quit\n"); return FALSE; } |
void on_bLED1_toggled (GtkToggleButton *togglebutton, gpointer user_data) { Out_LED_BitStat( 0, togglebutton ); } |
void on_bHighOn_clicked (GtkButton *button, gpointer user_data) { Out_LED_ByteStat( DIO_HIGH, LED_ON, button ); } |
void on_bWordOn_clicked (GtkButton *button, gpointer user_data) { Out_LED_WordStat( LED_ON, button ); } |
void on_combo_entry1_changed (GtkEditable *editable, gpointer user_data) { char *str; str = gtk_entry_get_text(GTK_ENTRY(editable)); DevNameChanged( str ); } |
Writeコマンド書式 |
cmd = "WrtCtrl:0xDD\n"; write(fd, cmd, len); 0xDD : コントロールバイト |
---|
コントロールバイト
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|
IMD | IR3 | IR2 | IR1 | IR0 | - | DIRH | DIRL |
コントロールバイトの各ビットの意味
ビット | 内容 |
---|---|
DIRL | PIO0-PIO7 のデータ入出力方向を設定します。 0: 入力 1: 出力 |
DIRH | PIO8-PIO15 のデータ入出力方向を設定します。 0: 入力 1: 出力 |
IR0-IR3 | 割り込みソースビットを設定します。 IR0-IR3 で指定されたPIOポートにIMDで指定された信号の立ち下がり・立ち上がりがあった場合、 割り込みステータスレジスタの IntFlagビットがセットされます。 |
IMD | 割込みトリガーモードを設定します。 0: 立下りエッジ 1: 立上りエッジ |
Writeコマンド書式 |
cmd = "WrtMask:0xDD\n"; write(fd, cmd, len) 0xDD : 割り込みマスクバイト |
---|
割り込みマスクバイト
B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
---|---|---|---|---|---|---|---|
IrEbl | - | - | - | ICLRW3 | ICLRW2 | ICLRR3 | ICLRR2 |
割込みマスクバイトの各ビットの意味
ビット | 内容 |
---|---|
B0-B3 | 割込みステータスレジスタの
IntFlag ビットクリア条件を設定します。 ICLRR2 - 1 : データレジスタの下位バイトをリードした時クリア ICLRR3 - 1 : データレジスタの上位バイトをリードした時クリア ICLRW2 - 1 : データレジスタの下位バイトをライトした時クリア ICLRW3 - 1 : データレジスタの上位バイトをライトした時クリア |
IrEbl | 割込みモードを設定します。 0: ディセーブル(リセット時のデフォルト値) 1: コントロールレジスタのIR0-IR3で指定されたPIOポートに入力があった時、 CPUに対する割込み要求をセットします。 |
Writeコマンド書式 |
cmd = "WriteLowByte:0xDD\n"; write(fd, cmd, len); |
---|
Writeコマンド書式 |
cmd = "WriteHighByte:0xDD\n"; write(fd, cmd, len); |
---|
Writeコマンド書式 |
cmd = "WriteWord:0xDDDD\n"; write(fd, cmd, len); |
---|
Writeコマンド書式 |
cmd = "SetBitOn:DD\n"; write(fd, cmd, len); |
---|
Writeコマンド書式 |
cmd = "SetBitOff:DD\n"; write(fd, cmd, len); |
---|