SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2009-02-01(Sun) XPort起動

  とりあえず

  画像の説明


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

  だめじゃん。qtの開発環境が必要なようだ。抜く手も見せずに導入して、再度コンパイルを試みる。

/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

  なんじゃー。atoiなんて知らんって? ヘッダのインクルード忘れか? 「man atoi」して「#include <stdlib.h>」が必要であることを確認する。

  最初、個々の.cppファイルに、各々、記述を加えまくってなんとか対処したが、代表であるstdafx.hに書けば、それで一発っぽい。

/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

  ぐむむ。INT_MAXとINT_MINが定義されてないとな? だまって足す。

/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

  こんどはなんだ? 「man strcmp」で「#include <string.h>」ッ!!

/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

  「Set→Library→Add」で「/usr/share/qtbsch3v/LIBV」にコピーした、部品ライブラリを登録し、ちょっとウカレてみる。

  画像の説明

  次に、既存の図面をできるだけ生かしたいので、古い.CE2形式から.ce3形式へ変換するファイルコンバータ「ce2to3」をコンパイル。

/home/mitsu/develop/bsch # tar xvfz c2t3c003.tgz
/home/mitsu/develop/bsch # cd c2t3c003
/home/mitsu/develop/bsch/c2t3c003 # cat ce2to3.txt | toutf8

  今度は、Makefileがないようだ。こんなやり方でええんかいな?

/home/mitsu/develop/bsch/c2t3c003 # cd ce2to3
/home/mitsu/develop/bsch/c2t3c003/ce2to3 # g++ *.cpp

  詳しくは略すが、また、atoi、INT_MAXとINT_MINで怒られまくった。

/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: 警告: ここが以前の宣言がある位置です

  今度は「extra qualification」なんていわれる。どうも、修飾がクドい人はイヤンということらしい。

/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ポート版を作りたいと思っているのだが。

  とりあえず、Bschは使えそうなトコロまで持ってこれたので、次はPICのクロス開発環境を整える。そういえば、最近Fedoraに、PICほか、組み込みマイコン用の開発環境が含まれたと聞いたが……。

/home/mitsu/develop/bsch # yum search gpasm
/home/mitsu/develop/bsch # yum install ktechlab

  あった。やたらデカい。統合環境のようだ。CUIで使いたいだけなら「gputils」を入れるだけでよかったみたい。

  以前のコードをアセンブルしてみる。

/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

  ムムッ。sdccはやたら当たるから、頭に「sdcc-」を付けたって? んじゃ、それで、困憊る。じゃなかった、コンパイる。

/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

  確かに空っぽである。少なくともFedora8からFedora10まで1年間、空っぽで放置らしい。

  どーせ、パッケージングミスだろう、と当たりを付け、ソースを取り寄せる。

/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"

  できたっぽい。うひょひょー。

  まったく花は咲かせてないが、快調にツボミが付くので、ノリノリでもう一歩。今度はROMライタ。使えるものなら、秋月のヤツを使いたい。

/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

  昨日に引き続き、環境を整備する。まずは、回路図エディタQt-BSch3Vの部品エディタである、Qt-LCoVをコンパイル。

/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

  でけた。コッ、コイツ……動くぞッ!!

  縁起物なので、ちゃんとGnomeのメニューから起動できるようにしよう。

/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

  アイコンは、添付のものを加工して使う。ここは、サクッとCUIで。アイコンキャッシュの更新を忘れずに。

/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 -

  後回しになったが、主たるQt-BSch3Vも登録。

/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 .

  まぁ、コマンドラインから起動した方が便利かもしれんが、気分ってコトで。

  画像の説明

  なにげに、導入する気もなく導入した、KTechlabを試してみて驚いた。何の説明もなくパッと使える。電圧や電流の計算なんか、これで一発じゃん。超最強ビジュアル電卓。しかも、そんなのはオマケで、主の機能はPICのシミュレーション。強力すぎだ。

  画像の説明

  それはそうと、部品箱を漁って、ふたつのパーツを取り出した。うひひ。

  画像の説明

  コレは明日のお楽しみ。では。


2009-02-07(Sat) Fedora9、電子工作チューン外伝

  今日は、昨日に用意したパーツを利用して、RS232Cの簡易ラインモニタ装置を作るのである。

  余談ではあるが、先日、ガッツリとした棚を購入して、部品の取り出し効率を極端にアップすることに成功した。しかしながら、どうしても必要な部品の選定にはそれなりに時間がかかってしまう。そこで、ハンダ付けは「常に『遊んでぇ!!』とプレッシャをかけてくるイッペイ(3)」が寝ている時に進めるとして、彼が起きている間は、LEDをピコピコさせたりして気を引きつつ、一緒になって部品の選定をし、作業時間を稼ぐのであった。

  イッペイ(3)が寝た後、小一時間でLEDの取り付け以外は完了。今回のコンセプトはカスタマイズ。ピンヘッダの設定により、RXまたはTX、あるいは両方を選択的にモニタできるほか、左右のケーブルをピンヘッダ経由とすることで、容易にクロスケーブルバージョンに変更可能である。

  画像の説明 画像の説明

  しかし、当初「ラインモニタ」でググったら、高そうな機器がゾロゾロ出てきて思わずアワてたぞい。えぇ!? 単にRXかTXをフツーのPCのシリアルポートにぶっ込むだけじゃダメなのッ!? 安易に考えすぎてたか……と思ったが、別に安易に考えすぎてて正しかった。この機器によって、予定通り、RXかTXをフツーのPCのシリアルポートにぶっ込み、特別なAPなしに、フツーの端末APでモニタできたし。

  モニタの目的は、秋月のPICライタAPのリバースエンジニアリング。実際、Linux用にPICライタ(ハードウェア)を作るのと、どっちが手間かはわからんが、高価なゼロプレッシャーソケットと、パッと開いてスグ始められる自作のEX-USB-CPシステムを有効活用しない手はない。とりあえず、Linux用のライタAPの作成に向け、少しバンガってみるのである。

  久々にWindowsPCを立ち上げる。見ないうちに、また秋月のPICライタAPのバージョンが上がっている。せっかくだからライタのファームを最新に上げてからモニタすることにしよう。

  画像の説明

  と、ちょっとモニタしたところで、昨日コンパイルしたQt-BSch3Vの使い勝手がオイラ的にはかなりイマイチだということに気づいた。

  XPortでちょっとした工作をしたいだけなのだが、次々に周辺環境の構築に手を出しているオイラである。そのうち工房付きの家まで建てかねないな。では。


2009-02-10(Tue) Fedora9、電子工作チューン外伝EX

   昨日、Qt-BSch3Vの使い勝手がイマイチだ、などとオープンソース物件に対して文句を付けてしまったが、文句を付けたからには、自分で改修してしまうのである。文句を付けるからにはそれくらいはする。それが、オープンソース物件を使う際の「掟」である。最近は、使わせてもらっておいて、貢献する気もなく、文句ばかり言うという「失礼な輩」が増えているが、それはエチケットに反する。Oh!X の頃からの「言い出しっぺの法則」というのは、現在も有効なのである。文句があるなら、おまえがやれ、なのである。

  つーわけで、Qt-Bsch3Vを改修するのである。改修項目は以下。

  • アクティブレイヤの切り替えがサクサクできるように、ショートカットを追加
  • お目々が痛くならないように、色を元祖BSchコンパチに
  • オブジェクトが、常にトップレイヤに配置されてしまうなど、いくつかのバグ修正

  画像の説明

  そんなこんなで書いたのが、上の図面。いやぁ、以前より、サクサクですわ。BSch3Vから、レイヤ設定ウィンドウが「ダイアログ」になってしまい、イチイチ閉じないと図面がイジれなくなってしまったのがイヤで、古いBSchを使い続けていたが、ショートカットキーの追加によって、それ以上の操作性になった。キャッホゥ。

  と、それはそうと、このQt-BSch3Vは、本家のページにてメンテナンス終了宣言が出されつつあるようだ。少し残念。しかし、別にソースが提供出されていれば、遠慮なく終了宣言もできるってもんである(例え、無料とはいえ)。私は、今回の改造を行ったことで、BSchのコードは、ほぼ好きにイジれる、つまり「オレのモノ」になってしまっており、オマケにQtの基本まで身についた。正直、メンテナンス終了も、全然、痛くはない。

  最近、オープンソースの利点のひとつに「気に入った環境が死ぬまで自由に使い倒せる」というのがあるんじゃないかと思い始めた。メンテが止まったって、OSが変わったって、少しの手間で、自分でどうにかできる。作者さんには超感謝である。

  つーわけで、次は、秋月のPICライタを「オレのモノ」にすべく、動き出すのである。では。

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-14(Sat) 何しゃべっとんねん!!

  先日作った簡易ラインモニタだが、送信側がうまくモニタできてない。……ような気がする。Windowsの時と同じようにLinuxから送信しても、PICプログラマが反応を示さない。う〜む。

  PICライタとのプロトコルを公開してくんないかなぁ。PICプログラマキットV4添付のCDROMには参考にソースコードが入っていたらしいが、見つからん。手詰まりじゃ。


2009-02-15(Sun) 秋月ライタ、ヒアリング成功

  絶望的な気分になった昨日だが、気合いを入れて捜索したところ、PICプログラマキットV4添付のCDROMが発見された。VBのものらしきソースをちょっと読んだら、すぐにコードを読み出すrubyスクリプトができてしまった。うひょー。

  ただ、オイラの主力は、12F629, 16F648A, 16f819であり、現状のソースでは未対応である(ファームも)。試行錯誤が必要かもしれん。やっぱり、ラインモニタが動いてくれんとキツいなぁ。

  とはいえ、まだ、マトモに書き込めてはいないものの、ここまでくれば時間の問題だろう。ぼちぼち進めるつもりである。

$ 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の読み書きは正常にできてしまうのだよなぁ……

  画像の説明

  ……って、おいッ!! GNDとTXが逆じゃねーかッ!!

  そりゃ、ご丁寧に両端でHigh/Lowが逆なら、そういう挙動にもなるよな。アホか、オレは。

  気を取り直して結線を修正。ついでに、モニタ用LEDも実装した。信号がない時は、赤いLEDが点灯。通信が発生すると、白LEDがチカチカする。ふみふみ、正常にモニタできるようになったぞ。PICライタは半二重通信なので、RXとTXの両方を一度にモニタできるし、ジャンパを外せば、片方ずつモニタすることもできる。取得できる内容も完全に安定している。

  画像の説明

  しかし、問題は、RXとTXの両方を一度にモニタする都合上、送受信の内容が混じってしまい、それを区別できないこと。幸い、ワンショットのみの結果から解析する必要はないので、同じ通信を3回繰り返し、RXのみ、TXのみを別に採取して、合計3つのファイルから、送信と受信の内容を分離しようと、スクリプト「shotoku.rb」を開発しようと……したが、実はコレが結構に難しい。

  というのも、極端な話、相互に「0」ばかり話し合い続ければ、当然ながら分離は不可能。実際にはあり得ないが、ミクロな単位ではそれに近い状態がいくらでも起こりうるのだ。じゃどうするか。

  結局、通信内容をテキストに落として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                                               [.]
  :
  : ※以下、略。行頭が'-'が付いているのが、受信内容。何も付いてないのが、送信内容。

  つーわけで、簡易なラインモニタなら、わずかな部品を組み合わせるだけで作れるし、それで十分に実用的な範囲で送受信内容を推測可能なわけだ。どうしても、完全に送受信内容を分離したいなら、RXとTXを別々のシリアルポートでモニタする手も考えられる。なにも、2台のPCを用意する必要はなく、USBシリアル変換ケーブルが2本あればいい。この場合、全二重通信をモニタすることもできる。

  とりあえず、上記の内容を参考にしつつ、一応はPICへの書き込みに成功した。しばらくしたら、体裁を整えて公開する予定である。では。

  画像の説明

  それはそうと、やっと届いたよ。


2009-02-23(Mon) 秋月のPICライタをLinux(ほか)で使う

  ロクに動作確認してないが、とりあえず、できたので置いておく。V4の最新ファーム(Ver6.71)対応である。

  クドいようだが、動作確認は「してない」ので、使う人はそのつもりで。

  <追記>上記のは書き込みこそできたものの、とある理由で使いものにならない。(たぶん)動くヤツはこっち

  <追記>rakipicの最新版は、左の検索窓で「rakipic」と検索し、最新の記事に置いてある。(たぶん)