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); |
|---|