Jul 9, 2003
onlgw, Red Hat Linux 9 のシステムでのJavaRMIの実行
--- リモートマシンからの例題ソフトの実行 #5
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(http://www-online.kek.jp/~inoue/para-CAMAC/
Work/CAMAC-JavaRMI5.html)
高エネルギー加速器研究機構
素粒子原子核研究所
物理、オンライングループ
井上 栄二
目的
リモートマシン onlnote2 から、CC/NET上のSBCである onlsbc1 を
ターゲットマシンとして、JavaRMIとJNIを使ったWebアプリケーションで
CAMAC read/write を実行する。
(1). 構成
(2). ソフトウェア
(3). 実行
--------------------------------------------------------------------
(1). 構成
テストに使用するマシンは onlnote2 と onlsbc1 である。 マシン onlnote2 は
Windows XP が動作している。 Java1.4.1_02 である。 一方 onlsbc1 は、
アドバンテク社のSBC、PCM-9370である。 このSBCは、CAMACコントローラ上に
装着されている。 SBC上で動作している OSは Red Hat Linux 8.0 で、コンパク
トフラッシュ上に構成してある。 Javaのバージョンは1.4.1_02 である。
(2). ソフトウェア
CC/NETのSBC、ホスト名onlsbc1のURLをリモートマシンからアクセスすることで
CAMACへの read/write が実行できるような例題を作る。
(2-1). サーバ側、onlsbc1.kek.jp
(2-1-1). Javaのチェック
[inoue@onlsbc1 Web]$ java -version
java version "1.4.1_02"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.1_02-b06)
Java HotSpot(TM) Client VM (build 1.4.1_02-b06, mixed mode)
[inoue@onlsbc1 Web]$
(2-1-2). 実行環境
[inoue@onlsbc1 Web]$ env
HOSTNAME=onlsbc1.kek.jp
TERM=vt100
SHELL=/bin/bash
JLESSCHARSET=japanese
HISTSIZE=1000
SSH_CLIENT=130.87.153.116 32973 22
SSH_TTY=/dev/pts/0
USER=inoue
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;0
1:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.b
tm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:
*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*
.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;3
5:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
MAIL=/var/spool/mail/inoue
PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/java/bin:/home/inoue/bin
INPUTRC=/etc/inputrc
PWD=/mnt/inoue/Web
LANG=ja_JP.eucJP
SHLVL=1
HOME=/home/inoue
LOGNAME=inoue
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/bin/env
OLDPWD=/mnt/inoue
[inoue@onlsbc1 Web]$
(2-1-3). ソフトウェア(その1)
HelloWorld をアプレットで実行してみる。
[inoue@onlsbc1 inoue]$ pwd
/home/inoue
[inoue@onlsbc1 inoue]$ ls
[inoue@onlsbc1 inoue]$ mkdir -p public_html/myclasses
[inoue@onlsbc1 inoue]$ ls -lR
.:
合計 1
drwxrwxr-x 3 inoue inoue 1024 6月 16 09:06 public_html
./public_html:
合計 1
drwxrwxr-x 2 inoue inoue 1024 6月 16 09:06 myclasses
./public_html/myclasses:
合計 0
[inoue@onlsbc1 inoue]$
[inoue@onlsbc1 hello]$ pwd
/mnt/inoue/JavaRMI/getStart/examples/hello
[inoue@onlsbc1 hello]$ ls -l
合計 20
-rw-r--r-- 1 inoue inoue 1998 1月 25 2002 Hello.java
-rw-r--r-- 1 inoue inoue 2574 1月 25 2002 HelloApplet.java
-rw-r--r-- 1 inoue inoue 2779 1月 25 2002 HelloImpl.java
-rw-r--r-- 1 inoue inoue 245 9月 30 1998 hello.html
-rw-r--r-- 1 inoue inoue 81 9月 30 1998 policy
[inoue@onlsbc1 hello]$ export CLASSPATH=.:$HOME/public_html/myclasses
[inoue@onlsbc1 hello]$ env
HOSTNAME=onlsbc1.kek.jp
TERM=vt100
SHELL=/bin/bash
JLESSCHARSET=japanese
HISTSIZE=1000
SSH_CLIENT=130.87.153.116 32977 22
OLDPWD=/home/inoue
SSH_TTY=/dev/pts/0
USER=inoue
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;0
1:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.b
tm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:
*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*
.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;3
5:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
MAIL=/var/spool/mail/inoue
PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/java/bin:/home/inoue/bin
INPUTRC=/etc/inputrc
PWD=/mnt/inoue/JavaRMI/getStart/examples/hello
LANG=ja_JP.eucJP
SHLVL=1
HOME=/home/inoue
LOGNAME=inoue
CLASSPATH=.:/home/inoue/public_html/myclasses
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/bin/env
[inoue@onlsbc1 hello]$
[inoue@onlsbc1 hello]$ javac -d $HOME/public_html/myclasses Hello.java HelloImpl
.java HelloApplet.java
[inoue@onlsbc1 hello]$ ls -l ls -lR $HOME/public_html/myclasses
/home/inoue/public_html/myclasses:
合計 1
drwxrwxr-x 3 inoue inoue 1024 6月 16 09:24 examples
/home/inoue/public_html/myclasses/examples:
合計 1
drwxrwxr-x 2 inoue inoue 1024 6月 16 09:24 hello
/home/inoue/public_html/myclasses/examples/hello:
合計 5
-rw-rw-r-- 1 inoue inoue 224 6月 16 09:24 Hello.class
-rw-rw-r-- 1 inoue inoue 1284 6月 16 09:24 HelloApplet.class
-rw-rw-r-- 1 inoue inoue 1247 6月 16 09:24 HelloImpl.class
[inoue@onlsbc1 hello]$
[inoue@onlsbc1 hello]$ pwd
/mnt/inoue/JavaRMI/getStart/examples/hello
[inoue@onlsbc1 hello]$ ls -l
合計 20
-rw-r--r-- 1 inoue inoue 1998 1月 25 2002 Hello.java
-rw-r--r-- 1 inoue inoue 2574 1月 25 2002 HelloApplet.java
-rw-r--r-- 1 inoue inoue 2779 1月 25 2002 HelloImpl.java
-rw-r--r-- 1 inoue inoue 245 9月 30 1998 hello.html
-rw-r--r-- 1 inoue inoue 81 9月 30 1998 policy
[inoue@onlsbc1 hello]$ cat Hello.java
/*
* Copyright 2002 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* -Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* -Redistribution in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any
* kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
* WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
* EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY
* DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT OF OR
* RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR
* ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE
* FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT,
* SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF
* THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that Software is not designed, licensed or
* intended for use in the design, construction, operation or
* maintenance of any nuclear facility.
*/
package examples.hello;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Hello extends Remote {
String sayHello() throws RemoteException;
}
[inoue@onlsbc1 hello]$
[inoue@onlsbc1 hello]$ cat HelloApplet.java
/*
* Copyright 2002 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* -Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* -Redistribution in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any
* kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
* WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
* EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY
* DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT OF OR
* RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR
* ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE
* FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT,
* SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF
* THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that Software is not designed, licensed or
* intended for use in the design, construction, operation or
* maintenance of any nuclear facility.
*/
package examples.hello;
import java.applet.Applet;
import java.awt.Graphics;
import java.rmi.Naming;
import java.rmi.RemoteException;
public class HelloApplet extends Applet {
String message = "blank";
// "obj" is the identifier that we'll use to refer
// to the remote object that implements the "Hello"
// interface
Hello obj = null;
public void init() {
try {
obj = (Hello)Naming.lookup("//" +
getCodeBase().getHost() + "/HelloServer");
message = obj.sayHello();
} catch (Exception e) {
System.out.println("HelloApplet exception: " +
e.getMessage());
e.printStackTrace();
}
}
public void paint(Graphics g) {
g.drawString(message, 25, 50);
}
}
[inoue@onlsbc1 hello]$
[inoue@onlsbc1 hello]$ cat HelloImpl.java
/*
* Copyright 2002 Sun Microsystems, Inc. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the following
* conditions are met:
*
* -Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* -Redistribution in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* Neither the name of Sun Microsystems, Inc. or the names of
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* This software is provided "AS IS," without a warranty of any
* kind. ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND
* WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY
* EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY
* DAMAGES OR LIABILITIES SUFFERED BY LICENSEE AS A RESULT OF OR
* RELATING TO USE, MODIFICATION OR DISTRIBUTION OF THE SOFTWARE OR
* ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE
* FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT,
* SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF
* THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* You acknowledge that Software is not designed, licensed or
* intended for use in the design, construction, operation or
* maintenance of any nuclear facility.
*/
package examples.hello;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.RMISecurityManager;
import java.rmi.server.UnicastRemoteObject;
public class HelloImpl extends UnicastRemoteObject
implements Hello {
public HelloImpl() throws RemoteException {
super();
}
public String sayHello() {
return "Hello World!";
}
public static void main(String args[]) {
// Create and install a security manager
if (System.getSecurityManager() == null) {
System.setSecurityManager(new RMISecurityManager());
}
try {
HelloImpl obj = new HelloImpl();
// Bind this object instance to the name "HelloServer"
Naming.rebind("HelloServer", obj);
System.out.println("HelloServer bound in registry");
} catch (Exception e) {
System.out.println("HelloImpl err: " + e.getMessage());
e.printStackTrace();
}
}
}
[inoue@onlsbc1 hello]$
[inoue@onlsbc1 hello]$ cat hello.html
<HTML>
<title>Hello World</title>
<center> <h1>Hello World</h1> </center>
The message from the HelloServer is:
<p>
<applet codebase="myclasses/"
code="examples.hello.HelloApplet"
width=500 height=120>
</applet>
</HTML>
[inoue@onlsbc1 hello]$
[inoue@onlsbc1 hello]$ cat policy
grant {
// Allow everything for now
permission java.security.AllPermission;
};
[inoue@onlsbc1 hello]$
[inoue@onlsbc1 hello]$ rmic -d $HOME/public_html/myclasses examples.hello.HelloI
mpl
[inoue@onlsbc1 hello]$ ls -lR $HOME/public_html/myclasses
/home/inoue/public_html/myclasses:
合計 1
drwxrwxr-x 3 inoue inoue 1024 6月 16 09:24 examples
/home/inoue/public_html/myclasses/examples:
合計 1
drwxrwxr-x 2 inoue inoue 1024 6月 16 09:26 hello
/home/inoue/public_html/myclasses/examples/hello:
合計 10
-rw-rw-r-- 1 inoue inoue 224 6月 16 09:24 Hello.class
-rw-rw-r-- 1 inoue inoue 1284 6月 16 09:24 HelloApplet.class
-rw-rw-r-- 1 inoue inoue 1247 6月 16 09:24 HelloImpl.class
-rw-rw-r-- 1 inoue inoue 1448 6月 16 09:26 HelloImpl_Skel.class
-rw-rw-r-- 1 inoue inoue 2920 6月 16 09:26 HelloImpl_Stub.class
[inoue@onlsbc1 hello]$
[inoue@onlsbc1 hello]$ cp hello.html $HOME/public_html
[inoue@onlsbc1 hello]$
[inoue@onlsbc1 hello]$ ls -l $HOME/..
合計 3
drwx------ 2 harada harada 1024 5月 14 22:59 harada
drwx------ 4 inoue inoue 1024 6月 16 09:06 inoue
drwx------ 2 yasu yasu 1024 5月 14 22:59 yasu
[inoue@onlsbc1 hello]$ chmod o+x $HOME/../inoue
[inoue@onlsbc1 hello]$ ls -l $HOME/..
合計 3
drwx------ 2 harada harada 1024 5月 14 22:59 harada
drwx-----x 4 inoue inoue 1024 6月 16 09:06 inoue
drwx------ 2 yasu yasu 1024 5月 14 22:59 yasu
[inoue@onlsbc1 hello]$
[root@onlsbc1 hello]# ls -l /etc/httpd/conf
合計 50
-rw-r--r-- 1 root root 34817 9月 5 2002 httpd.conf
-rw-r--r-- 1 root root 12959 9月 5 2002 magic
[root@onlsbc1 hello]# mv /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf-o
rg
[root@onlsbc1 hello]# cp /etc/httpd/conf/httpd.conf-org /etc/httpd/conf/httpd.co
nf
[root@onlsbc1 hello]# ls -l /etc/httpd/conf
合計 86
-rw-r--r-- 1 root root 34817 6月 16 10:30 httpd.conf
-rw-r--r-- 1 root root 34817 9月 5 2002 httpd.conf-org
-rw-r--r-- 1 root root 12959 9月 5 2002 magic
[root@onlsbc1 hello]# vi /etc/httpd/conf/httpd.conf
:
#ServerName new.host.name:80
ServerName onlsbc1.kek.jp:80
:
#
# UserDir is disabled by default since it can confirm the presence
# of a username on the system (depending on home directory
# permissions).
#
#UserDir disable
#
# To enable requests to /~user/ to serve the user's public_html
# directory, remove the "UserDir disable" line above, and uncomment
# the following line instead:
#
UserDir public_html
:
"/etc/httpd/conf/httpd.conf" 1034L, 34846C written
[root@onlsbc1 hello]#
[root@onlsbc1 html]# ls -l /home
合計 3
drwx------ 2 harada harada 1024 5月 14 22:59 harada
drwxr-xr-x 4 inoue inoue 1024 6月 16 09:06 inoue
drwx------ 2 yasu yasu 1024 5月 14 22:59 yasu
[root@onlsbc1 html]# mkdir -p /home/onlsbc1/public_html
[root@onlsbc1 html]# ls -l /home
合計 4
drwx------ 2 harada harada 1024 5月 14 22:59 harada
drwxr-xr-x 4 inoue inoue 1024 6月 16 09:06 inoue
drwxr-xr-x 3 root root 1024 6月 16 15:09 onlsbc1
drwx------ 2 yasu yasu 1024 5月 14 22:59 yasu
[root@onlsbc1 html]#
[root@onlsbc1 html]# ls -l /home/inoue/public_html
合計 5
-rw-r--r-- 1 inoue inoue 245 6月 16 09:28 hello.html
-rw-r--r-- 1 inoue inoue 2145 6月 16 10:38 index.html
drwxrwxr-x 3 inoue inoue 1024 6月 16 09:24 myclasses
[root@onlsbc1 html]# cp /home/inoue/public_html/index.html /home/onlsbc1/public_
html
[root@onlsbc1 html]#
[root@onlsbc1 html]# pwd
/var/www/html
[root@onlsbc1 html]# ls -l
合計 0
[root@onlsbc1 html]# ln -s /home/onlsbc1/public_html/index.html index.html
[root@onlsbc1 html]# ls -l
合計 0
lrwxrwxrwx 1 root root 36 6月 16 15:12 index.html -> /home/onl
sbc1/public_html/index.html
[root@onlsbc1 html]#
[root@onlsbc1 hello]# /sbin/service httpd start
httpdを起動中: [ OK ]
[root@onlsbc1 hello]#
[inoue@onlsbc1 hello]$ rmiregistry &
[1] 696
[inoue@onlsbc1 hello]$ ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:41 ? 00:00:04 init
root 2 1 0 14:41 ? 00:00:00 [keventd]
root 3 1 0 14:41 ? 00:00:00 [kapmd]
root 4 1 0 14:41 ? 00:00:00 [ksoftirqd_CPU0]
root 5 1 0 14:41 ? 00:00:00 [kswapd]
root 6 1 0 14:41 ? 00:00:00 [bdflush]
root 7 1 0 14:41 ? 00:00:00 [kupdated]
root 8 1 0 14:41 ? 00:00:00 [mdrecoveryd]
root 12 1 0 14:41 ? 00:00:00 [kjournald]
root 63 1 0 14:41 ? 00:00:00 [khubd]
root 433 1 0 14:43 ? 00:00:00 syslogd -m 0
root 437 1 0 14:43 ? 00:00:00 klogd -x
rpc 448 1 0 14:43 ? 00:00:00 [portmap]
root 511 1 0 14:43 ? 00:00:01 /usr/sbin/sshd
root 523 1 0 14:43 tty1 00:00:00 /sbin/mingetty tty1
root 524 1 0 14:43 tty2 00:00:00 /sbin/mingetty tty2
root 525 1 0 14:43 tty3 00:00:00 /sbin/mingetty tty3
root 526 1 0 14:43 tty4 00:00:00 /sbin/mingetty tty4
root 527 1 0 14:43 tty5 00:00:00 /sbin/mingetty tty5
root 528 1 0 14:43 tty6 00:00:00 /sbin/mingetty tty6
root 533 511 0 14:58 ? 00:00:00 /usr/sbin/sshd
inoue 535 533 0 14:58 ? 00:00:01 [sshd]
inoue 536 535 0 14:58 pts/0 00:00:00 -bash
root 589 1 0 14:59 ? 00:00:00 [rpciod]
root 590 1 0 14:59 ? 00:00:00 [lockd]
root 660 1 0 15:15 ? 00:00:00 /usr/sbin/httpd
apache 663 660 0 15:15 ? 00:00:00 [httpd]
apache 664 660 0 15:15 ? 00:00:00 [httpd]
apache 665 660 0 15:15 ? 00:00:00 [httpd]
apache 666 660 0 15:15 ? 00:00:00 [httpd]
apache 667 660 0 15:15 ? 00:00:00 [httpd]
apache 668 660 0 15:15 ? 00:00:00 [httpd]
apache 669 660 0 15:15 ? 00:00:00 [httpd]
apache 670 660 0 15:15 ? 00:00:00 [httpd]
inoue 696 536 62 15:22 pts/0 00:00:03 rmiregistry
inoue 708 536 0 15:22 pts/0 00:00:00 ps -ef
[inoue@onlsbc1 hello]$
[inoue@onlsbc1 hello]$ java -Djava.rmi.server.codebase=http://onlsbc1.kek.jp/~in
oue/myclasses/ -Djava.security.policy=/mnt/inoue/JavaRMI/getStart/examples/hello
/policy examples.hello.HelloImpl
HelloServer bound in registry
(2-1-3A). サーバへのアクセス
webブラウザ、IEを使ってサーバにアクセスした結果
Webブラウザ、IEで "http://onlsbc1.kek.jp/~inoue/hello.html" に
アクセスすると、"Hello World!"と表示される。
(2-1-4). ソフトウェア(その2)
CAMAC-JavaRMI4.htmlで使用したソフトをアプレット化して実行してみる。
(2-1-4A). GUI部のテスト
ClientImpl.java とGUIの部分のアプレットを一体にして動かしてみる。
注. この部分は、ホスト名 onlgw 上でテストした。
[inoue@onlgw Swing]$ pwd
/home/inoue/public_html/Web/Swing
[inoue@onlgw Swing]$ more web3.java
// File Name: web3.java
// Date: Jun 24, 2003
// Edited by: Eiji Inoue
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
import java.io.*;
import java.rmi.*;
import java.rmi.server.*;
public class web3 extends JApplet implements ActionListener {
JLabel jLabel1 = new JLabel("CAMAC Command:");
JLabel jLabel2 = new JLabel("Write Data :");
JPanel jPanel1 = new JPanel();
JTextField tField = new JTextField("5,1,0");
JTextField tField2 = new JTextField("ffff");
JTextArea tArea = new JTextArea(10,30);
JButton btAppend = new JButton("GO");
String host = "onlsbc1";
ClientImpl obj = new ClientImpl( host );
public void init() { this.setSize(new Dimension(400,300));
jPanel1.setLayout(null);
jLabel1.setBounds(new Rectangle(12, 34, 120, 22));
jLabel2.setBounds(new Rectangle(12, 64, 120, 22));
tField.setBounds(new Rectangle(120, 34, 120, 22));
tField.setFont(new Font("Serif",Font.PLAIN,18));
tField2.setBounds(new Rectangle(120, 64, 120, 22));
tField2.setFont(new Font("Serif",Font.PLAIN,18));
// String str = "上の窓のところにCAMACコマンドおよびデータを記入後、右上の「G
O」のボタンを押すと、";
// str += "CAMACコマンドの実行結果がこの窓の部分に表示されます。";
String str = "For scroll down to the last message, left-click the mouse butt
on once on blank area following this text line.";
// str += "\n";
tArea.setText(str); //デフォルトのテキストを表示
tArea.setFont(new Font("Serif",Font.PLAIN,14));
tArea.setTabSize(4); //タブサイズを設定
tArea.setLineWrap(true); //右辺で自動折り返しにする
tArea.setSelectionColor(Color.lightGray); //反転選択範囲の背景色
tArea.setSelectedTextColor(Color.blue); //反転選択範囲の文字色
tArea.setEnabled(false); //テキストエリアがキー入力を取らないようにする
btAppend.setBounds(new Rectangle(265, 64, 76, 22));
btAppend.addActionListener(this);
this.getContentPane().add(jLabel1, BorderLayout.NORTH);
this.getContentPane().add(jPanel1, BorderLayout.CENTER);
// JScrollPane jScrollPane2 = new JScrollPane(tArea);
JScrollPane jScrollPane2 = new JScrollPane();
// jScrollPane2.getViewport().setView(tArea);
jScrollPane2.setPreferredSize( new Dimension (300, 300 ));
jScrollPane2.getViewport().add(tArea);
jScrollPane2.setBounds(new Rectangle(10, 120, 485, 165));
jPanel1.add(jScrollPane2);
jPanel1.add(jLabel1);
jPanel1.add(jLabel2);
jPanel1.add(tField);
jPanel1.add(tField2);
jPanel1.add(btAppend);
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==btAppend){ //「末尾に追加」ボタン
tArea.append("\n" + "web3: Sent CAMAC command = " + tField.getText() + ",
data =" + tField2.getText());
// ClientImpl.mess = tField.getText();
ClientImpl.acmd = tField.getText();
ClientImpl.adat = tField2.getText();
obj.keyincmd();
tArea.append( "\n" + ClientImpl.mess );
tArea.append( "\n" + "web3: Received Command field = " + Integer.toHexStr
ing( ClientImpl.scmd[0] ) + ", Data field = " + Integer.toHexString( ClientImp
l.sdat[0] ) );
tArea.append("\n");
}
}
/*
protected void log( final String s){
Runnable r = new Runnable(){
public void run(){
tArea.append("\n" + "log: " + s);
}
};
SwingUtilities.invokeLater(r);
return;
}
*/
}
/**/
// File Name: ClientImpl.java
// Date: Apr 28, 2003
// Edited by: Eiji Inoue
//import java.io.*;
//import java.rmi.*;
//import java.rmi.server.*;
class ClientImpl implements Client {
public static final int CMD_F16_A0_N3 = 0xE0030010;
public static final int CMD_F0_A0_N3 = 0xE0030000;
public static final char COM = ',';
public static final char QUIT = 'q';
public static final char EXAM = 'e';
public static final char STAR = 'g';
public static final char SIN = 's';
public static final char DMA = 'd';
public static int scmd[] = new int[100];
public static int sdat[] = new int[100];
public static String mess;
public static String acmd;
public static String adat;
static Server server;
static web3 web3s;
public ClientImpl(String host) {
try{
UnicastRemoteObject.exportObject(this);
Server server = (Server)Naming.lookup("//"+host+"/Server");
server.register(this);
ClientImpl.server = server;
} catch ( Exception e ) {
System.err.println ("Failed to setup for RMI");
}
}
public void camac_exec( int l_count, int examN ) {
int[] s_cmd, s_dat;
int[] array_sizes = {4096*16};
int s_length;
int j;
try{
System.out.println(" RMI: Client side: ");
// to send int array
System.out.println(" RMI: Sent CAMAC command: array le
ngth =" + l_count );
for (int i = 0; i < l_count + 1; i++)
System.out.println(" ClientImpl.scmd[" + i + "]
= 0x" + Integer.toHexString( ClientImpl.scmd[i]) + ", ClientImpl.sdat[" + i + "
] = 0x" + Integer.toHexString( ClientImpl.sdat[i]));
ClientImpl.server.camac_cmd(ClientImpl.scmd, ClientImpl.
sdat, l_count, examN );
} catch ( Exception e ) {
System.err.println ("Failed to setup for RMI step2");
}
}
public void camac_reply( int[] c_reply, int[] d_reply, int[] rcmd_buf, i
nt[] rrpl_buf, int l_reply) throws RemoteException {
System.out.println();
System.out.println(" RMI: Received CAMAC reply: " + "array len
gth = " + l_reply);
for (int i = 0; i < l_reply + 1; i++) {
System.out.println(" c_reply[" + i + "] = 0x" + Integer
.toHexString(c_reply[i]) + ", d_reply[" + i + "] = 0x" + Integer.toHexString(d_r
eply[i]));
}
for (int i = 0; i < l_reply + 1; i += 2) {
System.out.println(" rcmd_buf[" + i + "] = 0x" + Intege
r.toHexString(rcmd_buf[i]) + ", rcmd_buf[" + ( i + 1 ) + "] = 0x" + Integer.toHe
xString(rcmd_buf[i+1]));
System.out.println(" rrpl_buf[" + i + "] = 0x" + Intege
r.toHexString(rrpl_buf[i]) + ", rrpl_buf[" + ( i + 1 ) + "] = 0x" + Integer.toHe
xString(rrpl_buf[i+1]));
}
keyincmd();
// keyincmd( "next" );
}
// TX
// +---------+-------+-------+-------+-------+---------------------------+
// | cmd | N | A | F | | 24-bit DATA |
// +---------+-------+-------+-------+-------+---------------------------+
//
// cmd Header pattern
// +-------------+---------+---------+---------+---------------+
// | | Packet | Packet | Packet | Single |
// | | Start | Period | End | Frame Packet |
// +-------------+---------+---------+---------+---------------+
// | CAMAC | | | | |
// | Operation | 0xC0 | 0x8C | 0xA0 | 0xE0 |
// +-------------+---------+---------+---------+---------------+
// | CAMAC | | | | |
// | LAM | -- | -- | -- | 0xE8 |
// +-------------+---------+---------+---------+---------------+
// | DAQ Trigger | | | | |
// | out | 0xD0 | 0x90 | 0xB0 | 0xF0 |
// +-------------+---------+---------+---------+---------------+
// | DAQ | | | | |
// | Interrupt | -- | -- | -- | 0xF8 |
// +-------------+---------+---------+---------+---------------+
//
// CAMAC N.
// 55 54 53 52 51 50 49 48 47 32
// +--------------------+----------------+-------------------+---------------+
// | - - - N16 | N8 N4 N2 N1 | | | | |
// +--------------------+----------------+-------------------+---------------+
//
// CAMAC A.
// 47 46 45 44 43 42 41 40 32
// +--------------------+-------------------+----------------+---------------+
// | - - - - | A8 A4 A2 A1 | | |
// +--------------------+-------------------+----------------+---------------+
//
// CAMAC F.
// 39 38 37 36 35 34 33 32
// +--------------------+----------------+------------------+----------------+
// | - - - F16 | F8 F4 F2 F1 |
// +--------------------+----------------+------------------+----------------+
//
public void cmdbld( int n, int a, int f, int l_count ){
// CAMAC Single action.
System.out.println ( " Make up CAMAC Command of Single action." );
System.out.println ( " Accepted data: n = " + n + ", a = " + a + ", f
= " + f + ", l_count = " + l_count );
a = a << 8;
n = n << 16;
ClientImpl.scmd [ l_count -1 ] = 0xE0000000 | ( 0x0000001F & f ) | ( 0x000
00F00 & a ) | ( 0x001F0000 & n );
System.out.println ( " ClientImpl.scmd [ " + ( l_count -1 ) + " ] = " +
ClientImpl.scmd [ l_count -1 ] + "(dec), " + "0x" + Integer.toHexString( ClientI
mpl.scmd [ l_count -1 ] ) + "(hex)" );
System.out.println ( " ClientImpl.sdat [ " + ( l_count -1 ) + " ] = " +
ClientImpl.sdat [ l_count -1 ] + "(dec), " + "0x" + Integer.toHexString( ClientI
mpl.sdat [ l_count -1 ] ) + "(hex)" );
// CAMAC LAM handling.
// CAMAC DMA action.
}
// public void keyincmd( String s2) {
public void keyincmd() {
// public String keyincmd( ) {
char cstr[] = new char[20];
char n[] = new char[4];
char a[] = new char[4];
char f[] = new char[4];
char kc[] = new char[4];
int c[] = new int[3];
int i, i2, count, loop, k_error;
int spoin, epoin;
int examN;
String cn = "0", ca = "0", cf = "0";
String tmp;
String nchk[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "
b", "c", "d", "e", "f" };
// String s1 = "keyincmd: " + "Received CAMAC Command =" + s2 + "\n" + "key
incmd: " + "Sent Reply command field = 0xe0030010" + ", data field = 0x555";
String s1 = "keyincmd: " + "ClientImpl.acmd =" + ClientImpl.acmd + ", Cl
ientImpl.adat =" + ClientImpl.adat + "\n" + "keyincmd: " + "Sent Reply command f
ield = 0xe0030010" + ", data field = 0x555";
mess = s1;
ClientImpl.scmd[0] = 0xe0030010;
ClientImpl.sdat[0] = 0x555;
// return (s1);
return;
/*
InputStream inStream = System.in;
InputStreamReader InData = new InputStreamReader ( inStream );
int s_flg = 0;
try{
spoin = 0;
epoin = 0;
loop = 2;
k_error = 0;
examN = 0;
System.out.println ( "" );
System.out.println ( " (1). Enter 'q' to quit." );
System.out.println ( " (2). Enter 'e' to execute an example program." )
;
System.out.println ( " (3). Enter 's' to set up Single action CAMAC com
mand");
// System.out.println ( " (4). Enter 'd' to set up DMA action CAMAC comm
and");
System.out.println ( " (4). Enter 'g' to start up command execution." )
;
System.out.println ( "" );
while ( loop > 1 ) {
if ( k_error == 1 ) {
System.out.println ( "" );
k_error = 0;
}
// Execution command interpret.
System.out.print ( "Execution Command('q' or 'e' or 'g' or 's' or
'd') = ");
count = InData.read ( cstr, 0, 19 );
String str1 = new String ( cstr );
if ( QUIT == str1.charAt ( 0 ) ) {
s_flg = 2;
break;
} else if ( EXAM == str1.charAt ( 0 )) {
// example program execution;
System.out.println( " What's number of program which do you
want to execute ? --- default:[1] ");
System.out.println( " exam1:[1], exam2:[2], exam3:[3], exam4
:[4], exam5:[5], exam6:[6], exam21:[7], pio_write_read[8], read:[9], read_write:
[a], reg_dump:[b], write:[c], write_read:[d]");
System.out.print( " Number = " );
count = InData.read ( cstr, 0, 19 );
String str2 = new String ( cstr );
cn = str2.substring ( 0, 1 );
cn.getChars(0, 1, kc, 0);
try {
switch ( kc[0] ) {
case '1':
s_flg = 1;
examN = 1;
System.out.println( " Ok. Start up an example progr
am 1. " );
break;
case '2':
s_flg = 1;
examN = 2;
System.out.println( " Ok. Start up an example progr
am 2. " );
break;
case '3':
s_flg = 1;
examN = 3;
System.out.println( " Ok. Start up an example progr
am 3. " );
break;
case '4':
s_flg = 1;
examN = 4;
System.out.println( " Ok. Start up an example progr
am 4. " );
break;
case '5':
s_flg = 1;
examN = 5;
System.out.println( " Ok. Start up an example progr
am 5. " );
break;
case '6':
s_flg = 1;
examN = 6;
System.out.println( " Ok. Start up an example progr
am 6. " );
break;
case '7':
s_flg = 1;
examN = 7;
System.out.println( " Ok. Start up an example progr
am 21. " );
break;
case '8':
s_flg = 1;
examN = 8;
System.out.println( " Ok. Start up an example progr
am pio_write_read. " );
break;
case '9':
s_flg = 1;
examN = 9;
System.out.println( " Ok. Start up an example progr
am read. " );
break;
case 'a':
s_flg = 1;
examN = 0xa;
System.out.println( " Ok. Start up an example progr
am read_write.");
break;
case 'b':
s_flg = 1;
examN = 0xb;
System.out.println( " Ok. Start up an example progr
am reg_dump.");
break;
case 'c':
s_flg = 1;
examN = 0xc;
System.out.println( " Ok. Start up an example progr
am write.");
break;
case 'd':
s_flg = 1;
examN = 0xd;
System.out.println( " Ok. Start up an example progr
am write_read.");
break;
default:
break;
}
break;
} catch ( NumberFormatException e ) {
System.out.println( " NumberFormatExeception occurred !!
" );
System.out.println( "" );
}
} else if ( STAR == str1.charAt ( 0 )) {
if ( epoin == 0 ) {
s_flg = 5;
System.out.print ( " Command bufer is empty !!");
System.out.println ( "" );
continue;
} else {
// camacstart();
s_flg = 1;
examN = 0xe;
System.out.println( " Ok. Start up CAMAC execution. " );
break;
}
} else if ( SIN == str1.charAt ( 0 )) {
// Single action.
s_flg = 3;
} else if ( DMA == str1.charAt ( 0 )) {
// DNA action.
s_flg = 4;
System.out.println ( " DMA Action." );
} else {
s_flg = 5;
System.out.println ( " Unmanageable Action." );
continue;
}
tmp = str1.substring ( 0, count -1 );
System.out.println ( " Execution Command: " + tmp );
if ( s_flg == 4 ) {
// DMA mode & word count set up.
// Q stop, Q Ignore, Q request, Q scan.
System.out.println ( " DMA set up: " );
System.out.println ( " DMA set up: DMA mode: " );
System.out.println ( " DMA set up: DMA wor count: " );
}
// N,A,F CAMAC command set up.
System.out.print ( "CAMAC Command (N, A, F)(dec) = " );
count = InData.read ( cstr, 0, 19 );
String str = new String ( cstr );
// Single action set up.
i2 = 0;
for ( i = 0; i < str.length(); i++ ) {
if ( COM == str.charAt ( i ) ) {
c[ i2++ ] = i;
}
}
cn = str.substring ( 0, c[ 0 ] );
ca = str.substring ( c[ 0 ] +1, c[ 1 ] );
cf = str.substring ( c[ 1 ] +1, count-1 );
try{
int in = Integer.parseInt(cn, 10);
if ( ( in < 0 ) || ( in > 25 ) ) {
System.out.println ( " Command Error: Illegal value of N: O
ut of range !! " );
k_error = 1;
continue;
}
int ia = Integer.parseInt(ca, 10);
if ( ( ia < 0 ) || ( ia > 15 ) ) {
System.out.println ( " Command Error: Illegal value of A: O
ut of range !! " );
k_error = 1;
continue;
}
int inf = Integer.parseInt(cf, 10);
if ( ( inf < 0 ) || ( inf > 31 ) ) {
System.out.println ( " Command Error: Illegal value of F: O
ut of range !! " );
k_error = 1;
continue;
}
if ( ( inf >= 16 ) && ( inf <= 23 ) ) {
// データ入力要求
int datf = 0;
do {
System.out.print ( " Write Data(hex) = " );
count = InData.read ( cstr, 0, 19 );
str = new String ( cstr );
String cdat = str.substring ( 0, count -1 );
for ( i = 0; i < count -1; i++) {
String cdat1 = cdat.substring ( i, i + 1 );
// numerical check
for ( i2 = 0; i2 < 16; i2++ ) {
if ( cdat1.equals( nchk [ i2 ] ) ) {
datf = 0;
break;
}
datf = 1;
}
if ( datf == 1 ) {
System.out.println ( " Data error: Illegal character -
-- " + cdat1 + " !" );
System.out.println ( "" );
break;
}
}
if ( datf == 1) {
continue;
}
ClientImpl.sdat [ loop -1 ] = Integer.parseInt( cdat, 16);
System.out.println ( " 入力されたData: " + ClientImpl.sdat
[ loop -1 ] + "(dec), 0x" + Integer.toHexString( ClientImpl.sdat [ loop -1 ] ) +
"(hex)");
if ( ( ClientImpl.sdat [ loop -1 ] < 0 ) || ( ClientImpl.sdat
[ loop -1 ] > 0xffffff ) ) {
System.out.println ( " Data error: Out of range --- " +
ClientImpl.sdat [ loop -1 ] + " !" );
System.out.println ( "" );
datf = 1;
continue;
}
} while ( datf == 1 );
}
// CAMAC command set up.
cmdbld ( in, ia, inf, loop );
epoin++;
loop++;
System.out.println ( "" );
} catch (NumberFormatException e) {
System.out.println(" NumberFormatException occurred !!");
System.out.println ( "" );
}
}
// end of while loop
if ( s_flg == 1 ) {
camac_exec( loop -2, examN );
} else if ( s_flg == 2 ) {
System.out.println ( " Quited Program. Enter Ctl-C. " );
}
} catch ( IOException e ) {
System.out.println ( " IOException Error:" + e + " !");
}
*/
}
/*
public static void main(String argv[]) throws Exception{
String host = (argv.length == 1) ? argv[0] : "localhost";
ClientImpl obj = new ClientImpl(host);
obj.keyincmd();
}
*/
}
[inoue@onlgw Swing]$
GUIの部分の動作をテストする。 合わせて、アプレットとClientImplクラスの
間のメッセージのやり取りを調べる。
[inoue@onlgw Swing]$ pwd
/home/inoue/public_html/Web/Swing
[inoue@onlgw Swing]$ make clean
rm -f *.class cam.h libMyImpOfcam.so *.o core *~
[inoue@onlgw Swing]$ make
javac web3.java
javac cam.java
javah -jni cam
gcc -c camac.c
gcc -O -shared -I/usr/java/include -I/usr/java/include/linux cam.c camac.o -o li
bMyImpOfcam.so
javac ServerImpl.java
rmic ClientImpl
rmic ServerImpl
[inoue@onlgw Swing]$
IEを使って、onlgw 上の web3.htmlファイルをアクセスするとGUI部の
アプレットがが起動した。
ok. アプレットweb3とClientImpl.keyincmd()との間でのメッセージの受け渡し
は正しく実行できている。
(2-1-4B). CAMACアクセス部を含めた動作確認
CAMACアクセスの部分はポートI/Oコマンドを使って実行する。
CAMAC-JavaRMI4.htmlで使用したソフトを修正して使用した。
注. 以降のテストはサーバマシンとして再び、CC/NETのSBC、ホスト名 onlsbc1
を使用している。
(2-1-4B-1). web3.java
[inoue@onlsbc1 Web]$ more web3.java
// File Name: web3.java
// Date: Jun 24, 2003
// Edited by: Eiji Inoue
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import javax.swing.*;
import java.io.*;
import java.rmi.*;
import java.rmi.server.*;
public class web3 extends JApplet implements ActionListener {
JLabel jLabel1 = new JLabel("CAMAC Command:");
JLabel jLabel2 = new JLabel("Write Data (Hex) :");
JPanel jPanel1 = new JPanel();
JTextField tField = new JTextField("5,1,0");
JTextField tField2 = new JTextField("ffff");
JTextArea tArea = new JTextArea(10,30);
JButton btAppend = new JButton("GO");
String host = "onlsbc1";
// ClientImpl obj = new ClientImpl( host );
ClientImpl obj = new ClientImpl( );
// obj.ClientImpl1( String host );
public void init() { this.setSize(new Dimension(400,300));
jPanel1.setLayout(null);
jLabel1.setBounds(new Rectangle(12, 34, 120, 22));
jLabel2.setBounds(new Rectangle(12, 64, 120, 22));
tField.setBounds(new Rectangle(120, 34, 120, 22));
tField.setFont(new Font("Serif",Font.PLAIN,18));
tField2.setBounds(new Rectangle(120, 64, 120, 22));
tField2.setFont(new Font("Serif",Font.PLAIN,18));
// String str = "上の窓のところにCAMACコマンドおよびデータを記入後、右上の「G
O」のボタンを押すと、";
// str += "CAMACコマンドの実行結果がこの窓の部分に表示されます。";
String str = "For scroll down to the last message, left-click the mouse butt
on once on blank area following this text line.";
// str += "\n";
tArea.setText(str); //デフォルトのテキストを表示
tArea.setFont(new Font("Serif",Font.PLAIN,14));
tArea.setTabSize(4); //タブサイズを設定
tArea.setLineWrap(true); //右辺で自動折り返しにする
tArea.setSelectionColor(Color.lightGray); //反転選択範囲の背景色
tArea.setSelectedTextColor(Color.blue); //反転選択範囲の文字色
tArea.setEnabled(false); //テキストエリアがキー入力を取らないようにする
btAppend.setBounds(new Rectangle(265, 64, 76, 22));
btAppend.addActionListener(this);
this.getContentPane().add(jLabel1, BorderLayout.NORTH);
this.getContentPane().add(jPanel1, BorderLayout.CENTER);
JScrollPane jScrollPane2 = new JScrollPane(tArea);
// JScrollPane jScrollPane2 = new JScrollPane();
// jScrollPane2.getViewport().setView(tArea);
jScrollPane2.setPreferredSize( new Dimension (300, 300 ));
jScrollPane2.getViewport().add(tArea);
jScrollPane2.setBounds(new Rectangle(10, 120, 485, 165));
jPanel1.add(jScrollPane2);
jPanel1.add(jLabel1);
jPanel1.add(jLabel2);
jPanel1.add(tField);
jPanel1.add(tField2);
jPanel1.add(btAppend);
// setVisible(true);
// tArea.requestFocus();
// try {
// obj = (Hello)Naming.lookup("//" + getCodeBase().getHost() + "/HelloSer
ver");
// message = obj.sayHello();
// } catch (Exception e) {
// System.out.println("HelloApplet exception: " + e.getMessage());
// e.printStackTrace();
// }
// public ClientImpl(String host) {
try{
// UnicastRemoteObject.exportObject(this);
UnicastRemoteObject.exportObject(obj);
// UnicastRemoteObject.exportObject(super);
// Server server = (Server)Naming.lookup("//"+host+"/Server");
Server server = (Server)Naming.lookup("//" + getCodeBase().ge
tHost() + "/Server");
// server.register(this);
server.register(obj);
// server.register(super);
ClientImpl.server = server;
tArea.append( "\n" + "Success to setup for RMI" );
} catch ( Exception e ) {
// System.err.println ("Failed to setup for RMI");
tArea.append( "\n" + "Failed to setup for RMI" );
}
// }
}
public void actionPerformed(ActionEvent e){
if(e.getSource()==btAppend){ //「末尾に追加」ボタン
tArea.append("\n" + "web3: Sent CAMAC command = " + tField.getText() + ",
data =" + tField2.getText());
// ClientImpl.mess = tField.getText();
ClientImpl.acmd = tField.getText();
ClientImpl.adat = tField2.getText();
obj.keyincmd();
tArea.append( "\n" + ClientImpl.mess );
tArea.append( "\n" + "web3: Received Command field = " + Integer.toHexStr
ing( ClientImpl.scmd[0] ) + ", Data field = " + Integer.toHexString( ClientImp
l.sdat[0] ) );
tArea.append("\n");
}
}
/*
protected void log( final String s){
Runnable r = new Runnable(){
public void run(){
tArea.append("\n" + "log: " + s);
}
};
SwingUtilities.invokeLater(r);
return;
}
*/
}
/**/
// File Name: ClientImpl.java
// Date: Apr 28, 2003
// Edited by: Eiji Inoue
//import java.io.*;
//import java.rmi.*;
//import java.rmi.server.*;
class ClientImpl implements Client {
public static final int CMD_F16_A0_N3 = 0xE0030010;
public static final int CMD_F0_A0_N3 = 0xE0030000;
public static final char COM = ',';
public static final char QUIT = 'q';
public static final char EXAM = 'e';
public static final char STAR = 'g';
public static final char SIN = 's';
public static final char DMA = 'd';
public static int scmd[] = new int[100];
public static int sdat[] = new int[100];
public static String mess;
public static String acmd;
public static String adat;
static Server server;
static web3 web3s;
/*
// public void ClientImpl1(String host) {
public ClientImpl(String host) {
try{
UnicastRemoteObject.exportObject(this);
// UnicastRemoteObject.exportObject(super);
Server server = (Server)Naming.lookup("//"+host+"/Server");
server.register(this);
// server.register(super);
ClientImpl.server = server;
String s3 = "Success to setup for RMI";
mess = s3;
} catch ( Exception e ) {
// System.err.println ("Failed to setup for RMI");
String s3 = "Failed to setup for RMI";
mess = s3;
}
}
*/
public void camac_exec( int l_count, int examN ) {
int[] s_cmd, s_dat;
int[] array_sizes = {4096*16};
int s_length;
int i, j;
String s2 = "";
s2 = mess + "\n" + "Top of camac_exec";
mess = s2;
try{
// System.out.println(" RMI: Client side: ");
s2 = mess + "\n" + "camac_exec: RMI: Client side: ";
mess = s2;
// to send int array
// System.out.println(" RMI: Sent CAMAC command: array le
ngth =" + l_count );
s2 = mess + "\n" + "camac_exec: RMI: Sent CAMAC command
: array legth =" + l_count;
mess = s2;
/*
i = 0;
s2 = mess + "\n" + "camac_exec: ClientImpl.scmd[" +
i + "] = 0x" + Integer.toHexString( ClientImpl.scmd[i]) + ", ClientImpl.sdat["
+ i + "] = 0x" + Integer.toHexString( ClientImpl.sdat[i]);
mess = s2;
*/
for (i = 0; i < l_count + 1; i++) {
// System.out.println(" ClientImpl.scmd[" + i + "]
= 0x" + Integer.toHexString( ClientImpl.scmd[i]) + ", ClientImpl.sdat[" + i + "
] = 0x" + Integer.toHexString( ClientImpl.sdat[i]));
s2 = mess + "\n" + "camac_exec: ClientImpl.scmd
[" + i + "] = 0x" + Integer.toHexString( ClientImpl.scmd[i]) + ", ClientImpl.sda
t[" + i + "] = 0x" + Integer.toHexString( ClientImpl.sdat[i]);
mess = s2;
}
s2 = mess + "\n" + "before ClientImpl.server.camac_cmd";
mess = s2;
ClientImpl.server.camac_cmd(ClientImpl.scmd, ClientImpl.
sdat, l_count, examN );
s2 = mess + "\n" + "after ClientImpl.server.camac_cmd";
mess = s2;
} catch ( Exception e ) {
// System.err.println ("Failed to setup for RMI step2");
s2 = mess + "\n" + "Failed to setup for RMI step2";
mess = s2;
}
s2 = mess + "\n" + "End of camac_exec";
mess = s2;
}
public void camac_reply( int[] c_reply, int[] d_reply, int[] rcmd_buf, i
nt[] rrpl_buf, int l_reply) throws RemoteException {
System.out.println();
System.out.println(" RMI: Received CAMAC reply: " + "array len
gth = " + l_reply);
for (int i = 0; i < l_reply + 1; i++) {
System.out.println(" c_reply[" + i + "] = 0x" + Integer
.toHexString(c_reply[i]) + ", d_reply[" + i + "] = 0x" + Integer.toHexString(d_r
eply[i]));
}
for (int i = 0; i < l_reply + 1; i += 2) {
System.out.println(" rcmd_buf[" + i + "] = 0x" + Intege
r.toHexString(rcmd_buf[i]) + ", rcmd_buf[" + ( i + 1 ) + "] = 0x" + Integer.toHe
xString(rcmd_buf[i+1]));
System.out.println(" rrpl_buf[" + i + "] = 0x" + Intege
r.toHexString(rrpl_buf[i]) + ", rrpl_buf[" + ( i + 1 ) + "] = 0x" + Integer.toHe
xString(rrpl_buf[i+1]));
}
// keyincmd();
// keyincmd( "next" );
}
// TX
// +---------+-------+-------+-------+-------+---------------------------+
// | cmd | N | A | F | | 24-bit DATA |
// +---------+-------+-------+-------+-------+---------------------------+
//
// cmd Header pattern
// +-------------+---------+---------+---------+---------------+
// | | Packet | Packet | Packet | Single |
// | | Start | Period | End | Frame Packet |
// +-------------+---------+---------+---------+---------------+
// | CAMAC | | | | |
// | Operation | 0xC0 | 0x8C | 0xA0 | 0xE0 |
// +-------------+---------+---------+---------+---------------+
// | CAMAC | | | | |
// | LAM | -- | -- | -- | 0xE8 |
// +-------------+---------+---------+---------+---------------+
// | DAQ Trigger | | | | |
// | out | 0xD0 | 0x90 | 0xB0 | 0xF0 |
// +-------------+---------+---------+---------+---------------+
// | DAQ | | | | |
// | Interrupt | -- | -- | -- | 0xF8 |
// +-------------+---------+---------+---------+---------------+
//
// CAMAC N.
// 55 54 53 52 51 50 49 48 47 32
// +--------------------+----------------+-------------------+---------------+
// | - - - N16 | N8 N4 N2 N1 | | | | |
// +--------------------+----------------+-------------------+---------------+
//
// CAMAC A.
// 47 46 45 44 43 42 41 40 32
// +--------------------+-------------------+----------------+---------------+
// | - - - - | A8 A4 A2 A1 | | |
// +--------------------+-------------------+----------------+---------------+
//
// CAMAC F.
// 39 38 37 36 35 34 33 32
// +--------------------+----------------+------------------+----------------+
// | - - - F16 | F8 F4 F2 F1 |
// +--------------------+----------------+------------------+----------------+
//
public void cmdbld( int n, int a, int f, int l_count ){
// CAMAC Single action.
String s2 = "";
// System.out.println ( " Make up CAMAC Command of Single action." );
// System.out.println ( " Accepted data: n = " + n + ", a = " + a + ",
f = " + f + ", l_count = " + l_count );
s2 = mess + "\n" + "cmdbld: " + " Make up CAMAC Command of Single action
.";
mess = s2;
s2 = mess + "\n" + "cmdbld: " + " Accepted data: n = " + n + ", a = "
+ a + ", f= " + f + ", l_count = " + l_count;
mess = s2;
a = a << 8;
n = n << 16;
ClientImpl.scmd [ l_count -1 ] = 0xE0000000 | ( 0x0000001F & f ) | ( 0x000
00F00 & a ) | ( 0x001F0000 & n );
// System.out.println ( " ClientImpl.scmd [ " + ( l_count -1 ) + " ] = "
+ ClientImpl.scmd [ l_count -1 ] + "(dec), " + "0x" + Integer.toHexString( Clien
tImpl.scmd [ l_count -1 ] ) + "(hex)" );
// System.out.println ( " ClientImpl.sdat [ " + ( l_count -1 ) + " ] = "
+ ClientImpl.sdat [ l_count -1 ] + "(dec), " + "0x" + Integer.toHexString( Clien
tImpl.sdat [ l_count -1 ] ) + "(hex)" );
s2 = mess + "\n" + "cmdbld: " + " ClientImpl.scmd [ " + ( l_count -1 ) +
" ] = " + ClientImpl.scmd [ l_count -1 ] + "(dec), " + "0x" + Integer.toHexStri
ng( ClientImpl.scmd [ l_count -1 ] ) + "(hex)";
mess = s2;
s2 = mess + "\n" + "cmdbld: " + " ClientImpl.sdat [ " + ( l_count -1 ) +
" ] = " +ClientImpl.sdat [ l_count -1 ] + "(dec), " + "0x" + Integer.toHexStrin
g( ClientImpl.sdat [ l_count -1 ] ) + "(hex)";
mess = s2;
// CAMAC LAM handling.
// CAMAC DMA action.
}
public void keyincmd() {
char cstr[] = new char[20];
char n[] = new char[4];
char a[] = new char[4];
char f[] = new char[4];
char kc[] = new char[4];
int c[] = new int[3];
int i, i2, count, loop, k_error;
int spoin, epoin;
int examN;
String cn = "0", ca = "0", cf = "0";
String tmp;
String nchk[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "
b", "c", "d", "e", "f" };
String s2 = "";
loop = 1;
epoin = 0;
// ClientImpl.scmd[0] = 0xe0030010;
// ClientImpl.sdat[0] = 0x555;
// N,A,F CAMAC command set up.
count = ClientImpl.acmd.length();
// Single action set up.
i2 = 0;
for ( i = 0; i < ClientImpl.acmd.length(); i++ ) {
if ( COM == ClientImpl.acmd.charAt ( i ) ) {
c[ i2++ ] = i;
}
}
cn = ClientImpl.acmd.substring ( 0, c[ 0 ] );
ca = ClientImpl.acmd.substring ( c[ 0 ] +1, c[ 1 ] );
cf = ClientImpl.acmd.substring ( c[ 1 ] +1, count );
String s1 = "keyincmd: " + "cn =" + cn + ", ca =" + ca + ", cf =" + cf
;
mess = s1;
try{
int in = Integer.parseInt(cn, 10);
if ( ( in < 0 ) || ( in > 25 ) ) {
s2 = mess + "\n" + "keyincmd: Error: Command Error: Illegal
value of N: Out of range !!";
mess = s2;
return;
}
int ia = Integer.parseInt(ca, 10);
if ( ( ia < 0 ) || ( ia > 15 ) ) {
s2 = mess + "\n" + "keyincmd: Error: Command Error: Illegal
value of A: Out of range !! ";
mess = s2;
return;
}
int inf = Integer.parseInt(cf, 10);
if ( ( inf < 0 ) || ( inf > 31 ) ) {
s2 = mess + "\n" + "keyincmd: Error: Command Error: Illegal
value of F: Out of range !! ";
mess = s2;
return;
}
if ( ( inf >= 16 ) && ( inf <= 23 ) ) {
// データ入力要求
int datf = 0;
count = ClientImpl.adat.length();
String cdat = ClientImpl.adat.substring ( 0, count );
for ( i = 0; i < count -1; i++) {
String cdat1 = cdat.substring ( i, i + 1 );
// numerical check
for ( i2 = 0; i2 < 16; i2++ ) {
if ( cdat1.equals( nchk [ i2 ] ) ) {
datf = 0;
break;
}
datf = 1;
}
if ( datf == 1 ) {
s2 = mess + "\n" + "keyincmd: Error : Data error: Ille
gal character --- " + cdat1 + " !";
mess = s2;
break;
}
}
if ( datf == 1) {
// continue;
return;
}
ClientImpl.sdat [ loop -1 ] = Integer.parseInt( cdat, 16);
s2 = mess + "\n" + "keyincmd: Data : " + ClientImpl.sdat[ loo
p -1 ] + "(dec), 0x" + Integer.toHexString( ClientImpl.sdat [ loop -1 ] ) + "(he
x)";
mess = s2;
if ( ( ClientImpl.sdat [ loop -1 ] < 0 ) || ( ClientImpl.sdat[
loop -1 ] > 0xffffff ) ) {
// continue;
s2 = mess + "\n" + "keyincmd: Data : Data error: Out of
range --- " + Integer.toHexString( ClientImpl.sdat [ loop -1 ] ) + " !";
mess = s2;
return;
}
}
// CAMAC command set up.
cmdbld ( in, ia, inf, loop );
s2 = mess + "\n" + "keyincmd: return from cmdbld () \n";
mess = s2;
epoin++;
examN = 0xe;
s2 = mess + "\n" + "keyincmd: loop = " + loop;
mess = s2;
camac_exec( loop, examN );
s2 = mess + "\n" + "keyincmd: return from camac_exec () \n";
mess = s2;
/* Begin !!!! E.Inoue !!!!
End !!!! E.Inoue !!!! */
} catch (NumberFormatException e) {
s2 = mess + "\n" + "keyincmd: Error: NumberFormatException occu
rred !! \n";
mess = s2;
}
s2 = mess + "\n" + "keyincmd: " + "Sent Reply command field = 0xe0030010"
+ ", data field = 0x555";
mess = s2;
return;
}
}
[inoue@onlsbc1 Web]$
(2-1-4B-2). cam.java
[inoue@onlsbc1 Web]$ cat cam.java
// File name: cam.java
// Date: Apr 28, 2003
// Edited by: Eiji Inoue
//
//
// Parallel camac
// packet format of basic camac opeation
// TX
// +---------+-------+-------+-------+-------+---------------------------+
// | cmd | N | A | F | | 24-bit DATA |
// +---------+-------+-------+-------+-------+---------------------------+
//
// RX
// +---------+-------+-------+-------+-------+---------------------------+
// | rply | N | A | F | ST | 24-bit DATA |
// +---------+-------+-------+-------+-------+---------------------------+
public class cam {
public native int cmdArray(int j_cmd[], int j_dat[], int jrp_cmd[], int jrp_da
t[], int j_length, int j_examN);
static {
System.loadLibrary("MyImpOfcam");
}
}
[inoue@onlsbc1 Web]$
(2-1-4B-3). cam.c
[inoue@onlsbc1 Web]$ more cam.c
// file name: cam.c
// Date: Apr 28, 2003
// Edited by: E.Inoue
//
// Parallel camac
// packet format of basic camac opeation
// TX
// +---------+-------+-------+-------+-------+---------------------------+
// | cmd | N | A | F | | 24-bit DATA |
// +---------+-------+-------+-------+-------+---------------------------+
//
// RX
// +---------+-------+-------+-------+-------+---------------------------+
// | rply | N | A | F | ST | 24-bit DATA |
// +---------+-------+-------+-------+-------+---------------------------+
#include
#include
#include
#include "cam.h"
// exam1.c, from here
#include
#include
#include
#include
#include
// #include
#include
#include
#include "pcc.h"
// to
#define BASE 0xE800
#define TX_DATA1REG BASE
#define TX_DATA2REG (BASE+4)
/* #define TX_STATUSREG (BASE+0x10) */
#define TX_STATUSREG (BASE+0x1c)
#define TXSTATUS_BUSY 0x10000
#define TXSTATUS_TIMEOUT 0x20000
#define RX_DATA1REG (BASE+0x20)
#define RX_DATA2REG (BASE+0x24)
/* #define RX_FIFOREG (BASE+0x30) */
#define RX_FIFOREG (BASE+0x3c)
#define CMD_F16_A0_N3 0xE0030010
#define CMD_F0_A0_N3 0xE0030000
// exam1.c, read.c, from here
//#define SWREG 4
#define SWREG 3
#define CC_READ 0
#define CC_WRITE 16
#define CC_COUNT 10
#define CC_COUNT1 20
#define BUF_LEN 1000*2
// to
JNIEXPORT jint JNICALL
Java_cam_cmdArray(JNIEnv *env, jobject obj, jintArray r_cmd, jintArray r_dat, ji
ntArray cmd_buf, jintArray rpl_buf, jint length1, jint examN)
{
int sum = 0;
jsize len1 = (*env)->GetArrayLength(env, r_cmd);
jint *c_cmd = (*env)->GetIntArrayElements(env, r_cmd, 0);
jsize len2 = (*env)->GetArrayLength(env, r_dat);
jint *c_dat = (*env)->GetIntArrayElements(env, r_dat, 0);
jsize len3 = (*env)->GetArrayLength(env, cmd_buf);
jint *ccmdbuf = (*env)->GetIntArrayElements(env, cmd_buf, 0);
jsize len4 = (*env)->GetArrayLength(env, rpl_buf);
jint *crplybuf = (*env)->GetIntArrayElements(env, rpl_buf, 0);
int loop1 = length1;
int ii, j, data, cmd, value;
int example = examN;
// exam1.c, exam2.c, exam21.c, exam3.c, exam4.c, exam5.c exam6.c, pio_write_read
.c, read.c, read_write.c from here
int fd, i, len;
int status, loop = 1;
int length = BUF_LEN;
int* cbuf = ccmdbuf + 2;
int* rbuf = crplybuf + 2;
int rply;
struct pccreg pccreg;
unsigned int i1, j1, k1;
int retlen;
int *w_buffer, *r_buffer;
int count, result;
int packet1, packet2;
struct pollfd pollfds;
int timeout = 5000;/* Timeout in msec. */
// to here.
printf ("\n JNI, C side: Received CAMAC command: ");
printf ("array length = %d\n", length1);
printf ("example number = %d\n", example);
switch ( example ) {
case 0xe:
// camac Single action from remote machine, from here.
ccmdbuf[1] = length1 * 2;
// for (i=1; i < length1 +2; i++) {
for (i=0; i < length1 +1; i++) {
printf(" c_cmd[%d] = 0x%x, c_dat[%d] = 0x%x\n", i, c_cmd[i], i, c_
dat[i]);
}
if( iopl(3) ){
printf("can not change the privilege level\n");
exit(0);
}
printf("\n JNI, C side: CAMAC access\n");
// for( i = 1; i < loop1 + 1; i++) {
for( i = 0; i < loop1 + 1; i++) {
switch (c_cmd[i] & 0x00000018) {
case 0x00000010 :
// CAMAC Write
// 送信可能状態になるまで待つ
value = inl(TX_STATUSREG);
while (value & TXSTATUS_BUSY) {
if (value & TXSTATUS_TIMEOUT) break;
value = inl(TX_STATUSREG);
}
// camac writeコマンド&データをセットして、PCIレジスタに書き込む
data = c_dat[i] & 0x00ffffff;
outl(data, TX_DATA1REG);
outl(CMD_F16_A0_N3, TX_DATA2REG);
printf(" camac write data: data = 0x%x\n", data);
// camac応答が読み出し可能状態になるまで待つ
value = 0;
do {
value = inl(RX_FIFOREG);
// for PCI ROM of new version
// value = value >> 24;
} while( value < 2 );
// camacからの受信用レジスタを読んで camacからの応答を得る
data = inl(RX_DATA1REG);
cmd = inl(RX_DATA2REG);
printf(" camac write command reply: cmd = 0x%x : data = %x\
n", cmd, data);
c_cmd[i] = cmd;
c_dat[i] = data;
break;
case 0x00000000 :
// CAMAC Read
// 送信可能状態になるまで待つ
value = inl(TX_STATUSREG);
while (value & TXSTATUS_BUSY) {
if (value & TXSTATUS_TIMEOUT) break;
value = inl(TX_STATUSREG);
}
// camac readコマンド&データをセットして、PCIレジスタに書き込む
outl(CMD_F0_A0_N3, TX_DATA2REG);
// camac応答が読み出し可能状態になるまで待つ
value = 0;
do {
value = inl(RX_FIFOREG);
// for PCI ROM of new version
// value = value >> 24;
} while( value < 2);
// camacからの受信用レジスタを読んで camacからの応答を得る
data = inl(RX_DATA1REG);
cmd = inl(RX_DATA2REG);
data = 0xffffff & data;
ii = 0xffffff & c_dat[i];
printf(" camac read command reply: cmd = 0x%x : data = 0x%x
\n", cmd, data);
c_cmd[i] = cmd;
c_dat[i] = data;
break;
default :
// Default
break;
}
}
break;
default:
break;
}
(*env)->ReleaseIntArrayElements(env, r_cmd, c_cmd, 0);
(*env)->ReleaseIntArrayElements(env, r_dat, c_dat, 0);
(*env)->ReleaseIntArrayElements(env, cmd_buf, ccmdbuf, 0);
(*env)->ReleaseIntArrayElements(env, rpl_buf, crplybuf, 0);
return sum;
}
[inoue@onlsbc1 Web]$
(2-1-4B-4). コンパイル& 実行
サーバ側のソフトをコンパイルし起動させる。
[inoue@onlsbc1 Web]$ pwd
/home/inoue/public_html/Web
[inoue@onlsbc1 Web]$ make clean
rm -f *.class cam.h libMyImpOfcam.so *.o core *~
[inoue@onlsbc1 Web]$ make
javac web3.java
javac cam.java
javah -jni cam
gcc -c camac.c
gcc -O -shared -I/usr/java/include -I/usr/java/include/linux cam.c camac.o -o li
bMyImpOfcam.so
javac ServerImpl.java
rmic ClientImpl
rmic ServerImpl
[inoue@onlsbc1 Web]$
[root@onlsbc1 Web]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Jun16 ? 00:00:04 init
root 2 1 0 Jun16 ? 00:00:00 [keventd]
root 3 1 0 Jun16 ? 00:00:00 [kapmd]
root 4 1 0 Jun16 ? 00:00:00 [ksoftirqd_CPU0]
root 5 1 0 Jun16 ? 00:00:00 [kswapd]
root 6 1 0 Jun16 ? 00:00:00 [bdflush]
root 7 1 0 Jun16 ? 00:00:00 [kupdated]
root 8 1 0 Jun16 ? 00:00:00 [mdrecoveryd]
root 12 1 0 Jun16 ? 00:00:00 [kjournald]
root 63 1 0 Jun16 ? 00:00:00 [khubd]
root 433 1 0 Jun16 ? 00:00:00 syslogd -m 0
root 437 1 0 Jun16 ? 00:00:00 klogd -x
rpc 448 1 0 Jun16 ? 00:00:00 [portmap]
root 511 1 0 Jun16 ? 00:00:11 /usr/sbin/sshd
root 523 1 0 Jun16 ? 00:00:01 [login]
root 524 1 0 Jun16 tty2 00:00:00 /sbin/mingetty tty2
root 525 1 0 Jun16 tty3 00:00:00 /sbin/mingetty tty3
root 526 1 0 Jun16 tty4 00:00:00 /sbin/mingetty tty4
root 527 1 0 Jun16 tty5 00:00:00 /sbin/mingetty tty5
root 528 1 0 Jun16 tty6 00:00:00 /sbin/mingetty tty6
inoue 935 523 0 Jun23 tty1 00:00:00 -bash
root 3350 1 0 08:31 ? 00:00:00 [rpciod]
root 3351 1 0 08:31 ? 00:00:00 [lockd]
root 3406 511 0 08:35 ? 00:00:00 /usr/sbin/sshd
inoue 3408 3406 0 08:35 ? 00:00:18 [sshd]
inoue 3409 3408 0 08:35 pts/0 00:00:01 -bash
root 7504 3409 1 16:30 pts/0 00:00:00 [su]
root 7505 7504 3 16:30 pts/0 00:00:00 bash
root 7535 7505 0 16:30 pts/0 00:00:00 ps -ef
[root@onlsbc1 Web]#
この時点ではすでに、
# /sbin/insmod pcc.o
は実行されて、pccドライバはロードされていること。
[root@onlsbc1 public_html]# pwd
/home/inoue/public_html
[root@onlsbc1 public_html]# ./w e840 1
outl(0x1, 0x0000e840)
[root@onlsbc1 public_html]#
[root@onlsbc1 Web]# /sbin/service httpd start
httpdを起動中: [ OK ]
[root@onlsbc1 Web]# export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
[root@onlsbc1 Web]# rmiregistry &
[1] 7569
[root@onlsbc1 Web]# java ServerImpl
bind done
RMI: Server side:
RMI: Received CAMAC command: array length = 1
cmd[0] = 0xe0030010, dat[0] = 0xffff
cmd[1] = 0x0, dat[1] = 0x0
JNI, Java side: before Native Call
ServerImpl.r_cmd[0] = 0xe0030010, ServerImpl.r_dat[0] = 0xffff
ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0
JNI, C side: Received CAMAC command: array length = 1
example number = 14
c_cmd[0] = 0xe0030010, c_dat[0] = 0xffff
c_cmd[1] = 0x0, c_dat[1] = 0x0
JNI, C side: CAMAC access
camac write data: data = 0xffff
camac write command reply: cmd = 0xe0030010 : data = 23000000
camac read command reply: cmd = 0xe0030000 : data = 0xffff
JNI, Java side: after Native Call array length = 1
RMI: Server side:
RMI: Received CAMAC command: array length = 1
cmd[0] = 0xe0030000, dat[0] = 0xffff
cmd[1] = 0x0, dat[1] = 0x0
JNI, Java side: before Native Call
ServerImpl.r_cmd[0] = 0xe0030000, ServerImpl.r_dat[0] = 0xffff
ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0
JNI, C side: Received CAMAC command: array length = 1
example number = 14
c_cmd[0] = 0xe0030000, c_dat[0] = 0xffff
c_cmd[1] = 0x0, c_dat[1] = 0x0
JNI, C side: CAMAC access
camac read command reply: cmd = 0xe0030000 : data = 0xffff
camac read command reply: cmd = 0xe0030000 : data = 0xffff
JNI, Java side: after Native Call array length = 1
RMI: Server side:
RMI: Received CAMAC command: array length = 1
cmd[0] = 0xe0030010, dat[0] = 0x5555
cmd[1] = 0x0, dat[1] = 0x0
JNI, Java side: before Native Call
ServerImpl.r_cmd[0] = 0xe0030010, ServerImpl.r_dat[0] = 0x5555
ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0
JNI, C side: Received CAMAC command: array length = 1
example number = 14
c_cmd[0] = 0xe0030010, c_dat[0] = 0x5555
c_cmd[1] = 0x0, c_dat[1] = 0x0
JNI, C side: CAMAC access
camac write data: data = 0x5555
camac write command reply: cmd = 0xe0030010 : data = 23000000
camac read command reply: cmd = 0xe0030000 : data = 0x5555
JNI, Java side: after Native Call array length = 1
RMI: Server side:
RMI: Received CAMAC command: array length = 1
cmd[0] = 0xe0030000, dat[0] = 0x5555
cmd[1] = 0x0, dat[1] = 0x0
JNI, Java side: before Native Call
ServerImpl.r_cmd[0] = 0xe0030000, ServerImpl.r_dat[0] = 0x5555
ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0
JNI, C side: Received CAMAC command: array length = 1
example number = 14
c_cmd[0] = 0xe0030000, c_dat[0] = 0x5555
c_cmd[1] = 0x0, c_dat[1] = 0x0
JNI, C side: CAMAC access
camac read command reply: cmd = 0xe0030000 : data = 0x5555
camac read command reply: cmd = 0xe0030000 : data = 0x5555
JNI, Java side: after Native Call array length = 1
(2-1-4B-5). リモートからのアクセス
サーバ側のソフトを起動しておいてから、リモートからWebブラウザでアクセス
する。
ok. IE6.0からonlsbc1にアクセスして、ポートI/OによるCAMACアクセスが実行
できた。
(2-1-5). CAMACライブラリおよびドライバを使用する
上記の項目2-1-4での実行は、ポートI/OによるCAMACアクセスであった。 ここ
ではCAMACライブラリおよびドライバを使用してCAMACアクセスするように変更
して実行する。
(2-1-5A). CAMACライブラリおよびドライバのインストール
[inoue@onlsbc1 camac]$ df -k
Filesystem 1K-ブロック 使用 使用可 使用% マウント位置
/dev/hdc1 484602 433175 26405 95% /
none 152188 0 152188 0% /dev/shm
onlpara:/home2/onlpara-wrk
22659860 1186812 20321992 6% /home
[inoue@onlsbc1 camac]$
[inoue@onlsbc1 camac]$ pwd
/home/inoue/public_html/camac
[inoue@onlsbc1 camac]$ make clean
rm -f *.o *~ core \
pio_write_read write_read read_write \
gen_cam dec_cam dump_reg measure \
exam1 exam2 exam21 exam22 exam23 exam3 exam4 exam5 exam6 \
cam put_cam get_cam clr_fifo
[inoue@onlsbc1 camac]$ make
gcc -O2 -Wall -c -D__KERNEL__ -DMODULE -Wall -I/usr/src/linux-2.4/include pcc.c
pcc.c: 関数 `pcc_interrupt' 内:
pcc.c:171: 警告: 変数 `data' は使われませんでした
pcc.c: 関数 `pcc_read' 内:
pcc.c:528: 警告: 変数 `i' は使われませんでした
pcc.c: 関数 `pcc_write' 内:
pcc.c:600: 警告: 変数 `i' は使われませんでした
pcc.c: 関数 `init_module' 内:
pcc.c:692: 警告: 変数 `i' は使われませんでした
pcc.c: トップレベル:
pcc.c:53: 警告: `tv' が定義されましたが使われませんでした
gcc -c camac.c
gcc -c camlib.c
gcc -o gen_cam gen_cam.c camac.o
gcc -o dec_cam dec_cam.c camac.o
gcc -o dump_reg dump_reg.c camac.o
gcc -o measure measure.c camac.o
gcc -o exam0 exam0.c camac.o
gcc -o exam1 exam1.c data_pattern.c camac.o
exam1.c: 関数 `main' 内:
exam1.c:130: 警告: 複合文の終りでラベルを使うことは推奨されません
gcc -o exam2 exam2.c data_pattern.c camac.o
gcc -o exam3 exam3.c data_pattern.c camac.o
gcc -o exam4 exam4.c data_pattern.c camac.o
gcc -o cam cam.c camac.o
gcc -o put_cam put_cam.c camac.o
gcc -o get_cam get_cam.c camac.o
gcc -o clr_fifo clr_fifo.c camac.o
gcc -o rst_cam rst_cam.c camac.o
gcc -o camtest1c camtest1c.c camlib.c camac.o
[inoue@onlsbc1 camac]$
[inoue@onlsbc1 camac]$ ls -l
合計 532
-rw-r--r-- 1 inoue inoue 2237 6月 25 14:42 Makefile
-rw-r--r-- 1 inoue inoue 1072 6月 27 10:02 README
-rwxrwxr-x 1 inoue inoue 19519 7月 2 08:57 cam
-rw-rw-r-- 1 inoue inoue 1050 4月 29 10:47 cam.c
-rwxrwxr-x 1 inoue inoue 158 4月 23 13:42 cam.sh
-rw-rw-r-- 1 inoue inoue 13325 6月 27 11:22 camac.c
-rw-rw-r-- 1 inoue inoue 8600 7月 2 08:57 camac.o
-rw-r--r-- 1 inoue inoue 2705 6月 27 11:14 camlib.c
-rw-r--r-- 1 inoue inoue 212 6月 27 14:35 camlib.h
-rw-rw-r-- 1 inoue inoue 2824 7月 2 08:57 camlib.o
-rwxrwxr-x 1 inoue inoue 21333 7月 2 08:57 camtest1c
-rw-rw-r-- 1 inoue inoue 1882 6月 27 11:16 camtest1c.c
-rwxrwxr-x 1 inoue inoue 18937 7月 2 08:57 clr_fifo
-rw-rw-r-- 1 inoue inoue 411 4月 29 16:32 clr_fifo.c
-rw-rw-r-- 1 inoue inoue 3286 6月 23 14:51 data_pattern.c
-rwxrwxr-x 1 inoue inoue 19171 7月 2 08:57 dec_cam
-rw-rw-r-- 1 inoue inoue 480 4月 29 11:05 dec_cam.c
-rwxrwxr-x 1 inoue inoue 18969 7月 2 08:57 dump_reg
-rw-rw-r-- 1 inoue inoue 468 6月 25 14:01 dump_reg.c
-rwxrwxr-x 1 inoue inoue 21846 7月 2 08:57 exam0
-rw-rw-r-- 1 inoue inoue 4454 6月 13 13:56 exam0.c
-rwxrwxr-x 1 inoue inoue 24033 7月 2 08:57 exam1
-rw-rw-r-- 1 inoue inoue 4002 7月 1 19:04 exam1.c
-rwxrwxr-x 1 inoue inoue 23449 7月 2 08:57 exam2
-rw-rw-r-- 1 inoue inoue 3245 6月 20 15:17 exam2.c
-rwxrwxr-x 1 inoue inoue 22529 7月 2 08:57 exam3
-rw-rw-r-- 1 inoue inoue 2451 6月 27 11:34 exam3.c
-rwxrwxr-x 1 inoue inoue 21857 7月 2 08:57 exam4
-rw-rw-r-- 1 inoue inoue 1754 6月 27 11:35 exam4.c
-rwxrwxr-x 1 inoue inoue 20032 4月 28 21:07 gen
-rwxrwxr-x 1 inoue inoue 19363 7月 2 08:57 gen_cam
-rw-rw-r-- 1 inoue inoue 619 4月 29 11:05 gen_cam.c
-rwxrwxr-x 1 inoue inoue 19000 7月 2 08:57 get_cam
-rw-rw-r-- 1 inoue inoue 473 4月 29 18:53 get_cam.c
drwxrwxr-x 2 inoue inoue 4096 6月 27 13:28 junk
-rwxrwxr-x 1 inoue inoue 65 4月 30 19:14 loop.sh
-rwxrwxr-x 1 inoue inoue 20527 7月 2 08:57 measure
-rw-rw-r-- 1 inoue inoue 3165 4月 30 19:07 measure.c
-rw-rw-r-- 1 inoue inoue 269 4月 23 11:38 measure.txt
drwxrwxr-x 2 inoue inoue 4096 6月 16 15:36 old
-rw-r--r-- 1 inoue inoue 23469 6月 27 11:32 pcc.c
-rw-r--r-- 1 inoue inoue 6364 6月 23 14:07 pcc.h
-rw-rw-r-- 1 inoue inoue 10632 7月 2 08:57 pcc.o
-rw-rw-r-- 1 inoue inoue 682 4月 8 14:23 performance.txt
-rwxrwxr-x 1 inoue inoue 19203 7月 2 08:57 put_cam
-rw-rw-r-- 1 inoue inoue 573 4月 29 15:59 put_cam.c
-rwxrwxr-x 1 inoue inoue 18936 7月 2 08:57 rst_cam
-rw-rw-r-- 1 inoue inoue 401 4月 29 16:32 rst_cam.c
[inoue@onlsbc1 camac]$
/devディレクトリに pcc0名のデバイスファイルを作成。
[inoue@onlsbc1 camac]$ ls -l /dev | more
:
crw------- 1 root root 14, 33 8月 31 2002 patmgr1
brw-rw---- 1 root disk 46, 0 8月 31 2002 pcd0
brw-rw---- 1 root disk 46, 1 8月 31 2002 pcd1
:
[inoue@onlsbc1 camac]$
[root@onlsbc1 camac]# pwd
/home/inoue/public_html/camac
[root@onlsbc1 camac]# make device
mknod -m 666 /dev/pcc0 c 70 0
[root@onlsbc1 camac]#
[root@onlsbc1 camac]# ls -l /dev/p* | more
:
crw------- 1 root root 14, 33 8月 31 2002 /dev/patmgr1
crw-rw-rw- 1 root root 70, 0 7月 2 09:03 /dev/pcc0
brw-rw---- 1 root disk 46, 0 8月 31 2002 /dev/pcd0
brw-rw---- 1 root disk 46, 1 8月 31 2002 /dev/pcd1
:
[root@onlsbc1 camac]#
Linuxカーネルの中に pcc0デバイスドライバをロードする。
[root@onlsbc1 camac]# /sbin/insmod pcc.o
Warning: loading pcc.o will taint the kernel: no license
See http://www.tux.org/lkml/#export-tainted for information about tainted modu
les
Module pcc loaded, with warnings
[root@onlsbc1 camac]#
[inoue@onlsbc1 camac]$ /bin/dmesg | more
Linux version 2.4.18-27.8.0 (bhcompile@sylvester.devel.redhat.com) (gcc version
3.2 20020903 (Red Hat Linux 8.0 3.2-7)) #1 Fri Mar 14 08:42:52 EST 2003
BIOS-provided physical RAM map:
BIOS-e820: 0000000000000000 - 00000000000a0000 (usable)
BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 0000000012ff0000 (usable)
BIOS-e820: 0000000012ff0000 - 0000000012ff3000 (ACPI NVS)
BIOS-e820: 0000000012ff3000 - 0000000013000000 (ACPI data)
BIOS-e820: 00000000ffff0000 - 0000000100000000 (reserved)
303MB LOWMEM available.
On node 0 totalpages: 77808
zone(0): 4096 pages.
zone(1): 73712 pages.
zone(2): 0 pages.
Kernel command line: ro root=/dev/hdc1 ramdisk_size=32768
Initializing CPU#0
Detected 497.763 MHz processor.
Speakup v-1.00 CVS: Tue Jun 11 14:22:53 EDT 2002 : initialized
Console: colour VGA+ 80x25
Calibrating delay loop... 989.59 BogoMIPS
Memory: 301924k/311232k available (1181k kernel code, 6748k reserved, 997k data,
152k init, 0k highmem)
Dentry cache hash table entries: 65536 (order: 7, 524288 bytes)
Inode cache hash table entries: 32768 (order: 6, 262144 bytes)
Mount cache hash table entries: 8192 (order: 4, 65536 bytes)
ramfs: mounted with options:
ramfs: max_pages=38012 max_file_pages=0 max_inodes=0 max_dentries=38012
Buffer cache hash table entries: 16384 (order: 4, 65536 bytes)
Page-cache hash table entries: 131072 (order: 7, 524288 bytes)
CPU: Before vendor init, caps: 0084883f 0081813f 0000000e, vendor = 7
CPU: L1 I Cache: 64K (64 bytes/line), D cache 64K (32 bytes/line)
CPU: L2 Cache: 256K (128 bytes/line)
CPU: Processor revision 1.3.1.3, 500 MHz
CPU: Code Morphing Software revision 4.2.5-8-148
CPU: 20010503 11:00 official release 4.2.5#1
CPU: After vendor init, caps: 0084893f 0081813f 0000000e 00000000
CPU serial number disabled.
CPU: After generic, caps: 0080893f 0081813f 0000000e 00000000
CPU: Common caps: 0080893f 0081813f 0000000e 00000000
CPU: Transmeta(tm) Crusoe(tm) Processor TM5400 stepping 03
Checking 'hlt' instruction... OK.
Checking for popad bug... OK.
POSIX conformance testing by UNIFIX
mtrr: v1.40 (20010327) Richard Gooch (rgooch@atnf.csiro.au)
mtrr: detected mtrr type: none
PCI: PCI BIOS revision 2.10 entry at 0xfb330, last bus=0
PCI: Using configuration type 1
PCI: Probing PCI hardware
PCI: Using IRQ router VIA [1106/0686] at 00:07.0
isapnp: Scanning for PnP cards...
isapnp: No Plug & Play device found
speakup: initialized device: /dev/synth, node (MAJOR 10, MINOR 25)
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
apm: BIOS version 1.2 Flags 0x07 (Driver version 1.16)
Starting kswapd
VFS: Diskquotas version dquot_6.5.0 initialized
Detected PS/2 Mouse Port.
pty: 512 Unix98 ptys configured
Serial driver version 5.05c (2001-07-08) with MANY_PORTS MULTIPORT SHARE_IRQ SER
IAL_PCI ISAPNP enabled
ttyS0 at 0x03f8 (irq = 4) is a 16550A
ttyS1 at 0x02f8 (irq = 3) is a 16550A
Real Time Clock Driver v1.10e
block: 576 slots per queue, batch=144
Uniform Multi-Platform E-IDE driver Revision: 6.31
ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx
VP_IDE: IDE controller on PCI bus 00 dev 39
VP_IDE: chipset revision 16
VP_IDE: not 100% native mode: will probe irqs later
ide: Assuming 33MHz system bus speed for PIO modes; override with idebus=xx
VP_IDE: VIA vt82c686a (rev 22) IDE UDMA66 controller on pci00:07.1
ide0: BM-DMA at 0xd000-0xd007, BIOS settings: hda:DMA, hdb:pio
ide1: BM-DMA at 0xd008-0xd00f, BIOS settings: hdc:pio, hdd:pio
hda: TOSHIBA MK4018GAS, ATA DISK drive
hdc: SanDisk SDCFB-512, ATA DISK drive
ide0 at 0x1f0-0x1f7,0x3f6 on irq 14
ide1 at 0x170-0x177,0x376 on irq 15
hda: 78140160 sectors (40008 MB), CHS=4864/255/63, UDMA(33)
hdc: 1000944 sectors (512 MB) w/1KiB Cache, CHS=993/16/63
ide-floppy driver 0.99.newide
Partition check:
hda: hda1 hda2 hda3 hda4 < hda5 hda6 hda7 >
hdc: hdc1
Floppy drive(s): fd0 is 1.44M
FDC 0 is a post-1991 82077
NET4: Frame Diverter 0.46
RAMDISK driver initialized: 16 RAM disks of 32768K size 1024 blocksize
ide-floppy driver 0.99.newide
md: md driver 0.90.0 MAX_MD_DEVS=256, MD_SB_DISKS=27
md: Autodetecting RAID arrays.
md: autorun ...
md: ... autorun DONE.
NET4: Linux TCP/IP 1.0 for NET4.0
IP Protocols: ICMP, UDP, TCP, IGMP
IP: routing cache hash table of 2048 buckets, 16Kbytes
TCP: Hash tables configured (established 32768 bind 65536)
Linux IP multicast router 0.06 plus PIM-SM
NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.
RAMDISK: Compressed image found at block 0
Freeing initrd memory: 122k freed
VFS: Mounted root (ext2 filesystem).
Journalled Block Device driver loaded
hdc: hdc1
hdc: hdc1
kjournald starting. Commit interval 5 seconds
EXT3-fs: mounted filesystem with ordered data mode.
Freeing unused kernel memory: 152k freed
usb.c: registered new driver usbdevfs
usb.c: registered new driver hub
usb-uhci.c: $Revision: 1.275 $ time 08:59:07 Mar 14 2003
usb-uhci.c: High bandwidth mode enabled
PCI: Found IRQ 11 for device 00:07.2
PCI: Sharing IRQ 11 with 00:0e.0
usb-uhci.c: USB UHCI at I/O 0xd400, IRQ 11
usb-uhci.c: Detected 2 ports
usb.c: new USB bus registered, assigned bus number 1
hub.c: USB hub found
hub.c: 2 ports detected
usb-uhci.c: v1.275:USB Universal Host Controller Interface driver
hub.c: USB new device connect on bus1/1, assigned device number 2
usb.c: USB device 2 (vend/prod 0x46d/0xc00c) is not claimed by any active driver
.
usb.c: registered new driver hiddev
usb.c: registered new driver hid
input0: USB HID v1.10 Mouse [Logitech USB Optical Mouse] on usb1:2.0
hid-core.c: v1.8.1 Andreas Gal, Vojtech Pavlik
hid-core.c: USB HID support drivers
mice: PS/2 mouse device common for all mice
EXT3 FS 2.4-0.9.18, 14 May 2002 on ide1(22,1), internal journal
parport0: PC-style at 0x378 (0x778) [PCSPP,TRISTATE]
parport_pc: Via 686A parallel port: io=0x378
ohci1394: pci_module_init failed
eepro100.c:v1.09j-t 9/29/99 Donald Becker http://www.scyld.com/network/eepro100.
html
eepro100.c: $Revision: 1.36 $ 2000/11/17 Modified by Andrey V. Savochkin and others
PCI: Found IRQ 11 for device 00:0e.0
PCI: Sharing IRQ 11 with 00:07.2
divert: allocating divert_blk for eth0
eth0: OEM i82557/i82558 10/100 Ethernet, 00:D0:C9:63:67:64, IRQ 11.
Board assembly 727095-004, Physical connectors present: RJ45
Primary interface chip i82555 PHY #1.
General self-test: passed.
Serial sub-system self-test: passed.
Internal registers self-test: passed.
ROM checksum self-test: passed (0xdbd8681d).
usb-uhci.c: interrupt, status 31, frame# 1533
usb-uhci.c: Host controller halted, trying to restart.
PCI: Found IRQ 5 for device 00:09.0
pcc:IO_BASE = e800
irq number of PCC = 5
PCC has been installed.
[inoue@onlsbc1 camac]$
PCCはインストールされた。
(2-1-5B). JNIプログラム、cam.c を変更して実行
JNIプログラム、cam.cファイルに cam_put()、cam_get()のCAMACコールを書き
加える。
(2-1-5B-1). cam.cファイルの変更
[inoue@onlsbc1 Web]$ pwd
/home/inoue/public_html/Web
[inoue@onlsbc1 Web]$ more cam.c
// file name: cam.c
// Date: Jul 3, 2003
// Edited by: E.Inoue
//
// Parallel camac
// packet format of basic camac opeation
// TX
// +---------+-------+-------+-------+-------+---------------------------+
// | cmd | N | A | F | | 24-bit DATA |
// +---------+-------+-------+-------+-------+---------------------------+
//
// RX
// +---------+-------+-------+-------+-------+---------------------------+
// | rply | N | A | F | ST | 24-bit DATA |
// +---------+-------+-------+-------+-------+---------------------------+
#include
#include
#include
#include "cam.h"
// exam1.c, from here
#include
#include
#include
#include
#include
#include
#include
#include
#include "pcc.h"
// to
#define BASE 0xE800
#define TX_DATA1REG BASE
#define TX_DATA2REG (BASE+4)
/* #define TX_STATUSREG (BASE+0x10) */
#define TX_STATUSREG (BASE+0x1c)
#define TXSTATUS_BUSY 0x10000
#define TXSTATUS_TIMEOUT 0x20000
#define RX_DATA1REG (BASE+0x20)
#define RX_DATA2REG (BASE+0x24)
/* #define RX_FIFOREG (BASE+0x30) */
#define RX_FIFOREG (BASE+0x3c)
#define CMD_F16_A0_N3 0xE0030010
#define CMD_F0_A0_N3 0xE0030000
// exam1.c, read.c, from here
//#define SWREG 4
#define SWREG 3
#define CC_READ 0
#define CC_WRITE 16
#define CC_COUNT 10
#define CC_COUNT1 20
#define BUF_LEN 1000*2
// to
JNIEXPORT jint JNICALL
Java_cam_cmdArray(JNIEnv *env, jobject obj, jintArray r_cmd, jintArray r_dat, ji
ntArray cmd_buf, jintArray rpl_buf, jint length1, jint examN)
{
int sum = 0;
jsize len1 = (*env)->GetArrayLength(env, r_cmd);
jint *c_cmd = (*env)->GetIntArrayElements(env, r_cmd, 0);
jsize len2 = (*env)->GetArrayLength(env, r_dat);
jint *c_dat = (*env)->GetIntArrayElements(env, r_dat, 0);
jsize len3 = (*env)->GetArrayLength(env, cmd_buf);
jint *ccmdbuf = (*env)->GetIntArrayElements(env, cmd_buf, 0);
jsize len4 = (*env)->GetArrayLength(env, rpl_buf);
jint *crplybuf = (*env)->GetIntArrayElements(env, rpl_buf, 0);
int loop1 = length1;
// int ii, j, data, cmd, value;
int ii, j, data, value;
int example = examN;
// exam1.c, exam2.c, exam21.c, exam3.c, exam4.c, exam5.c exam6.c, pio_write_read
.c, read.c, read_write.c from here
int fd, i, len;
int status, loop = 1;
int length = BUF_LEN;
int* cbuf = ccmdbuf + 2;
int* rbuf = crplybuf + 2;
int rply;
struct pccreg pccreg;
unsigned int i1, j1, k1;
int retlen;
int *w_buffer, *r_buffer;
int count, result;
int packet1, packet2;
struct pollfd pollfds;
int timeout = 5000;/* Timeout in msec. */
// to here.
int QX;
int wdata, rdata, cmd, reply;
printf ("\n JNI, C side: Received CAMAC command: ");
printf ("array length = %d\n", length1);
printf ("example number = %d\n", example);
// switch ( example ) {
// case 0xe:
// camac Single action from remote machine, from here.
ccmdbuf[1] = length1 * 2;
// for (i=1; i < length1 +2; i++) {
for (i=0; i < length1 +1; i++) {
printf(" c_cmd[%d] = 0x%x, c_dat[%d] = 0x%x\n", i, c_cmd[i], i, c_
dat[i]);
}
/*
if( iopl(3) ){
printf("can not change the privilege level\n");
// exit(0);
}
*/
if((fd = cam_open( )) == -1) {
printf("cam_open error\n");
// exit(0);
}
status = 0;
cmd = c_cmd[0];
wdata = c_dat[0] & 0x00fffff;
// if( (status = cam_put( fd, wdata, cmd )) < 0 ) {
cam_put( fd, wdata, cmd );
// if( (status = cam_put( fd, c_dat[0], c_cmd[0] )) < 0 ) {
// printf("cam_put error\n");
// exit(0);
// }
status = 0;
// if( (status = cam_get( fd, &rdata, &reply )) < 0 ) {
cam_get( fd, &rdata, &reply );
// if( (status = cam_get( fd, &c_dat, &c_cmd[0] )) < 0 ) {
// printf("cam_get error\n");
// exit(0);
// }
c_cmd[0] = reply;
c_dat[0] = rdata;
// QX = (rdata >> 24) & 3;
QX = (c_dat[0] >> 24) & 3;
printf("Q = %d : X = %d ", QX&1, (QX>>1)&1);
// if( f >=0 && f <= 7 )
// printf(": data = %x", (rdata&0xFFFFFF));
printf(": data = %x", (c_dat[0]&0xFFFFFF));
// printf("\n");
cam_close( fd );
/*
if( iopl(3) ){
printf("can not change the privilege level\n");
exit(0);
}
printf("\n JNI, C side: CAMAC access\n");
// for( i = 1; i < loop1 + 1; i++) {
for( i = 0; i < loop1 + 1; i++) {
switch (c_cmd[i] & 0x00000018) {
case 0x00000010 :
// CAMAC Write
// 送信可能状態になるまで待つ
value = inl(TX_STATUSREG);
while (value & TXSTATUS_BUSY) {
if (value & TXSTATUS_TIMEOUT) break;
value = inl(TX_STATUSREG);
}
// camac writeコマンド&データをセットして、PCIレジスタに書き込む
data = c_dat[i] & 0x00ffffff;
outl(data, TX_DATA1REG);
outl(CMD_F16_A0_N3, TX_DATA2REG);
printf(" camac write data: data = 0x%x\n", data);
// camac応答が読み出し可能状態になるまで待つ
value = 0;
do {
value = inl(RX_FIFOREG);
// for PCI ROM of new version
// value = value >> 24;
} while( value < 2 );
// camacからの受信用レジスタを読んで camacからの応答を得る
data = inl(RX_DATA1REG);
cmd = inl(RX_DATA2REG);
printf(" camac write command reply: cmd = 0x%x : data = %x\
n", cmd, data);
c_cmd[i] = cmd;
c_dat[i] = data;
break;
case 0x00000000 :
// CAMAC Read
// 送信可能状態になるまで待つ
value = inl(TX_STATUSREG);
while (value & TXSTATUS_BUSY) {
if (value & TXSTATUS_TIMEOUT) break;
value = inl(TX_STATUSREG);
}
// camac readコマンド&データをセットして、PCIレジスタに書き込む
outl(CMD_F0_A0_N3, TX_DATA2REG);
// camac応答が読み出し可能状態になるまで待つ
value = 0;
do {
value = inl(RX_FIFOREG);
// for PCI ROM of new version
// value = value >> 24;
} while( value < 2);
// camacからの受信用レジスタを読んで camacからの応答を得る
data = inl(RX_DATA1REG);
cmd = inl(RX_DATA2REG);
data = 0xffffff & data;
ii = 0xffffff & c_dat[i];
printf(" camac read command reply: cmd = 0x%x : data = 0x%x
\n", cmd, data);
c_cmd[i] = cmd;
c_dat[i] = data;
break;
default :
// Default
break;
}
}
break;
default:
break;
}
*/
(*env)->ReleaseIntArrayElements(env, r_cmd, c_cmd, 0);
(*env)->ReleaseIntArrayElements(env, r_dat, c_dat, 0);
(*env)->ReleaseIntArrayElements(env, cmd_buf, ccmdbuf, 0);
(*env)->ReleaseIntArrayElements(env, rpl_buf, crplybuf, 0);
return sum;
}
[inoue@onlsbc1 Web]$
(2-1-5B-2). コンパイルおよび web3プログラムの実行
[inoue@onlsbc1 Web]$ pwd
/home/inoue/public_html/Web
[inoue@onlsbc1 Web]$ make clean
rm -f *.class cam.h libMyImpOfcam.so *.o core *~
[inoue@onlsbc1 Web]$ make
gcc -c camac.c
javac web3.java
javac cam.java
javah -jni cam
gcc -O -shared -I/usr/java/include -I/usr/java/include/linux cam.c camac.o -o li
bMyImpOfcam.so
javac ServerImpl.java
rmic ClientImpl
rmic ServerImpl
[inoue@onlsbc1 Web]$
[root@onlsbc1 Web]# /sbin/service httpd start
httpdを起動中: [ OK ]
[root@onlsbc1 Web]#
[root@onlsbc1 public_html]# pwd
/home/inoue/public_html
[root@onlsbc1 public_html]# ./w e840 1
outl(0x1, 0x0000e840)
[root@onlsbc1 public_html]#
[root@onlsbc1 Web]# pwd
/home/inoue/public_html/Web
[root@onlsbc1 Web]# export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
[root@onlsbc1 Web]# rmiregistry &
[1] 1602
[root@onlsbc1 Web]# java ServerImpl
bind done
RMI: Server side:
RMI: Received CAMAC command: array length = 1
cmd[0] = 0xe0030010, dat[0] = 0x5555
cmd[1] = 0x0, dat[1] = 0x0
JNI, Java side: before Native Call
ServerImpl.r_cmd[0] = 0xe0030010, ServerImpl.r_dat[0] = 0x5555
ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0
JNI, C side: Received CAMAC command: array length = 1
example number = 14
c_cmd[0] = 0xe0030010, c_dat[0] = 0x5555
c_cmd[1] = 0x0, c_dat[1] = 0x0
JNI, Java side: after Native Call array length = 1
RMI: Server side:
RMI: Received CAMAC command: array length = 1
cmd[0] = 0xe0030000, dat[0] = 0x5555
cmd[1] = 0x0, dat[1] = 0x0
JNI, Java side: before Native Call
ServerImpl.r_cmd[0] = 0xe0030000, ServerImpl.r_dat[0] = 0x5555
ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0
Q = 1 : X = 1 : data = ffff
JNI, C side: Received CAMAC command: array length = 1
example number = 14
c_cmd[0] = 0xe0030000, c_dat[0] = 0x5555
c_cmd[1] = 0x0, c_dat[1] = 0x0
JNI, Java side: after Native Call array length = 1
RMI: Server side:
RMI: Received CAMAC command: array length = 1
cmd[0] = 0xe0030010, dat[0] = 0xffff
cmd[1] = 0x0, dat[1] = 0x0
JNI, Java side: before Native Call
ServerImpl.r_cmd[0] = 0xe0030010, ServerImpl.r_dat[0] = 0xffff
ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0
Q = 1 : X = 1 : data = 0
JNI, C side: Received CAMAC command: array length = 1
example number = 14
c_cmd[0] = 0xe0030010, c_dat[0] = 0xffff
c_cmd[1] = 0x0, c_dat[1] = 0x0
JNI, Java side: after Native Call array length = 1
RMI: Server side:
RMI: Received CAMAC command: array length = 1
cmd[0] = 0xe0030000, dat[0] = 0xffff
cmd[1] = 0x0, dat[1] = 0x0
JNI, Java side: before Native Call
ServerImpl.r_cmd[0] = 0xe0030000, ServerImpl.r_dat[0] = 0xffff
ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0
Q = 1 : X = 1 : data = 5555
JNI, C side: Received CAMAC command: array length = 1
example number = 14
c_cmd[0] = 0xe0030000, c_dat[0] = 0xffff
c_cmd[1] = 0x0, c_dat[1] = 0x0
JNI, Java side: after Native Call array length = 1
(2-1-5B-3). リモートからのアクセス
サーバ側のソフトを起動しておいてから、リモートからWebブラウザでアクセス
する。
ok. 正しく実行できた。
(2-1-5B-4). 不要なメッセージ等を削除
テストの途中で挿入した不要なメッセージ出力や不必要な命令文を削除する。
ゴミ落としをやった後の実行。
[root@onlsbc1 Web]# ./web.sh
Wait. In Process .............
bind done
RMI: Server side:
JNI, Java side: Received CAMAC command: array length = 1
cmd[0] = 0xe0030010, dat[0] = 0xffff
cmd[1] = 0x0, dat[1] = 0x0
JNI, Java side: before Native Call
ServerImpl.r_cmd[0] = 0xe0030010, ServerImpl.r_dat[0] = 0xffff
ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0
JNI, C side: Received CAMAC command: array length = 1
example number = 14
c_cmd[0] = 0xe0030010, c_dat[0] = 0xffff
c_cmd[1] = 0x0, c_dat[1] = 0x0
JNI, Java side: after Native Call array length = 1
ServerImpl.r_cmd[0] = 0xe0030010, ServerImpl.r_dat[0] = 0x23000000
ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0
RMI: Server side:
JNI, Java side: Received CAMAC command: array length = 1
cmd[0] = 0xe0030000, dat[0] = 0xffff
cmd[1] = 0x0, dat[1] = 0x0
JNI, Java side: before Native Call
ServerImpl.r_cmd[0] = 0xe0030000, ServerImpl.r_dat[0] = 0xffff
ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0
Q = 1 : X = 1 : data = 0
JNI, C side: Received CAMAC command: array length = 1
example number = 14
c_cmd[0] = 0xe0030000, c_dat[0] = 0xffff
c_cmd[1] = 0x0, c_dat[1] = 0x0
JNI, Java side: after Native Call array length = 1
ServerImpl.r_cmd[0] = 0xe0030000, ServerImpl.r_dat[0] = 0x2300ffff
ServerImpl.r_cmd[1] = 0x0, ServerImpl.r_dat[1] = 0x0
ok. これでWebアプリケーションは一通り動作した。
---xxxx