pepodioctl

最初に

pepodioctlとはPepoLinux-0.51以降に収録されているシリアルDIOボードの各ポートをread/writeするちょっとしたプログラムです。

PepoLinuxに収録されているプログラムを必要とするので単独では動作しませんが、シリアル経由でコマンドのやり取りで制御する機器やボードのプログラムに応用出来ると思います。

更新履歴

2011.12.4:15本ある入出力ポートを前8本を入力、後の6本を出力で使用するように変更

これでチャンネル8を指定すると、入力8本分を一度のコマンドで読み込める。

これによりDIO監視デーモン:pepodiodの入力ポートのスキャン時間及び処理時間を短縮出来る。

2011.12.11

o 656ミリ秒以下のパルス出力をPIC内部のタイマーを使用してより正確な時間幅とするように変更

o 現在のバージョンでは655ミリ秒以上のパルスは1秒程度の誤差がある

2011.12.12

656ミリ秒以下のパルス出力をPIC内部のタイマーの乗数を100倍に修正

2012.1.19

o デバイスアクセス時のリトライ・タイマーをランダム、リトライ回数を10回にしてよりDIOの動作を確実にした

2012.1.21

o pid毎にコマンド・ファイルを生成するようにした

o lockfileが失敗した時にコマンド・ファイルを消去するように修正

2012.1.21

o 処理速度向上の為、各タイマー調整

2012.3.11

o ARGにチャンネルNO9を新たに機能追加、入力15ビットを一度にリードできるように変更した

2012.10.7

o タイマーチューニングにより処理速度UP

[root@]# pepodioctl 9
3FFF

下記よりダウンロードしてください

http://sourceforge.jp/projects/pepolinux/wiki/chobit_prog%20pepodioctl

2012.10.17 by.Yamauchi Isamu

  1. #!/bin/sh
  2. # licence GPLv2 ; this scripts designed by IZAMUKARERA 2011.10.8 update 2012.10.7
  3. # pepodioctl for contorl digital-IN/digital-OUT to ANDDIO
  4. # Input channel A to H ,Output channel I to N
  5. # pepodioctl $1:chno [$2:0 or 1] [$3: time->1 to 65535ms]
  6. #
  7. PATH=$PATH:/usr/local/bin:/usr/local/sbin
  8. if [ $# = 0 ]; then
  9. echo "usage $0 usage $0 read->chno:0-9 | write->chno:0-5 [DO:0|1] [time->1 to 65535ms]"
  10. exit -1
  11. fi
  12. DI_ADR="A"
  13. #DIO_DEV="/dev/ttyUSB0"
  14. DI_TTY=ttyS1
  15. #DI_TTY=ttyUSB0
  16. WAIT=10
  17. READTM=10
  18. TRY=30
  19. pid=`echo -en $$`
  20. DIO_DEV="/dev/${DI_TTY}"
  21. ALIAS_DI=/var/www/html/remote-hand/tmp/.alias_di
  22. CMD="/var/www/html/remote-hand/tmp/dioctl.${pid}"
  23. [ -e "$ALIAS_DI" ] && . "$ALIAS_DI"
  24. [ ! -z "$DI_TTY" ] && DIO_DEV="/dev/"${DI_TTY}
  25. if [ ! -e $DIO_DEV ];then
  26. echo -en "-1"
  27. exit -1
  28. fi
  29. LOCKFILE="/var/lock/LCK..${DI_TTY}.dio"
  30. LOCK="/var/lock/LCK..${DI_TTY}"
  31. RETRY=$TRY
  32. while [ -e $LOCK ]
  33. do
  34. msleep `echo -en $RANDOM |cut -c 1-2`
  35. RETRY=$(($RETRY - 1))
  36. if [ $RETRY = 0 ];then
  37. echo -en "-1" >/dev/stderr
  38. exit -1
  39. fi
  40. done
  41. CMD_DIO="/usr/local/bin/epicon -d 5 -D 5 -ql ${DIO_DEV} -c ${CMD}"
  42. n=$1
  43. if [ "$n" -gt 9 ] || [ "$n" -lt 0 ] || [ -n "$2" -a "$1" -gt 5 ] ;then
  44. echo "usage $0 read->chno:0-9 | write->chno:0-5 [DO:0|1] [time->1 to 65535ms]"
  45. exit -1
  46. fi
  47. error(){
  48. [ -e ${CMD} ] && rm -f ${CMD}
  49. [ -e ${LOCKFILE} ] && rm -f ${LOCKFILE}
  50. [ -e ${LOCK} ] && rm -f ${LOCK}
  51. exit 0
  52. }
  53. trap error SIGHUP SIGTERM SIGQUIT SIGKILL SIGINT SIGCHLD
  54. if [ ! -z $2 ];then
  55. # DIO Output channel address set
  56. k=0
  57. for i in I J K L M N
  58. do
  59. j[$k]=$i
  60. k=$[$k+1]
  61. done
  62. CH=${j[$n]}
  63. if [ "$2" = "1" ];then
  64. DO="H"
  65. DO_INVERT="L"
  66. else
  67. DO="L"
  68. DO_INVERT="H"
  69. fi
  70. [ ! -z $3 ] && OUTTM=$3 || unset OUTTM
  71. else
  72. # DIO Input channel address set
  73. unset DO
  74. k=0
  75. for i in A B C D E F G H P Q
  76. do
  77. j[$k]=$i
  78. k=$[$k+1]
  79. done
  80. CH=${j[$n]}
  81. fi
  82. dio_setup(){
  83. cat>$CMD<<END
  84. #!/bin/sh
  85. dio_out() {
  86. # dio_out CH DATA
  87. echo -en "${DI_ADR}\${2}\${1}\${3}\\r"
  88. if [ \$? != "0" ]; then
  89. echo -en "-1" >/dev/stderr
  90. return -1
  91. fi
  92. }
  93. dio_out_in(){
  94. # dio out after read
  95. msleep ${READTM}
  96. read -s -n 3 -t 1 R || R="-1"
  97. [ \`echo -en \$R | awk '{ printf(length(\$0))}'\` != 3 ] && R="-1"
  98. if [ \$R != "-1" ];then
  99. echo -en \$R |awk '{D=substr(\$0,2,1);sub("L","0",D);sub("H","1",D);printf D}'>/dev/stderr
  100. else
  101. echo -en "-1" >/dev/stderr
  102. return -1
  103. fi
  104. }
  105. dio_in() {
  106. # dio_input CH
  107. local ch
  108. ch=\$1
  109. [ \$1 = "Q" ] && ch=""
  110. echo -en "${DI_ADR}R\${ch}\\r"
  111. msleep ${READTM}
  112. if [ \$1 = "Q" ];then
  113. read -s -n 5 -t 1 R || R="-1"
  114. [ \`echo -en \$R | awk '{ printf(length(\$0))}'\` != 5 ] && R="-1"
  115. else
  116. read -s -n 3 -t 1 R || R="-1"
  117. [ \`echo -en \$R | awk '{ printf(length(\$0))}'\` != 3 ] && R="-1"
  118. fi
  119. if [ \$R != "-1" ];then
  120. [ \${1} = "P" ] && echo -en \$R |awk '{D=substr(\$0,2,2);printf D}'>/dev/stderr
  121. [ \${1} = "Q" ] && echo -en \$R |awk '{D=substr(\$0,2,4);printf D}'>/dev/stderr
  122. [ \${1} != "P" ] && [ \${1} != "Q" ] && echo -en \$R |awk '{D=substr(\$0,3,1);sub("L","0",D);sub("H","1",D);printf D}'>/dev/stderr
  123. else
  124. echo -en "-1" >/dev/stderr
  125. return -1
  126. fi
  127. }
  128. END
  129. }
  130. dio_exec(){
  131. # lockfile & DIO command exec
  132. RETRY=$TRY
  133. while [ $RETRY != 0 ]
  134. do
  135. lockfile -0 -r 1 ${LOCKFILE} >/dev/null 2>&1
  136. [ $? = 0 ] && break
  137. msleep `echo -en $RANDOM |cut -c 1-2`
  138. RETRY=$(($RETRY - 1))
  139. done
  140. if [ $RETRY = 0 ];then
  141. echo -en "-1" >/dev/stderr
  142. rm -f $CMD
  143. return
  144. else
  145. echo -en $$ >${LOCKFILE}
  146. chmod +x $CMD
  147. $CMD_DIO
  148. rm -f $CMD
  149. rm -f ${LOCKFILE}
  150. fi
  151. }
  152. if [ ! -z $DO ];then
  153. # DIO Ouput mode
  154. if [ ! -z $OUTTM ];then
  155. if [ ${OUTTM} -lt 656 ];then
  156. OUTTM=$(($OUTTM * 100))
  157. dio_setup
  158. cat>>$CMD<<END
  159. dio_out ${CH} ${DO} ${OUTTM}
  160. dio_out_in ${CH}
  161. END
  162. dio_exec
  163. else
  164. dio_setup
  165. cat>>$CMD<<END
  166. dio_out ${CH} ${DO}
  167. END
  168. dio_exec
  169. msleep $OUTTM
  170. dio_setup
  171. cat>>$CMD<<END
  172. dio_out ${CH} ${DO_INVERT}
  173. msleep $WAIT
  174. dio_out_in ${CH}
  175. END
  176. dio_exec
  177. fi
  178. else
  179. dio_setup
  180. cat>>$CMD<<END
  181. dio_out ${CH} ${DO}
  182. msleep $WAIT
  183. dio_out_in ${CH}
  184. END
  185. dio_exec
  186. fi
  187. else
  188. # DIO Input mode
  189. dio_setup
  190. cat>>$CMD<<END
  191. dio_in ${CH}
  192. END
  193. dio_exec
  194. exit 0
  195. fi