REX-5055 Linuxサンプルプログラム仕様書 - LED Control Program

  1. REX-5055 LED Control Programについて
  2. 画面説明
  3. メイン(main.c)説明
  4. コールバック(callbacks.c)説明
  5. 使用ファンクション説明

1. REX-5055 LED Control Programについて

Linux上で動作する REX-5055 DIO PC Card用 プログラムです。
IPO16と接続し、LEDをオンオフ制御を行います。

接続構成図

REX-5055からケーブルRCL-5055Tを使用してIPO16に接続します。

動作環境
プログラムの構造
  1. プログラム開始
  2. ダイアログ表示
  3. デバイススペシャルファイルのオープン
  4. 各LEDに対応したボタンをクリックするとON/OFFが切り替わる
  5. クローズボタンでデバイススペシャルファイルをクローズ
  6. プログラム終了
プログラムの作成

あらかじめ ROOT ユーザでログインします。

# cd /root/ProjectsGladeのプロジェクトの上のディレクトリへ移動します
# tar zxvf led_ctrl.tar.gzソースを展開すると新たに led_ctrl ディレクトリが作成されます
# cd led_ctrlled_ctrl プロジェクトのディレクトリへ移動します
# makemakeを実行してプログラムを生成します

/root/Projects/led_ctrl/src ディレクトリにプログラム led_ctrl が作成されます。

主なファイルの構成

main.cメイン
callbacks.c各Widgetのcallback処理
interface.cGladeが作成管理するWidget Interface定義
support.cGladeが作成管理する
rex5055.hrex5055用ヘッダ

ここでは、main.cおよびcallbacks.cについて説明します。

2. 画面説明

シンボル機能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


3. メイン(main.c)説明

dio_init REX-5055デバイスファイルのオープンと初期化
dio_exit REX-5055デバイスアファイルのクローズ
dio_write REX-5055デバイスファイルへの書き込み
DevNameChanged REX-5055デバイススペシャルファイルの変更
main mainルーチン
dio_init
REX-5055デバイスファイルのオープンと初期化
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 */
dio_exit
REX-5055デバイスアファイルのクローズ
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;
}
dio_write
REX-5055デバイスファイルへの書き込み
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 */
DevNameChanged
対象のデバイススペシャルファイルの切替
void
DevNameChanged(char *new )
{
    dio_exit();
    strcpy( dio_dev, new);
    dio_init();
}
main
メイン
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;
}


4. コールバック(callbacks.c)説明

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"シグナルに対するコールバック
SetLED_Stat
トグルボタンのオンオフ設定
LEDオンオフのトグルボタンWidgetのオンオフ設定を行います。
StartからEndで指定されたトグルボタンに対して以下のオンオフ制御処理をします。
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 );
  }
}
Out_LED_BitStat
指定ビットのLEDのオンオフ制御
BitNoで指定されたトグルボタンに対して以下のオンオフ制御処理をします。
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;
}
Out_LED_ByteStat
上位または下位バイトのLEDのオンオフ制御
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;
}
Out_LED_WordStat
全LED(16ビット)のオンオフ制御
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;
}
on_Topwin_delete_event
メインウィンドウ(Topwin)の "delete"シグナルに対するコールバック
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;
}
Out_bLED[1..16]_toggled
トグルボタン "1"〜"16"の "toggled"シグナルに対するコールバック
void
on_bLED1_toggled                       (GtkToggleButton *togglebutton,
                                        gpointer         user_data)
{
  Out_LED_BitStat( 0, togglebutton );
}
Out_bHighOn_clicked
Out_bHighOff_clicked
Out_bLowOn_clicked
Out_bLowOff_clicked
ボタン "High On","High Off","Low On","Low Off"の "clicked"シグナルに対するコールバック
void
on_bHighOn_clicked                     (GtkButton       *button,
                                        gpointer         user_data)
{
  Out_LED_ByteStat( DIO_HIGH, LED_ON, button );
}
Out_bWordOn_clicked
Out_bWordOff_clicked
ボタン "High-Low On","High-Low Off"の "clicked"シグナルに対するコールバック
void
on_bWordOn_clicked                     (GtkButton       *button,
                                        gpointer         user_data)
{
  Out_LED_WordStat( LED_ON, button );
}
on_combo_entry1_changed
コンボボックス "Device:"の "changed"シグナルに対するコールバック
void
on_combo_entry1_changed                (GtkEditable     *editable,
                                        gpointer         user_data)
{
  char *str;

  str = gtk_entry_get_text(GTK_ENTRY(editable));
  DevNameChanged( str );
}

5. 使用ファンクション説明


REX-5055 Linuxサンプルプログラム仕様書(End)---> 先頭へ