SVX日記
2009-02-04(Wed) Fedora9、電子工作チューン
というのも、本格的な電子工作は約1年前にロータリエンコーダをゴソゴソやって以来だ。ちなみにソレは放置状態。まぁ、念願が叶ってWindowsを捨て、PC環境をFedoraに移し、7やらVistaやらXPやらのゴタゴタから完全に解放され、すこぶる気分よく毎日を過ごしているが、電子工作まわりの環境だけは、ほとんどイチから構築しなければならない……つーか、そもそも構築できるモンなんやろか?
つーわけで、まずは、オイラが回路デザインをする時に必須な、回路図エディタ……というか、実体配線図エディタをどうにかしなければならんのだが、Windows時代に愛用していたBschは、どうやらLinuxでも動くらしい。早速、コンパイルを試みる。
/home/mitsu/develop # mkdir bsch
/home/mitsu/develop # cd bsch
/home/mitsu/develop/bsch # wget http://www.suigyodo.com/online/e/qbsv047.tgz
/home/mitsu/develop/bsch # wget http://www.suigyodo.com/online/e/qlcv043.tgz
/home/mitsu/develop/bsch # wget http://www.suigyodo.com/online/qnl047a.tgz
/home/mitsu/develop/bsch # wget http://www.suigyodo.com/online/qnu043a.tgz
/home/mitsu/develop/bsch # wget http://www.suigyodo.com/online/c2t3c003.tgz
/home/mitsu/develop/bsch # tar xvfz qbsv047.tgz
/home/mitsu/develop/bsch # cd qbsv047
/home/mitsu/develop/bsch/qbsv047 # cat readme-j.txt | toutf8
/home/mitsu/develop/bsch/qbsv047 # cd qtbsch3v
/home/mitsu/develop/bsch/qbsv047/qtbsch3v # qmake
-bash: qmake: command not found
/home/mitsu/develop/bsch/qbsv047/qtbsch3v # yum search qt
/home/mitsu/develop/bsch/qbsv047/qtbsch3v # yum install qt-devel
/home/mitsu/develop/bsch/qbsv047/qtbsch3v # qmake-qt4
/home/mitsu/develop/bsch/qbsv047/qtbsch3v # make
g++ -c -pipe -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_QT3SUPPORT_LIB -DQT3_SUPPORT -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/qt4/mkspecs/linux-g++ -I. -I/usr/include/QtCore -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include/QtGui -I/usr/include/Qt3Support -I/usr/include/Qt3Support -I/usr/include -I. -I. -I. -o complib.o complib.cpp
In file included from complib.h:30,
from complib.cpp:33:
sptnobjtext.h:40: 警告: unused parameter ‘grip’
complib.cpp: In member function ‘bool SPtn::readCe3(SReadCE3&)’:
complib.cpp:244: error: ‘atoi’ was not declared in this scope
complib.cpp:248: error: ‘atoi’ was not declared in this scope
complib.cpp:192: 警告: unused variable ‘vBuffCount’
complib.cpp:193: 警告: unused variable ‘n’
complib.cpp:193: 警告: unused variable ‘i’
complib.cpp: In member function ‘bool SPin::readCe3(SReadCE3&, int)’:
complib.cpp:424: error: ‘atoi’ was not declared in this scope
complib.cpp: In member function ‘bool SCompInfo::readCe3(SReadCE3&, std::string&, std::string&)’:
complib.cpp:738: error: ‘atoi’ was not declared in this scope
complib.cpp:741: error: ‘atoi’ was not declared in this scope
complib.cpp:745: error: ‘atoi’ was not declared in this scope
complib.cpp: In member function ‘std::string SCompLib::uniqueName(const std::string&)’:
complib.cpp:1221: error: ‘atoi’ was not declared in this scope
complib.cpp: In member function ‘bool SCompLib::ReadLb3(SReadCE3&, bool)’:
complib.cpp:1347: 警告: deprecated conversion from string constant to ‘char*’
complib.cpp: In member function ‘bool SCompLib::readLibraryFile(const char*)’:
complib.cpp:1511: 警告: deprecated conversion from string constant to ‘char*’
complib.cpp:1519: 警告: unused variable ‘len’
make: *** [complib.o] エラー 1
/home/mitsu/develop/bsch/qbsv047/qtbsch3v # emacs stdafx.h
+ #include <stdlib.h>
/home/mitsu/develop/bsch/qbsv047/qtbsch3v # make
g++ -c -pipe -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_QT3SUPPORT_LIB -DQT3_SUPPORT -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/qt4/mkspecs/linux-g++ -I. -I/usr/include/QtCore -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include/QtGui -I/usr/include/Qt3Support -I/usr/include/Qt3Support -I/usr/include -I. -I. -I. -o sptnobjpolygon.o sptnobjpolygon.cpp
sptnobjpolygon.cpp: In member function ‘virtual SRect SPtnObjPolygon::area()’:
sptnobjpolygon.cpp:76: error: ‘INT_MAX’ was not declared in this scope
sptnobjpolygon.cpp: In member function ‘virtual bool SPtnObjPolygon::readCe3(SReadCE3&)’:
sptnobjpolygon.cpp:289: error: ‘INT_MIN’ was not declared in this scope
sptnobjpolygon.cpp:366: 警告: deprecated conversion from string constant to ‘char*’
make: *** [sptnobjpolygon.o] エラー 1
/home/mitsu/develop/bsch/qbsv047/qtbsch3v # emacs stdafx.h
+ #define INT_MAX (2^31) - 1
+ #define INT_MIN -(2^31)
/home/mitsu/develop/bsch/qbsv047/qtbsch3v # make
g++ -c -pipe -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_QT3SUPPORT_LIB -DQT3_SUPPORT -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/qt4/mkspecs/linux-g++ -I. -I/usr/include/QtCore -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include/QtGui -I/usr/include/Qt3Support -I/usr/include/Qt3Support -I/usr/include -I. -I. -I. -o xbschdoc.o xbschdoc.cpp
In file included from complib.h:30,
from xbschcomponent.h:28,
from xbschdoc.h:32,
from xbschdoc.cpp:45:
sptnobjtext.h:40: 警告: unused parameter ‘grip’
xbschdoc.cpp:734: 警告: unused parameter ‘wce3’
xbschdoc.cpp:734: 警告: unused parameter ‘pList’
xbschdoc.cpp:734: 警告: unused parameter ‘bOwnOnly’
xbschdoc.cpp: In member function ‘void SXBSchDoc::selectForDragPinConnection(int, const SRect&, bool)’:
xbschdoc.cpp:1399: 警告: unused variable ‘tempSize’
xbschdoc.cpp: In member function ‘virtual bool SXBSchDoc::findStringCompare(const char*, const char*, bool)’:
xbschdoc.cpp:1734: error: ‘strcmp’ was not declared in this scope
xbschdoc.cpp:1736: error: ‘strstr’ was not declared in this scope
make: *** [xbschdoc.o] エラー 1
/home/mitsu/develop/bsch/qbsv047/qtbsch3v # emacs stdafx.h
+ #include <string.h>
/home/mitsu/develop/bsch/qbsv047/qtbsch3v # make
g++ -o qtbsch3v application.o ce3io.o cfgdata.o complib.o componentview.o coord.o drawcomponent.o drawcomponentbase.o drawobject.o editcommentdlg.o editcomponent.o editcomponentimpl.o editlabel.o editlabelimpl.o edittag.o edittagimpl.o main.o printOptionDlg.o selcomp.o selcompimpl.o setlib.o setlibimpl.o setSheetSize.o setlayerdlg.o sptnobj.o sptnobjarc.o sptnobjcircle.o sptnobjline.o sptnobjpolygon.o sptnobjtext.o xbschcomment.o xbschcomponent.o xbschdoc.o xbschdocsch.o xbschdrawobject.o xbschentry.o xbschfont.o xbschglobal.o xbschjunc.o xbschlabel.o xbschline.o xbschobj.o xbschpattern.o xbschsheetinfo.o xbschtag.o xbschview.o moc_application.o moc_componentview.o moc_editcommentdlg.o moc_editcomponent.o moc_editcomponentimpl.o moc_editlabel.o moc_editlabelimpl.o moc_edittag.o moc_edittagimpl.o moc_printOptionDlg.o moc_selcomp.o moc_selcompimpl.o moc_setlib.o moc_setlibimpl.o moc_setSheetSize.o moc_setlayerdlg.o moc_xbschview.o -lQt3Support -lQtGui -lQtCore -lpthread
/home/mitsu/develop/bsch/qbsv047/qtbsch3v # ./qtbsch3v
/home/mitsu/develop/bsch/qbsv047/qtbsch3v # cp qtbsch3v /usr/local/bin
/home/mitsu/develop/bsch/qbsv047/qtbsch3v # cd ..
/home/mitsu/develop/bsch/qbsv047 # mkdir /usr/share/qtbsch3v
/home/mitsu/develop/bsch/qbsv047 # cp -r LIBV /usr/share/qtbsch3v
/home/mitsu/develop/bsch/qbsv047 # qtbsch3v
/home/mitsu/develop/bsch # tar xvfz c2t3c003.tgz
/home/mitsu/develop/bsch # cd c2t3c003
/home/mitsu/develop/bsch/c2t3c003 # cat ce2to3.txt | toutf8
/home/mitsu/develop/bsch/c2t3c003 # cd ce2to3
/home/mitsu/develop/bsch/c2t3c003/ce2to3 # g++ *.cpp
/home/mitsu/develop/bsch/c2t3c003/ce2to3 # emacs ce3io.h
+ #include <stdlib.h>
+ #define INT_MAX (2^31) - 1
+ #define INT_MIN -(2^31)
/home/mitsu/develop/bsch/c2t3c003/ce2to3 # g++ *.cpp
In file included from xbschcomponent.h:10,
from ce2to3.cpp:16:
complib.h:173: error: extra qualification ‘SCompIndex::’ on member ‘pin’
ce2to3.cpp: In function ‘SXBSchSheetInfo* readCE2SheetInfo(FILE*)’:
ce2to3.cpp:65: 警告: deprecated conversion from string constant to ‘char*’
In file included from complib.cpp:14:
complib.h:173: error: extra qualification ‘SCompIndex::’ on member ‘pin’
In file included from xbschcomponent.h:10,
from xbschcomponent.cpp:13:
complib.h:173: error: extra qualification ‘SCompIndex::’ on member ‘pin’
In file included from xbschcomponent.h:10,
from xbschdoc.cpp:20:
complib.h:173: error: extra qualification ‘SCompIndex::’ on member ‘pin’
In file included from xbschglobal.cpp:16:
complib.h:173: error: extra qualification ‘SCompIndex::’ on member ‘pin’
xbschline.cpp:10 から include されたファイル中:
ce3io.h:12:1: 警告: "INT_MAX" が再定義されました
xbschline.cpp:7 から include されたファイル中:
/usr/lib/gcc/i386-redhat-linux/4.3.0/include/limits.h:74:1: 警告: ここが以前の宣言がある位置です
xbschline.cpp:10 から include されたファイル中:
ce3io.h:13:1: 警告: "INT_MIN" が再定義されました
xbschline.cpp:7 から include されたファイル中:
/usr/lib/gcc/i386-redhat-linux/4.3.0/include/limits.h:72:1: 警告: ここが以前の宣言がある位置です
/home/mitsu/develop/bsch/c2t3c003/ce2to3 # emacs complib.h
- SPin* SCompIndex::pin(int index,int dir,int& nLtrb,SPoint& ptEnd) const;
+ SPin* pin(int index,int dir,int& nLtrb,SPoint& ptEnd) const;
/home/mitsu/develop/bsch/c2t3c003/ce2to3 # g++ *.cpp
/home/mitsu/develop/bsch/c2t3c003/ce2to3 # cp a.out /usr/local/bin/ce2to3
/home/mitsu/develop/picNewDisp $ ce2to3 picNDisp.CE2
/home/mitsu/develop/picNewDisp $ qtbsch3v picNDisp.ce3
部品がトンでしまっているので、ワケがわからんが、これは約2年前のLCDパネルの実体配線図だ。近々、XPortを使って、コレのLANポート版を作りたいと思っているのだが。
/home/mitsu/develop/bsch # yum search gpasm
/home/mitsu/develop/bsch # yum install ktechlab
/home/mitsu/develop/picNewDisp $ ../pic80ppc/pic80ppc picNDisp.s
/home/mitsu/develop/picNewDisp $ gpasm -l
/home/mitsu/develop/picNewDisp $ gpasm -p p16f648a picNDisp.asm
/home/mitsu/develop/picNewDisp $ emacs test.asm
include "p16f648a.inc"
org 00h
goto start
org 04h
goto start
start
goto start
END
/home/mitsu/develop/picNewDisp $ gpasm -p p16f648a test.asm
/home/mitsu/develop/picNewDisp $ cat test.hex
:020000040000FA
:020000000528D1
:04000800052805289A
:00000001FF
なんだか、それっぽい出力は得られた。こっち方面もオッケーっぽいな……っと思ったところで、どーも、最近の開発トレンドはPICですらCらしい。オイラは、Z80っぽいニーモックを、PICのソレに変換するようなプリプロセッサを書いたくらいの(Z80)アセンブラ好きだが、そんなにラクができるんならば、Cもカジらせてもらおうかしらん。
/home/mitsu/develop/bsch # yum search sdcc
/home/mitsu/develop/bsch # yum install sdcc
/home/mitsu/develop/sdcc # cat test.c
#include <pic16f84a.h>
int main() {
while (1) {
}
}
/home/mitsu/develop/sdcc # sdcc test.c
-bash: sdcc: command not found
/home/mitsu/develop/sdcc # rpm -ql sdcc
/home/mitsu/develop/sdcc # cat /usr/share/doc/sdcc-2.8.0/README.fedora
Many of the executables in SDCC have very generic names. Therefore the binaries
are installed into $PREFIX/libexec/sdcc/, and symlinks with prefix sdcc- are
created in $PREFIX/bin. If this is a problem for you, you can add
$PREFIX/libexec/sdcc/ to you path.
/home/mitsu/develop/sdcc # sdcc-sdcc -mpic14 -p16f648a test.c
libsdcc.lib: No such file or directory
/home/mitsu/develop/sdcc # sdcc-sdcc -V -mpic14 -p16f648a test.c
+ "/usr/libexec/sdcc/sdcpp" -nostdinc -Wall -std=c99 -obj-ext=.o -DSDCC_MODEL_SMALL -DSDCC=260 -DSDCC_pic14 -D__pic14 -DSDCC_PROCESSOR="16f648a" -I"/usr/libexec/sdcc/../share/sdcc/include/pic14" -I"/usr/share/sdcc/include/pic14" -I"/usr/libexec/sdcc/../share/sdcc/include" -I"/usr/share/sdcc/include" -I"/usr/libexec/sdcc/../share/sdcc/include/pic" -I"/usr/share/sdcc/include/pic" "test.c"
+ "gpasm" -c "test.asm"
+ "gplink" -I"/usr/libexec/sdcc/../share/sdcc/lib" -I"/usr/share/sdcc/lib" -I"/usr/libexec/sdcc/../share/sdcc/lib/pic" -I"/usr/share/sdcc/lib/pic" -o test test.o libsdcc.lib pic16f648a.lib
libsdcc.lib: No such file or directory
でも、なんかダメっすぜ。つーか、コレにはハマった。原因はコレ。なッ、なんだこのマヌケなやりとりはッ!!
/home/mitsu/develop/sdcc # ls /usr/share/sdcc/lib/pic
-rw-r--r-- 1 root root 8 2008-11-15 06:30 pic.lib
/home/mitsu/develop/sdcc # ls /usr/share/sdcc/lib/pic16
-rw-r--r-- 1 root root 10 2008-11-15 06:30 pic16.lib
/home/mitsu/develop/sdcc # wget http://mirrors.nl.eu.kernel.org/fedora/updates/9/SRPMS.newkey/sdcc-2.8.0-3.fc9.src.rpm
/home/mitsu/develop/sdcc # rpm -ivh sdcc-2.8.0-3.fc9.src.rpm
/home/mitsu/develop/sdcc # cd /usr/src/redhat/SPECS
/usr/src/redhat/SPECS # rpmbuild -bp sdcc.spec
/usr/src/redhat/SPECS # yum install lyx latex2html gc-devel
/usr/src/redhat/SPECS # rpmbuild -bp sdcc.spec
/usr/src/redhat/SPECS # rpmbuild -ba sdcc.spec
/usr/src/redhat/BUILD # cp /usr/src/redhat/BUILD/sdcc/device/lib/pic/bin/* /usr/share/sdcc/lib/pic/
/usr/src/redhat/BUILD # cp /usr/src/redhat/BUILD/sdcc/device/lib/pic16/bin/* /usr/share/sdcc/lib/pic16
/home/mitsu/develop/sdcc # sdcc-sdcc -V -mpic14 -p16f648a test.c
+ "/usr/libexec/sdcc/sdcpp" -nostdinc -Wall -std=c99 -obj-ext=.o -DSDCC_MODEL_SMALL -DSDCC=280 -DSDCC_REVISION=5117 -DSDCC_pic14 -D__pic14 -DSDCC_PROCESSOR="16f648a" -I"/usr/libexec/sdcc/../share/sdcc/include/pic14" -I"/usr/share/sdcc/include/pic14" -I"/usr/libexec/sdcc/../share/sdcc/include" -I"/usr/share/sdcc/include" -I"/usr/libexec/sdcc/../share/sdcc/include/pic" -I"/usr/share/sdcc/include/pic" "test.c"
+ "gpasm" -c "test.asm"
+ "gplink" -I"/usr/libexec/sdcc/../share/sdcc/lib" -I"/usr/share/sdcc/lib" -I"/usr/libexec/sdcc/../share/sdcc/lib/pic" -I"/usr/share/sdcc/lib/pic" -w -r -o test test.o libsdcc.lib pic16f648a.lib
message: using default linker script "/usr/share/gputils/lkr/16f648a.lkr"
/home/mitsu/develop/akipic # wget http://members.jcom.home.ne.jp/pnms/src/akipic-0.1.8.tar.gz
/home/mitsu/develop/akipic # tar xvfz akipic-0.1.8.tar.gz
/home/mitsu/develop/akipic # cd akipic-0.1.8
/home/mitsu/develop/akipic/akipic-0.1.8 # make
2009-02-05(Thu) Fedora9、電子工作チューンII
/home/mitsu/develop/bsch # tar xvfz qlcv043.tgz
/home/mitsu/develop/bsch # cd qlcv043
/home/mitsu/develop/bsch/qlcv043 # cat readme-j.txt | toutf8
/home/mitsu/develop/bsch/qlcv043 # cd qtlcov
/home/mitsu/develop/bsch/qlcv043/qtlcov # qmake-qt4
/home/mitsu/develop/bsch/qlcv043/qtlcov # make
g++ -c -pipe -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_QT3SUPPORT_LIB -DQT3_SUPPORT -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/lib/qt4/mkspecs/linux-g++ -I. -I/usr/include/QtCore -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include/QtGui -I/usr/include/Qt3Support -I/usr/include/Qt3Support -I/usr/include -I. -I. -I. -o compeditdoc.o compeditdoc.cpp
In file included from complib.h:30,
from compeditdoc.h:28,
from compeditdoc.cpp:23:
sptnobjtext.h:40: 警告: unused parameter ‘grip’
compeditdoc.cpp: In member function ‘bool SCompEditDoc::releaseTemp()’:
compeditdoc.cpp:44: 警告: unused variable ‘allNewPlace’
compeditdoc.cpp: In member function ‘void SCompEditDoc::setupTempArea()’:
compeditdoc.cpp:371: error: ‘INT_MAX’ was not declared in this scope
compeditdoc.cpp:371: error: ‘INT_MIN’ was not declared in this scope
make: *** [compeditdoc.o] エラー 1
/home/mitsu/develop/bsch/qlcv043/qtlcov # emacs stdafx.h
+ #include <stdlib.h>
+ #define INT_MAX (2^31) - 1
+ #define INT_MIN -(2^31)
/home/mitsu/develop/bsch/qlcv043/qtlcov # make
g++ -o qtlcov add_alias.o application.o ce3io.o cfgdata.o compeditdoc.o compeditelm.o complib.o componentview.o coord.o drawcomponentbase.o editptntextdlg.o lcolistboxitem.o lcovdoc.o main.o propcomponentdlg.o proppindlg.o propptn.o xbschfont.o sptnobj.o sptnobjarc.o sptnobjcircle.o sptnobjline.o sptnobjpolygon.o sptnobjtext.o xbschpattern.o moc_add_alias.o moc_application.o moc_componentview.o moc_editptntextdlg.o moc_propcomponentdlg.o moc_proppindlg.o moc_propptn.o -lQt3Support -lQtGui -lQtCore -lpthread
/home/mitsu/develop/bsch/qlcv043/qtlcov # cp qtlcov /usr/local/bin
/home/mitsu/develop/bsch/qlcv043/qtlcov # cd ..
/home/mitsu/develop/bsch/qlcv043 # mkdir apmenu
/home/mitsu/develop/bsch/qlcv043 # cd apmenu
/home/mitsu/develop/bsch/qlcv043/apmenu # emacs qtlcov.desktop
[Desktop Entry]
Name=Qt-LCoV
Name[ja]=Qt-LCoV 部品ライブラリ作成
GenericName=Component Library Editor
Comment=Component library editor for Qt-BSch3V
Exec=qtlcov %f
Icon=lco
Type=Application
Terminal=false
Categories=Electronics;
Encoding=UTF-8
/home/mitsu/develop/bsch/qlcv043/apmenu # cp qtlcov.desktop /usr/share/applications
/home/mitsu/develop/bsch/qlcv043/apmenu # convert ../qtlcov/lco.ico lco.png
/home/mitsu/develop/bsch/qlcv043/apmenu # file *png
lco-0.png: PNG image data, 32 x 32, 8-bit/color RGBA, non-interlaced
lco-1.png: PNG image data, 16 x 16, 8-bit/color RGBA, non-interlaced
/home/mitsu/develop/bsch/qlcv043/apmenu # cp lco-0.png /usr/share/icons/hicolor/32x32/apps/lco.png
/home/mitsu/develop/bsch/qlcv043/apmenu # cp lco-1.png /usr/share/icons/hicolor/16x16/apps/lco.png
/home/mitsu/develop/bsch/qlcv043/apmenu # cd /usr/share/icons/hicolor
/usr/share/icons/hicolor # gtk-update-icon-cache .
/usr/share/icons/hicolor # cd -
/home/mitsu/develop/bsch/qlcv043/apmenu # cd ../../qbsv047
/home/mitsu/develop/bsch/qbsv047 # mkdir apmenu
/home/mitsu/develop/bsch/qbsv047 # cd apmenu
/home/mitsu/develop/bsch/qbsv047/apmenu # emacs qtbsch3v.desktop
[Desktop Entry]
Name=Qt-BSch3V
Name[ja]=Qt-BSch3V 回路図エディタ
GenericName=Schematic Capture
Comment=Schematic capture based on Qt
Exec=qtbsch3v %f
Icon=bsch
Type=Application
Terminal=false
Categories=Electronics;
Encoding=UTF-8
/home/mitsu/develop/bsch/qbsv047/apmenu # cp qtbsch3v.desktop /usr/share/applications
/home/mitsu/develop/bsch/qbsv047/apmenu # convert ../qtbsch3v/bsch.ico bsch.png
/home/mitsu/develop/bsch/qbsv047/apmenu # file *png
bsch-0.png: PNG image data, 32 x 32, 8-bit/color RGBA, non-interlaced
bsch-1.png: PNG image data, 16 x 16, 8-bit/color RGBA, non-interlaced
/home/mitsu/develop/bsch/qbsv047/apmenu # cp bsch-0.png /usr/share/icons/hicolor/32x32/apps/bsch.png
/home/mitsu/develop/bsch/qbsv047/apmenu # cp bsch-1.png /usr/share/icons/hicolor/16x16/apps/bsch.png
/usr/share/icons/hicolor # cd /usr/share/icons/hicolor
/usr/share/icons/hicolor # gtk-update-icon-cache .
2009-02-07(Sat) Fedora9、電子工作チューン外伝
余談ではあるが、先日、ガッツリとした棚を購入して、部品の取り出し効率を極端にアップすることに成功した。しかしながら、どうしても必要な部品の選定にはそれなりに時間がかかってしまう。そこで、ハンダ付けは「常に『遊んでぇ!!』とプレッシャをかけてくるイッペイ(3)」が寝ている時に進めるとして、彼が起きている間は、LEDをピコピコさせたりして気を引きつつ、一緒になって部品の選定をし、作業時間を稼ぐのであった。
イッペイ(3)が寝た後、小一時間でLEDの取り付け以外は完了。今回のコンセプトはカスタマイズ。ピンヘッダの設定により、RXまたはTX、あるいは両方を選択的にモニタできるほか、左右のケーブルをピンヘッダ経由とすることで、容易にクロスケーブルバージョンに変更可能である。
しかし、当初「ラインモニタ」でググったら、高そうな機器がゾロゾロ出てきて思わずアワてたぞい。えぇ!? 単にRXかTXをフツーのPCのシリアルポートにぶっ込むだけじゃダメなのッ!? 安易に考えすぎてたか……と思ったが、別に安易に考えすぎてて正しかった。この機器によって、予定通り、RXかTXをフツーのPCのシリアルポートにぶっ込み、特別なAPなしに、フツーの端末APでモニタできたし。
モニタの目的は、秋月のPICライタAPのリバースエンジニアリング。実際、Linux用にPICライタ(ハードウェア)を作るのと、どっちが手間かはわからんが、高価なゼロプレッシャーソケットと、パッと開いてスグ始められる自作のEX-USB-CPシステムを有効活用しない手はない。とりあえず、Linux用のライタAPの作成に向け、少しバンガってみるのである。
2009-02-10(Tue) Fedora9、電子工作チューン外伝EX
昨日、Qt-BSch3Vの使い勝手がイマイチだ、などとオープンソース物件に対して文句を付けてしまったが、文句を付けたからには、自分で改修してしまうのである。文句を付けるからにはそれくらいはする。それが、オープンソース物件を使う際の「掟」である。最近は、使わせてもらっておいて、貢献する気もなく、文句ばかり言うという「失礼な輩」が増えているが、それはエチケットに反する。Oh!X の頃からの「言い出しっぺの法則」というのは、現在も有効なのである。文句があるなら、おまえがやれ、なのである。
- アクティブレイヤの切り替えがサクサクできるように、ショートカットを追加
- お目々が痛くならないように、色を元祖BSchコンパチに
- オブジェクトが、常にトップレイヤに配置されてしまうなど、いくつかのバグ修正
そんなこんなで書いたのが、上の図面。いやぁ、以前より、サクサクですわ。BSch3Vから、レイヤ設定ウィンドウが「ダイアログ」になってしまい、イチイチ閉じないと図面がイジれなくなってしまったのがイヤで、古いBSchを使い続けていたが、ショートカットキーの追加によって、それ以上の操作性になった。キャッホゥ。
と、それはそうと、このQt-BSch3Vは、本家のページにてメンテナンス終了宣言が出されつつあるようだ。少し残念。しかし、別にソースが提供出されていれば、遠慮なく終了宣言もできるってもんである(例え、無料とはいえ)。私は、今回の改造を行ったことで、BSchのコードは、ほぼ好きにイジれる、つまり「オレのモノ」になってしまっており、オマケにQtの基本まで身についた。正直、メンテナンス終了も、全然、痛くはない。
最近、オープンソースの利点のひとつに「気に入った環境が死ぬまで自由に使い倒せる」というのがあるんじゃないかと思い始めた。メンテが止まったって、OSが変わったって、少しの手間で、自分でどうにかできる。作者さんには超感謝である。
diff -U 3 qtbsch3v.org/application.cpp qtbsch3v/application.cpp
--- qtbsch3v.org/application.cpp 2006-07-08 15:02:55.000000000 +0900
+++ qtbsch3v/application.cpp 2009-02-10 23:31:18.000000000 +0900
@@ -449,13 +449,16 @@
//statusBar()->addWidget( msg, 4 );
- m_plabelX = new QLabel(" X:0000 ",statusBar());
- m_plabelY = new QLabel(" Y:0000 ",statusBar());
+ m_plabelL = new QLabel(" L:0 ",statusBar());
+ m_plabelX = new QLabel(" X:0000 ",statusBar());
+ m_plabelY = new QLabel(" Y:0000 ",statusBar());
//QFont statusfont( "helvetica", 10 ) ;
+ m_plabelL->setFont( tipfont );
m_plabelX->setFont( tipfont );
m_plabelY->setFont( tipfont );
//m_plabelX->setAlignment(AlignCenter);
//m_plabelY->setAlignment(AlignCenter);
+ statusBar()->addWidget(m_plabelL,0,true);
statusBar()->addWidget(m_plabelX,0,true);
statusBar()->addWidget(m_plabelY,0,true);
@@ -818,6 +821,38 @@
case Qt::Key_C:
ToolCmnt();
break;
+
+ case Qt::Key_Z:
+ AscentLayer();
+ break;
+ case Qt::Key_X:
+ DescentLayer();
+ break;
+
+ case Qt::Key_0:
+ ActiveLayer(0);
+ break;
+ case Qt::Key_1:
+ ActiveLayer(1);
+ break;
+ case Qt::Key_2:
+ ActiveLayer(2);
+ break;
+ case Qt::Key_3:
+ ActiveLayer(3);
+ break;
+ case Qt::Key_4:
+ ActiveLayer(4);
+ break;
+ case Qt::Key_5:
+ ActiveLayer(5);
+ break;
+ case Qt::Key_6:
+ ActiveLayer(6);
+ break;
+ case Qt::Key_7:
+ ActiveLayer(7);
+ break;
}
}
@@ -964,6 +999,29 @@
g_cfg.setInt("VIEW","GRID",bGridOn);
}
+void ApplicationWindow::AscentLayer()
+{
+ int n;
+ m_pXBSchView->setActiveLayer(n = (m_pXBSchView->activeLayer() - 1 + 8) % 8);
+ layerMove(n);
+ m_pXBSchView->RefreshView();
+}
+
+void ApplicationWindow::DescentLayer()
+{
+ int n;
+ m_pXBSchView->setActiveLayer(n = (m_pXBSchView->activeLayer() + 1) % 8);
+ layerMove(n);
+ m_pXBSchView->RefreshView();
+}
+
+void ApplicationWindow::ActiveLayer(int n)
+{
+ m_pXBSchView->setActiveLayer(n);
+ layerMove(n);
+ m_pXBSchView->RefreshView();
+}
+
//TOOL
void ApplicationWindow::ToolSelector()
{
@@ -1036,12 +1094,18 @@
//ビューでのカーソル位置の移動情報を受け取る
+void ApplicationWindow::layerMove(int l)
+{
+ char buff[16];
+ sprintf(buff," L:%d ",l);
+ m_plabelL->setText(buff);
+}
void ApplicationWindow::cursorMove(int x,int y)
{
char buff[16];
- sprintf(buff," X:%04d ",x);
+ sprintf(buff," X:%04d ",x);
m_plabelX->setText(buff);
- sprintf(buff," Y:%04d ",y);
+ sprintf(buff," Y:%04d ",y);
m_plabelY->setText(buff);
}
@@ -1352,13 +1416,15 @@
void ApplicationWindow::SetupLayer()
{
+ int n;
setlayerdlg dlg(this);
dlg.setVisibleLayer(m_pXBSchView->visibleLayer());
dlg.setActiveLayer(m_pXBSchView->activeLayer());
dlg.setDarkenNonActive(m_pXBSchView->darkenNonActiveLayer());
if(dlg.exec()){
m_pXBSchView->setVisibleLayer(dlg.visibleLayer());
- m_pXBSchView->setActiveLayer(dlg.activeLayer());
+ m_pXBSchView->setActiveLayer(n = dlg.activeLayer());
+ layerMove(n);
bool darken = dlg.darkenNonActive();
m_pXBSchView->setDarkenNonActiveLayer(darken);
g_cfg.setInt("VIEW","DARKEN_NONACTIVE_LAYER",(darken ? 1 : 0));
diff -U 3 qtbsch3v.org/application.h qtbsch3v/application.h
--- qtbsch3v.org/application.h 2006-07-08 15:02:55.000000000 +0900
+++ qtbsch3v/application.h 2009-02-09 22:58:58.000000000 +0900
@@ -95,6 +95,11 @@
void ViewZoomIn();
void ViewZoomOut();
void ViewGridOnOff();
+ //WALKLAYER
+ void AscentLayer();
+ void DescentLayer();
+ void ActiveLayer(int n);
+
//TOOL
void ToolSelector();
void ToolDrag();
@@ -119,6 +124,7 @@
void aboutQt();
//ビューでのカーソル位置の移動情報を受け取る
+ void layerMove(int n);
void cursorMove(int x,int y);
void toolChange();
@@ -140,6 +146,7 @@
Q3ToolBar* toolbar;
QString m_filename;
+ QLabel* m_plabelL;
QLabel* m_plabelX;
QLabel* m_plabelY;
diff -U 3 qtbsch3v.org/componentview.cpp qtbsch3v/componentview.cpp
--- qtbsch3v.org/componentview.cpp 2006-07-08 15:02:55.000000000 +0900
+++ qtbsch3v/componentview.cpp 2009-02-10 23:31:18.000000000 +0900
@@ -39,7 +39,7 @@
m_cursorOffset = -1;
QPalette palette;
- palette.setColor(QPalette::Window,Qt::white);
+ palette.setColor(QPalette::Window,Qt::black);
setPalette(palette);
//m_drawframe = false;
//viewport()->setBackgroundColor(QColor("white"));
@@ -116,7 +116,7 @@
void SComponentWidget::mousePressEvent( QMouseEvent * event )
{
- qDebug("SComponentWidget::mousePressEvent X=%d,Y=%d",event->x(),event->y());
+// qDebug("SComponentWidget::mousePressEvent X=%d,Y=%d",event->x(),event->y());
}
diff -U 3 qtbsch3v.org/drawcomponent.cpp qtbsch3v/drawcomponent.cpp
--- qtbsch3v.org/drawcomponent.cpp 2006-07-08 15:02:56.000000000 +0900
+++ qtbsch3v/drawcomponent.cpp 2009-02-10 23:31:18.000000000 +0900
@@ -57,11 +57,11 @@
QColor colText;
switch(nMode & 0xffff){
- case DRAW_ON: colText = QColor("blue"); break;
+ case DRAW_ON: colText = QColor("yellow"); break;
case DRAW_MONO: colText = Qt::color1; break;
- case DRAW_OFF: colText = QColor("white"); break;
+ case DRAW_OFF: colText = QColor("black"); break;
case DRAW_TEMP: colText = QColor("red"); break;
- case DRAW_DARK: colText = QColor("orange"); break;
+ case DRAW_DARK: colText = QColor("blue"); break;
}
SRect rc;
SSize sz;
diff -U 3 qtbsch3v.org/drawcomponentbase.cpp qtbsch3v/drawcomponentbase.cpp
--- qtbsch3v.org/drawcomponentbase.cpp 2006-07-08 15:02:56.000000000 +0900
+++ qtbsch3v/drawcomponentbase.cpp 2009-02-10 23:31:18.000000000 +0900
@@ -490,10 +490,10 @@
switch(nMode & 0xffff){
- case DRAW_ON: col = QColor("DarkGreen"); break;
+ case DRAW_ON: col = QColor("yellow"); break;
case DRAW_MONO: col = Qt::color1; break;
- case DRAW_OFF: col = QColor("white"); break;
- case DRAW_DARK: col = QColor("orange"); break;
+ case DRAW_OFF: col = QColor("black"); break;
+ case DRAW_DARK: col = QColor("blue"); break;
case DRAW_TEMP:
default:
col = QColor("red");
@@ -596,15 +596,15 @@
switch(nMode & 0xffff){
case DRAW_ON:
if(nType & PIN_TYPE_ZLENG){
- col = QColor("orange");
+ col = QColor("blue");
}else{
- col = QColor("DarkGreen");
+ col = QColor("yellow");
}
break;
case DRAW_MONO: col = Qt::color1; break;
- case DRAW_OFF: col = QColor("white"); break;
+ case DRAW_OFF: col = QColor("black"); break;
case DRAW_TEMP: col = QColor("red"); break;
- case DRAW_DARK: col = QColor("orange"); break;
+ case DRAW_DARK: col = QColor("blue"); break;
default: return;
}
@@ -826,10 +826,10 @@
QColor colText;
switch(nMode & 0xffff){
- case DRAW_ON: colText = QColor("blue"); break;
+ case DRAW_ON: colText = QColor("orange"); break;
case DRAW_MONO: colText = Qt::color1; break;
- case DRAW_OFF: colText = QColor("white"); break;
- case DRAW_DARK: colText = QColor("orange"); break;
+ case DRAW_OFF: colText = QColor("black"); break;
+ case DRAW_DARK: colText = QColor("blue"); break;
case DRAW_TEMP: colText = QColor("red"); break;
// case DRAW_XOR: colText = QColor("red"); break;
}
diff -U 3 qtbsch3v.org/drawobject.cpp qtbsch3v/drawobject.cpp
--- qtbsch3v.org/drawobject.cpp 2006-07-08 15:02:56.000000000 +0900
+++ qtbsch3v/drawobject.cpp 2009-02-10 23:31:18.000000000 +0900
@@ -140,10 +140,10 @@
switch(nMode & 0xffff){
- case DRAW_ON: col = QColor("darkCyan"); break;
+ case DRAW_ON: col = QColor(0, 255, 0); break; // green
case DRAW_MONO: col = Qt::color1; break;
- case DRAW_OFF: col = QColor("white"); break;
- case DRAW_DARK: col = QColor("orange"); break;
+ case DRAW_OFF: col = QColor("black"); break;
+ case DRAW_DARK: col = QColor("blue"); break;
case DRAW_TEMP: col = QColor("red"); break;
}
//p->setRasterOp(op);
@@ -202,10 +202,10 @@
switch(nMode & 0xffff){
- case DRAW_ON: col = QColor("blue"); break;
+ case DRAW_ON: col = QColor("cyan"); break;
case DRAW_MONO: col = Qt::color1; break;
- case DRAW_OFF: col = QColor("white"); break;
- case DRAW_DARK: col = QColor("orange"); break;
+ case DRAW_OFF: col = QColor("black"); break;
+ case DRAW_DARK: col = QColor("blue"); break;
case DRAW_TEMP:
col = QColor("red");
break;
@@ -270,10 +270,10 @@
QColor col;
switch(nMode & 0xffff){
- case DRAW_ON: col = QColor("blue"); break;
+ case DRAW_ON: col = QColor("cyan"); break;
case DRAW_MONO: col = Qt::color1; break;
- case DRAW_OFF: col = QColor("white"); break;
- case DRAW_DARK: col = QColor("orange"); break;
+ case DRAW_OFF: col = QColor("black"); break;
+ case DRAW_DARK: col = QColor("blue"); break;
case DRAW_TEMP: col = QColor("red"); break;
}
//p->setRasterOp(Qt::CopyROP);
@@ -308,20 +308,20 @@
switch(nMode & 0xffff){
case DRAW_ON:
- colText = QColor("blue");
- colFrame = QColor("DarkGreen");
+ colText = QColor("cyan");
+ colFrame = QColor("yellow");
break;
case DRAW_MONO:
colText = Qt::color1;
colFrame = Qt::color1;
break;
case DRAW_OFF:
- colText = QColor("white");
- colFrame = QColor("white");
+ colText = QColor("black");
+ colFrame = QColor("black");
break;
case DRAW_DARK:
- colText = QColor("orange");
- colFrame = QColor("orange");
+ colText = QColor("blue");
+ colFrame = QColor("blue");
break;
case DRAW_TEMP:
colText = QColor("red");
@@ -459,11 +459,11 @@
switch(pObj->id()){
case SXBSchObj::ID_WIRE:
- col = QColor("darkCyan");
+ col = QColor(0, 255, 0); // green
break;
case SXBSchObj::ID_ENTRY:
- col = QColor("darkCyan");
+ col = QColor(0, 255, 0); // green
break;
case SXBSchObj::ID_DASH:
#ifdef Q_WS_MACX
@@ -471,13 +471,13 @@
#else
style = Qt::DotLine;
#endif
- col = QColor("black");
+ col = QColor("yellow");
break;
case SXBSchObj::ID_BUS:
case SXBSchObj::ID_BENTRY:
//style = Qt::DotLine;
width=3*m_viewScaleMul/m_viewScale;
- col = QColor("darkGreen");
+ col = QColor("cyan");
break;
default:
return;
@@ -487,8 +487,8 @@
switch(nMode & 0xffff){
case DRAW_ON: break;
case DRAW_MONO: col = Qt::color1; break;
- case DRAW_OFF: col = QColor("white"); break;
- case DRAW_DARK: col = QColor("orange"); break;
+ case DRAW_OFF: col = QColor("black"); break;
+ case DRAW_DARK: col = QColor("blue"); break;
case DRAW_TEMP: col = QColor("red"); break;
}
diff -U 3 qtbsch3v.org/stdafx.h qtbsch3v/stdafx.h
--- qtbsch3v.org/stdafx.h 2006-07-08 15:02:58.000000000 +0900
+++ qtbsch3v/stdafx.h 2009-02-10 23:31:18.000000000 +0900
@@ -1 +1,5 @@
//dummy header file
+#include <stdlib.h>
+#include <string.h>
+#define INT_MAX 65535
+#define INT_MIN -65535
diff -U 3 qtbsch3v.org/xbschdrawobject.cpp qtbsch3v/xbschdrawobject.cpp
--- qtbsch3v.org/xbschdrawobject.cpp 2006-07-08 15:02:59.000000000 +0900
+++ qtbsch3v/xbschdrawobject.cpp 2009-02-10 23:54:02.000000000 +0900
@@ -519,6 +519,7 @@
SRect srcClipSheet =SRect(rcClipSheet.left(),rcClipSheet.top(),rcClipSheet.width(),rcClipSheet.height());
painter.begin(&m_viewBuffer);
painter.setRenderHint(QPainter::TextAntialiasing);
+ painter.setBackgroundColor(QColor("black"));
painter.translate(-x,-y);
painter.eraseRect(clipx,clipy,clipw,cliph);
@@ -528,9 +529,9 @@
clipy -= y;
// painter.setClipRect(clipx,clipy,clipw,cliph);
SSize size=m_pDoc->SheetSize();
- g_drawFrame(&painter,size,rcClip,QColor("black"),m_viewScale,m_viewScaleMul);
+ g_drawFrame(&painter,size,rcClip,QColor("yellow"),m_viewScale,m_viewScaleMul);
if(m_bDisplayGrid){
- drawGrid(&painter,rcClipSheet,QColor("DarkGreen"));
+ drawGrid(&painter,rcClipSheet,QColor("red"));
}
drawMainXBSchObj(&painter,DRAW_ON,&srcClipSheet,m_fEditHighLight, m_viewScale,m_viewScaleMul);
diff -U 3 qtbsch3v.org/xbschfont.cpp qtbsch3v/xbschfont.cpp
--- qtbsch3v.org/xbschfont.cpp 2006-07-08 15:02:59.000000000 +0900
+++ qtbsch3v/xbschfont.cpp 2009-02-09 22:58:58.000000000 +0900
@@ -107,9 +107,9 @@
QColor col;
switch(nMode & 0xffff){
case DRAW_ON: col = color; break;
- case DRAW_DARK: col = QColor("orange"); break;
+ case DRAW_DARK: col = QColor("blue"); break;
case DRAW_MONO: col = Qt::color1; break;
- case DRAW_OFF: col = QColor("white"); break;
+ case DRAW_OFF: col = QColor("black"); break;
case DRAW_TEMP: col = QColor("red"); break;
}
diff -U 3 qtbsch3v.org/xbschpattern.cpp qtbsch3v/xbschpattern.cpp
--- qtbsch3v.org/xbschpattern.cpp 2006-07-08 15:03:00.000000000 +0900
+++ qtbsch3v/xbschpattern.cpp 2009-02-10 23:31:18.000000000 +0900
@@ -394,6 +394,10 @@
col = color;
break;
+ case DRAW_DARK:
+ col = color;
+ break;
+
}
x=x*scaleMul / scale - scaleMul / (scale*2);
diff -U 3 qtbsch3v.org/xbschview.cpp qtbsch3v/xbschview.cpp
--- qtbsch3v.org/xbschview.cpp 2006-07-08 15:03:00.000000000 +0900
+++ qtbsch3v/xbschview.cpp 2009-02-10 23:31:18.000000000 +0900
@@ -1026,6 +1026,7 @@
// pObj->setP1(ptSnap);
// drawJunction(&painter,pObj,DRAW_ON);
pObj = m_pCursorObj->duplicate();
+ pObj->setLayer(m_pDoc->editLayer());
//drawXBSchObj(ppainter,pObj,DRAW_ON,NULL);
m_pDoc->addSelect(pObj);
m_pDoc->resetSelect();
@@ -1161,6 +1162,7 @@
pComment->setFontUnderline(dlg->font().underline());
pComment->setFontStrikeOut(dlg->font().strikeOut());
pComment->setSelection(SXBSchObj::SELECT_ALL);
+ pComment->setLayer(m_pDoc->editLayer());
m_pDoc->addSelect(pComment);
//g_cfg.setString("Font","Name",pComment->fontName());
//g_cfg.setInt("Font","Size",pComment->fontSize());
@@ -1195,6 +1197,7 @@
pLabel->setP1(SPoint(point.x(),point.y()));
pLabel->setText(dlg->text().latin1());
pLabel->setSelection(SXBSchObj::SELECT_ALL);
+ pLabel->setLayer(m_pDoc->editLayer());
m_pDoc->addSelect(pLabel);
delete dlg;
return true;
@@ -1223,6 +1226,7 @@
pTag->setText(pc);
pTag->setTagType(dlg->type());
pTag->setSelection(SXBSchObj::SELECT_ALL);
+ pTag->setLayer(m_pDoc->editLayer());
m_pDoc->addSelect(pTag);
//}
delete dlg;
@@ -1252,6 +1256,7 @@
pComp->setName(pCompInfoIndex->name());
pComp->setRefnum(pCompInfoIndex->number());
pComp->setSelection(SXBSchObj::SELECT_ALL);
+ pComp->setLayer(m_pDoc->editLayer());
m_pDoc->addSelect(pComp);
delete dlg;
return true;
@@ -1369,6 +1374,7 @@
}else{
pObj1->setP1(SPoint(ptStart.x(),ptStart.y()));
pObj1->setP2(SPoint(passPoint.x(),passPoint.y()));
+ pObj1->setLayer(m_pDoc->editLayer());
// drawXBSchObj(&painter,pObj1,DRAW_ON,NULL);
m_pDoc->addSelect(pObj1);
m_pDoc->resetSelect();
@@ -1380,6 +1386,7 @@
}else{
pObj2->setP1(SPoint(passPoint.x(),passPoint.y()));
pObj2->setP2(SPoint(ptEnd.x(),ptEnd.y()));
+ pObj2->setLayer(m_pDoc->editLayer());
// drawXBSchObj(&painter,pObj2,DRAW_ON,NULL);
m_pDoc->addSelect(pObj2);
m_pDoc->resetSelect();
2009-02-15(Sun) 秋月ライタ、ヒアリング成功
絶望的な気分になった昨日だが、気合いを入れて捜索したところ、PICプログラマキットV4添付のCDROMが発見された。VBのものらしきソースをちょっと読んだら、すぐにコードを読み出すrubyスクリプトができてしまった。うひょー。
$ vi read
#!/usr/bin/ruby
words = 256
open('/dev/ttyUSB0', 'w+') {|h|
p h.putc(?r); sleep 0.001
p h.putc(?s); sleep 0.001
p h.putc(?p); sleep 0.001
p h.putc(words >> 8); sleep 0.001
p h.putc(words & 0xFF); sleep 0.001
p = 0
while(p < words * 2)
printf("%04x: ", p) if(p % 16 == 0)
printf("%02x ", h.getc)
p += 1
if(p % 16 == 0)
print "\n"
h.putc(?@)
end
end
p h.getc
}
$ ./read
114
115
112
1
0
0000: 3f ff 3f ff 3f ff 3f ff 01 02 01 02 01 02 01 02
0010: 3f ff 3f ff 3f ff 3f ff 01 02 01 02 01 02 01 02
0020: 3f ff 3f ff 3f ff 3f ff 01 02 01 02 01 02 01 02
0030: 3f ff 3f ff 3f ff 3f ff 01 02 01 02 01 02 01 02
0040: 20 3b 30 a1 00 a2 20 7f 01 00 00 02 00 02 00 02
0050: 30 a0 00 a2 20 7f 08 25 00 00 00 02 00 02 00 00
0060: 00 a2 20 7f 20 4b 30 05 00 02 00 00 00 00 01 00
0070: 28 18 15 86 28 3a 15 05 00 00 00 02 00 02 00 02
0080: 00 85 12 83 11 85 28 44 00 00 01 00 00 02 00 02
0090: 00 85 12 83 34 00 30 f3 00 02 00 00 00 02 01 00
00a0: 15 05 28 52 28 53 30 fb 00 02 00 00 00 02 00 00
00b0: 11 05 1c 20 28 64 15 05 00 00 00 02 00 02 01 00
00c0: 16 83 00 85 12 83 34 00 00 02 00 02 00 00 00 02
00d0: 11 85 28 5b 11 05 30 fb 00 02 00 00 00 02 00 00
00e0: 30 01 20 b6 15 05 28 74 00 00 01 02 00 00 00 02
00f0: 1d 85 10 a0 11 06 30 01 00 02 01 00 00 00 00 00
0100: 00 a3 14 20 1f a2 10 20 00 00 01 02 01 02 00 00
0110: 20 6a 34 00 15 86 01 a1 00 00 00 02 00 02 01 00
0120: 20 6a 18 a0 14 21 0b a3 00 02 00 00 01 00 00 00
0130: 20 58 11 86 30 05 20 b6 00 00 00 00 00 02 00 00
0140: 28 a1 28 a2 28 a3 0b a7 00 02 01 02 00 00 00 00
0150: 00 a9 0b a9 28 a9 00 08 00 02 00 00 00 00 00 00
0160: 20 a8 30 96 20 a8 0b aa 00 02 00 00 00 02 00 02
0170: 30 09 20 a8 30 c8 20 ac 01 02 00 00 00 00 01 02
0180: 3f ff 3f ff 3f ff 3f ff 01 02 01 02 01 02 01 02
0190: 3f ff 3f ff 3f ff 3f ff 01 02 01 02 01 02 01 02
01a0: 3f ff 3f ff 3f ff 3f ff 01 02 01 02 01 02 01 02
01b0: 3f ff 3f ff 3f ff 3f ff 01 02 01 02 01 02 01 02
01c0: 3f ff 3f ff 3f ff 3f ff 01 02 01 02 01 02 01 02
01d0: 3f ff 3f ff 3f ff 3f ff 01 02 01 02 01 02 01 02
01e0: 3f ff 3f ff 3f ff 3f ff 01 02 01 02 01 02 01 02
01f0: 3f ff 3f ff 3f ff 3f ff 01 02 01 02 01 02 01 02
64
2009-02-18(Wed) 簡易ながらラインモニタ成功
しこしこと、秋月のWindows用PICプログラマのソースコードを読んでは、プロトコル解析をする今日この頃である。んが、こんなこと言ってはなんなんだが、このソースコードは驚愕の汚さだ。何度、同じコードを繰り返せば気が済むんだ……度を超している。これは、PICプログラマキットV4添付の物件であることから、初期バージョンに近い状態だと思うのだが、その時点ですら、九龍城砦も顔負けの増築っぷりである。
いかにも「動いているところには絶対に触らない」という強固な意志の元、増築を繰り返したコードに見える。確かに「動いているところには絶対に触らない」というのは、この業界によくある掟かもしれないが、にしても限度があろう。まぁ、オイラのコードも、かなり一般には奇異なルールで書いているので、エラそうなことはいえないけれどもさ。
にしても、問題は、結局、このコードは古いモノであって、最新のファームに対応したモノではないということだ。大いに参考にはなるものの、これに従って挙動すれば動く、ということは保障されない。やっぱり、ラインモニタで通信内容を盗聴しないとなぁ……。
現在のラインモニタは、ライタからの通信は正常に得られるが、ライタへの通信がところどころ化け、内容がイマイチ安定しないという状態である。なんだか、電圧が逆に見えるのだが、不思議なことにPICの読み書きは正常にできてしまうのだよなぁ……
気を取り直して結線を修正。ついでに、モニタ用LEDも実装した。信号がない時は、赤いLEDが点灯。通信が発生すると、白LEDがチカチカする。ふみふみ、正常にモニタできるようになったぞ。PICライタは半二重通信なので、RXとTXの両方を一度にモニタできるし、ジャンパを外せば、片方ずつモニタすることもできる。取得できる内容も完全に安定している。
しかし、問題は、RXとTXの両方を一度にモニタする都合上、送受信の内容が混じってしまい、それを区別できないこと。幸い、ワンショットのみの結果から解析する必要はないので、同じ通信を3回繰り返し、RXのみ、TXのみを別に採取して、合計3つのファイルから、送信と受信の内容を分離しようと、スクリプト「shotoku.rb」を開発しようと……したが、実はコレが結構に難しい。
結局、通信内容をテキストに落としてdiffを取って分離することにした。実はdiffは上述の命題を限りなく解決するファジィなインテリジェンスを備えた、なかなかに高度なツールなんだよね。つまりは、送受信の混じった内容と、送信だけの内容、2回にわけてモニタして、前処理(seeable.rb)して、diffに食わせて、後処理(gather.rb)して、以下のような感じの結果が得ようって寸法である。
# 前処理のスクリプト
$ cat seeable.rb
#!/usr/bin/ruby
$stdin.each_byte {|c|
printf("%02x [%s]\n", c, (c < 0x20 ? '^' + (c + 64).chr : (c < 0x7f ? c.chr : '')))
}
# 後処理のスクリプト
$ cat gather.rb
#!/usr/bin/ruby
mode = ' Start'; d = ''; c = '<Start>'
$stdin.each {|l|
if(l =~ /^(.) ([0-9a-f]{2} )\[(.*)\]/i)
if(mode != $1)
printf "%s %-48s [%s]\n", mode[0,1], d, c
mode = $1; d = ''; c = ''
end
d += $2; c += $3.size == 1 ? $3 : '.'
mode += 'LF' if(c.size > 15)
end
}
# 送受信の混じった内容、今回は「PIC16F819への書き込み」をモニタし、前処理する
$ cat /dev/ttyUSB0 | ./seeable.rb > 819progRT
# 送信だけの内容をモニタし、前処理する
$ cat /dev/ttyUSB0 | ./seeable.rb > 819progT
# diffに食わせたものを、後処理する
$ diff -C 1000 819progRT 819progT | ./gather.rb
[<Start>]
2a 2a 2a 3f [***?]
- 41 45 2d 50 47 4d 38 37 37 20 20 56 36 2e 37 31 [AE-PGM877 V6.71]
- 0d 40 [.@]
6d 44 0a [mD.]
- 0a [.]
4e 72 73 63 00 08 [Nrsc..]
- 3f ff 3f ff 3f ff 3f ff 3f ff 3f ff 04 e4 3f 10 [?.?.?.?.?.?...?.]
- 40 [@]
40 2a 2a 2a 3f [@***?]
- 41 45 2d 50 47 4d 38 37 37 20 20 56 36 2e 37 31 [AE-PGM877 V6.71]
- 0d 40 [.@]
6d 44 0a [mD.]
- 0a [.]
4e 62 64 0a [Nbd.]
- 40 [@]
4e 77 48 65 08 00 [NwHe..]
- 00 [.]
28 21 [(!]
- 01 [.]
3f ff [?.]
- 02 [.]
3f ff [?.]
- 03 [.]
3f ff [?.]
- 04 [.]
:
: ※以下、略。行頭が'-'が付いているのが、受信内容。何も付いてないのが、送信内容。