pepodiod

最初に

pepodiodとはPepoLinux-0.51以降に収録されているシリアルDIOボード各ポートのON/OFF状態をポーリング監視して予め設定されたプログラムを起動するちょっとしたプログラムです。

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

更新履歴

2011.12.6

0-7チャンネル8本分の入力ポートを一度に読み込むようにしたので処理速度がアップした。

2012.1.11

デバイス未接続状態から接続状態時に正常動作しないバクを修正

2012.1.19

ワークディレクトリを変更

2012.2.21

o ポーリングタイマーを2秒→1秒、他clean up

2012.3.3

DIOリードデータを8個同時にファイル書き込みするように変更

2012.3.6

o DIOリードデータ取得に失敗した時にイベントスクリプトを起動するバグを修正

2012.3.12

o pepodioctlのバージョンUPで入力情報15ビットを処理できるように変更

o 出力情報をファイルに一度に書き出すように変更

o WEBUIのAjax用JSONデータを作るようにした

2012.3.27

o DIO8本の入力端子のhigh2lowとlow2highのカウンターをJSONデータとして追加した

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

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

2012.3.29 by.Yamauchi Isamu also IZAMUKARERA.

  1. #!/bin/sh
  2. # licence GPLv2 ; this scripts designed by IZAMUKARERA 2011.10.7 update 2012.3.27
  3. # pepodiod for daemon contorl digital-Input to ANDDIO
  4. DIOCTL="/usr/local/bin/pepodioctl 9"
  5. USR_BIN=/usr/bin/dio
  6. EXEC_CMD=/usr/local/bin/pepodiodexec
  7. PATH=$PATH:/usr/local/bin:/usr/local/sbin
  8. DIR=/var/www/html/remote-hand/tmp
  9. DIORD=$DIR/.di_read_data
  10. DIOWD=$DIR/.do_write_data
  11. tDIORD=$DIR/.di_read_data.tmp
  12. tDIOWD=$DIR/.do_write_data.tmp
  13. JSONRD=$DIR/.di_read_data.json
  14. tJSONRD=$DIR/.di_read_data.json.tmp
  15. prog=pepodiod
  16. pidfile=/var/run/$prog.pid
  17. echo -en $$ >$pidfile
  18. POLLTIME=1000
  19. error(){
  20. [ -e $tDIORD ] && rm -f $tDIORD
  21. [ -e $DIORD ] && rm -f $DIORD
  22. [ -e $DIOWD ] && rm -f $DIOWD
  23. [ -e $tDIOWD ] && rm -f $tDIOWD
  24. [ -e "$JSONRD" ] && rm -f $JSONRD
  25. [ -e "$tJSONRD" ] && rm -f $tJSONRD
  26. [ -e $pidfile ] && rm -f $pidfile
  27. exit 0
  28. }
  29. exec_cmd() {
  30. # dio read & High or Low exec command
  31. # exec_dio ch low or high
  32. echo ${USR_BIN}${1}${2} >/dev/tty1
  33. if [ -e ${USR_BIN}${1}${2} ];then
  34. $EXEC_CMD ${USR_BIN}${1}${2} >/dev/null 2>&1
  35. fi
  36. }
  37. trap error SIGTERM SIGHUP SIGKILL
  38. # dio read data initialize
  39. RD="-1"
  40. RD=`$DIOCTL 2>&1`
  41. if [ $RD != "-1" ];then
  42. for i in 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192; do
  43. case "$i" in
  44. 1) tRD="$(($((0x$RD & 1)) / 1))" ;j=0 ;;
  45. 2) tRD="$(($((0x$RD & 2)) / 2))" ;j=1 ;;
  46. 4) tRD="$(($((0x$RD & 4)) / 4))" ;j=2 ;;
  47. 8) tRD="$(($((0x$RD & 8)) / 8))" ;j=3 ;;
  48. 16) tRD="$(($((0x$RD & 16)) / 16))" ;j=4 ;;
  49. 32) tRD="$(($((0x$RD & 32)) / 32))" ;j=5 ;;
  50. 64) tRD="$(($((0x$RD & 64)) / 64))" ;j=6 ;;
  51. 128) tRD="$(($((0x$RD & 128)) / 128))" ;j=7 ;;
  52. 256) tRD="$(($((0x$RD & 256)) / 256))" ;j=8 ;;
  53. 512) tRD="$(($((0x$RD & 512)) / 512))" ;j=9 ;;
  54. 1024) tRD="$(($((0x$RD & 1024)) / 1024))" ;j=10 ;;
  55. 2048) tRD="$(($((0x$RD & 2048)) / 2048))" ;j=11 ;;
  56. 4096) tRD="$(($((0x$RD & 4096)) / 4096))" ;j=12 ;;
  57. 8192) tRD="$(($((0x$RD & 8192)) / 8192))" ;j=13 ;;
  58. esac
  59. old[$j]=$tRD
  60. done
  61. else
  62. for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13;do
  63. old[$i]="-1"
  64. done
  65. fi
  66. cat>$tDIORD<<END
  67. di[0]=${old[0]}
  68. di[1]=${old[1]}
  69. di[2]=${old[2]}
  70. di[3]=${old[3]}
  71. di[4]=${old[4]}
  72. di[5]=${old[5]}
  73. di[6]=${old[6]}
  74. di[7]=${old[7]}
  75. END
  76. mv $tDIORD $DIORD
  77. cat>$tDIOWD<<END
  78. do[0]=${old[8]}
  79. do[1]=${old[9]}
  80. do[2]=${old[10]}
  81. do[3]=${old[11]}
  82. do[4]=${old[12]}
  83. do[5]=${old[13]}
  84. END
  85. mv $tDIOWD $DIOWD
  86. chown apache.apache $DIORD
  87. chown apache.apache $DIOWD
  88. # loop for dio polling read
  89. while true
  90. do
  91. RD="-1"
  92. RD=`$DIOCTL 2>&1`
  93. if [ "$RD" != "-1" ];then
  94. for i in 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384; do
  95. case "$i" in
  96. 1) tRD="$(($((0x$RD & 1)) / 1))" ;j=0 ;;
  97. 2) tRD="$(($((0x$RD & 2)) / 2))" ;j=1 ;;
  98. 4) tRD="$(($((0x$RD & 4)) / 4))" ;j=2 ;;
  99. 8) tRD="$(($((0x$RD & 8)) / 8))" ;j=3 ;;
  100. 16) tRD="$(($((0x$RD & 16)) / 16))" ;j=4 ;;
  101. 32) tRD="$(($((0x$RD & 32)) / 32))" ;j=5 ;;
  102. 64) tRD="$(($((0x$RD & 64)) / 64))" ;j=6 ;;
  103. 128) tRD="$(($((0x$RD & 128)) / 128))" ;j=7 ;;
  104. 256) tRD="$(($((0x$RD & 256)) / 256))" ;j=8 ;;
  105. 512) tRD="$(($((0x$RD & 512)) / 512))" ;j=9 ;;
  106. 1024) tRD="$(($((0x$RD & 1024)) / 1024))" ;j=10 ;;
  107. 2048) tRD="$(($((0x$RD & 2048)) / 2048))" ;j=11 ;;
  108. 4096) tRD="$(($((0x$RD & 4096)) / 4096))" ;j=12 ;;
  109. 8192) tRD="$(($((0x$RD & 8192)) / 8192))" ;j=13 ;;
  110. esac
  111. new[$j]=$tRD
  112. done
  113. else
  114. for i in 0 1 2 3 4 5 6 7 8 9 10 11 12 13;do
  115. new[$i]="-1"
  116. done
  117. fi
  118. for i in 0 1 2 3 4 5 6 7;do
  119. [ ${new[$i]} = "-1" ] && break
  120. if [ "${old[$i]}" != "${new[$i]}" ];then
  121. if [ "${old[$i]}" = "1" ];then
  122. old[$i]=${new[$i]}
  123. exec_cmd $i low
  124. j=`expr $i + 8`
  125. exec_cmd $j low
  126. elif [ "${old[$i]}" = "0" ];then
  127. old[$i]=${new[$i]}
  128. exec_cmd $i high
  129. j=`expr $i + 8`
  130. exec_cmd $j high
  131. else
  132. old[$i]=${new[$i]}
  133. fi
  134. fi
  135. done
  136. cat>$tDIORD<<END
  137. di[0]=${new[0]}
  138. di[1]=${new[1]}
  139. di[2]=${new[2]}
  140. di[3]=${new[3]}
  141. di[4]=${new[4]}
  142. di[5]=${new[5]}
  143. di[6]=${new[6]}
  144. di[7]=${new[7]}
  145. END
  146. cat>$tDIOWD<<END
  147. do[0]=${new[8]}
  148. do[1]=${new[9]}
  149. do[2]=${new[10]}
  150. do[3]=${new[11]}
  151. do[4]=${new[12]}
  152. do[5]=${new[13]}
  153. END
  154. mv $tDIORD $DIORD
  155. mv $tDIOWD $DIOWD
  156. chown apache.apache $DIORD
  157. chown apache.apache $DIOWD
  158. [ -e $DIORD ] && . $DIORD
  159. [ -e $DIOWD ] && . $DIOWD
  160. for n in 0 1 2 3 4 5 6 7;do
  161. case "$n" in
  162. 0)
  163. [ "${di[$n]}" = "1" ] && di0="high"
  164. [ "${di[$n]}" = "0" ] && di0="low"
  165. [ "${di[$n]}" = "-1" ] && di0="none"
  166. ;;
  167. 1)
  168. [ "${di[$n]}" = "1" ] && di1="high"
  169. [ "${di[$n]}" = "0" ] && di1="low"
  170. [ "${di[$n]}" = "-1" ] && di1="none"
  171. ;;
  172. 2)
  173. [ "${di[$n]}" = "1" ] && di2="high"
  174. [ "${di[$n]}" = "0" ] && di2="low"
  175. [ "${di[$n]}" = "-1" ] && di2="none"
  176. ;;
  177. 3)
  178. [ "${di[$n]}" = "1" ] && di3="high"
  179. [ "${di[$n]}" = "0" ] && di3="low"
  180. [ "${di[$n]}" = "-1" ] && di3="none"
  181. ;;
  182. 4)
  183. [ "${di[$n]}" = "1" ] && di4="high"
  184. [ "${di[$n]}" = "0" ] && di4="low"
  185. [ "${di[$n]}" = "-1" ] && di4="none"
  186. ;;
  187. 5)
  188. [ "${di[$n]}" = "1" ] && di5="high"
  189. [ "${di[$n]}" = "0" ] && di5="low"
  190. [ "${di[$n]}" = "-1" ] && di5="none"
  191. ;;
  192. 6)
  193. [ "${di[$n]}" = "1" ] && di6="high"
  194. [ "${di[$n]}" = "0" ] && di6="low"
  195. [ "${di[$n]}" = "-1" ] && di6="none"
  196. ;;
  197. 7)
  198. [ "${di[$n]}" = "1" ] && di7="high"
  199. [ "${di[$n]}" = "0" ] && di7="low"
  200. [ "${di[$n]}" = "-1" ] && di7="none"
  201. ;;
  202. esac
  203. done
  204. for n in 0 1 2 3 4 5;do
  205. case "$n" in
  206. 0)
  207. [ "${do[$n]}" = "1" ] && do0="high"
  208. [ "${do[$n]}" = "0" ] && do0="low"
  209. [ "${do[$n]}" = "-1" ] && do0="none"
  210. ;;
  211. 1)
  212. [ "${do[$n]}" = "1" ] && do1="high"
  213. [ "${do[$n]}" = "0" ] && do1="low"
  214. [ "${do[$n]}" = "-1" ] && do1="none"
  215. ;;
  216. 2)
  217. [ "${do[$n]}" = "1" ] && do2="high"
  218. [ "${do[$n]}" = "0" ] && do2="low"
  219. [ "${do[$n]}" = "-1" ] && do2="none"
  220. ;;
  221. 3)
  222. [ "${do[$n]}" = "1" ] && do3="high"
  223. [ "${do[$n]}" = "0" ] && do3="low"
  224. [ "${do[$n]}" = "-1" ] && do3="none"
  225. ;;
  226. 4)
  227. [ "${do[$n]}" = "1" ] && do4="high"
  228. [ "${do[$n]}" = "0" ] && do4="low"
  229. [ "${di[$n]}" = "-1" ] && do4="none"
  230. ;;
  231. 5)
  232. [ "${do[$n]}" = "1" ] && do5="high"
  233. [ "${do[$n]}" = "0" ] && do5="low"
  234. [ "${do[$n]}" = "-1" ] && do5="none"
  235. ;;
  236. esac
  237. done
  238. NOWDATE=`date +"%Y/%m/%d %T"`
  239. cat>$tJSONRD<<END
  240. {
  241. "di0":"$di0",
  242. "di1":"$di1",
  243. "di2":"$di2",
  244. "di3":"$di3",
  245. "di4":"$di4",
  246. "di5":"$di5",
  247. "di6":"$di6",
  248. "di7":"$di7",
  249. "do0":"$do0",
  250. "do1":"$do1",
  251. "do2":"$do2",
  252. "do3":"$do3",
  253. "do4":"$do4",
  254. "do5":"$do5",
  255. END
  256. CT=`ls -a $DIR/|egrep '.dio[0-7][low|high]+.count+$'`
  257. if [ -n `echo $CT | wc -w` ];then
  258. for DIO in $CT ; do
  259. DIOCONT=$DIR/$DIO
  260. tDIO=`echo -en $DIO |awk '{gsub("\\\.","");sub("count","");print $0}'`
  261. echo -en \"$tDIO\":{ >>$tJSONRD
  262. cat $DIOCONT |awk '
  263. /^Reset/{printf("%creset%c:%c%s %s%c,",34,34,34,$2,$3,34)}
  264. /^Update/{printf("%cupdate%c:%c%s %s%c,",34,34,34,$2,$3,34)}
  265. /^#/{sub("#","");printf("%ccount%c:%c%s%c},\n",34,34,34,$1,34)}
  266. ' >>$tJSONRD
  267. done
  268. fi
  269. echo -e \"date\":\"$NOWDATE\" >>$tJSONRD
  270. echo "}" >>$tJSONRD
  271. mv $tJSONRD $JSONRD
  272. chown apache.apache $JSONRD
  273. msleep ${POLLTIME}
  274. done