2016年10月31日月曜日

VisualStudioでSTM32のコードをいじりたい

STM32のコードをVisual Studioでいじりたい。Visual Studioは普段C#を書くのに使っていて慣れてるし、コード補完とかもあるので組み込みもVisual Studioで書けると便利。

結論から言うと、今のところ完全に実用な状態にはなっていない。


とりあえず最低限必用なのはいくつかのマクロとかを定義してやる必要がある。
__STATIC_INLINE, __IO, __Iが必要になる。__Oは使われていないがとりあえず定義しておいた。
それとuint8_tとかはstdint.hで読み込む必要がある。ただし32bitについてはVisual Studioに付属しているstdint.hには定義されていないので自前で定義する必要がある。ただこのあたりが非常に面倒で、エラーチェックではuint32_tが定義されていないが、includeで読み込まれるstdint.hにはuint32_tが定義されている。ということで多重定義とか面倒なので、#defineで定義しておくことにする。
そして__STATIC_INLINEだが、これはstatic inlineと定義されているが、Visual Studio的にこの修飾子は嫌がられるらしい。Visual Studioではビルドはせず、単純に構文が正しいかのみをチェックするので、とりあえず空のdefine定義を追加するのみとしている。


あとはメイクファイルプロジェクトでインクルードパスを設定してやればエラー類は出ず、コード補完もちゃんと使うことができるし、構造体のメンバの型をマウスオーバーで表示することもできる。
ということで一応Visual Studioで書いたりはできるようになったわけだが、Visual Studioでビルドすることはできていない。またmakefileで定義しているマクロも読み込んでいないから、例えばMPUを指定していないというエラーが出たりしている。


Win10のAniv UpdateでBoUoW10が追加され、Bashでmakeコマンドとかが一通り揃ったことから、Win10でARMの開発環境を構築するのはかなり簡単になった(apt-getでgcc-arm-none-eabiをインストールするだけで終わり)。Visual Studio CodeではBashを使えるようになったらしいし、こっちを使えばいいのかも。

あとAniv Updateつながりでもう1つメモ。Bash on Ubuntu on Windows 10ではdfu-utilは使用できない。インストール自体は問題なくできるが、libusbが使えないため。ということでJTAGデバッガを使うか、Windowsのdfuwを使用することになる。なぜかウチのWin10のコマンドプロンプトはほとんどのexeを起動できないため、dfuwのGUIラッパーを作ったりしているわけだが、それはさておき。

やりたいことはあれやこれやと色々有るのだが、なかなかそっちまで手が回らない。

2016年10月25日火曜日

C#のGraphicsで透過色を描き込む

何回も忘れて必要になるたびにググってるのでメモ。

C#のGraphicsは完全に透明な色で何かを書くと、何も書かれない、という挙動になっている。ペイントソフトで切り抜いてPNGの透過みたいなことができない。

それをやりたいときはCompositingModeを変更する。デフォルトではSourceOverだが、SourceCopyに設定すれば透過を描き込むことができる。

Graphics.CompositingMode プロパティ (System.Drawing)


あとあんまり関係ないけど、Clipboard.SetImage/GetImageでは透過はやり取りできないみたい。少なくともC#から透過率100%の画像をクリップボードに入れると、その部分はライトグレー(#D3D3D3)に置換されている。透過率50%の白だとライトグレーよりも白に近い色になる。

今簡単なペイントソフトっぽいのを作ってるんだけど、他の(ちゃんとした)ペイントソフトに画像を渡そうとすると一旦ファイルに保存する必要があるっぽい。少なくともPaint.Netに対してClipboard.SetImageで透過を含んだままで画像を渡すことはできない。
それとControlのPaintイベントでe.Graphicsに対して透過率100%を指定すると完全な黒になる。
ControlのPaintで処理すれば色々楽ができるかなと思ったけどそう簡単ではないらしい。

遊びで小さなプログラム作ってるばっかりでちゃんとしたプログラムは作ったことがないので、ちょっとしたことでも一々引っかかって作りたいものがなかなか作れない。

C#のXmlSerializer

XmlSerializerを使うにはSystem.Xml.Serializationの名前空間が必用。あとファイルに保存したりするのでSystem.IOも必用。
XmlSerializerは完全にpublicなclassしか使えない点に注意。例えばprivateクラスの中にあるpublicクラス等も使用できない。
前回書いたとおりFontとかColorもSerializeできない。FontConverterとかColorConverterとかを使う必要がある。その際はConvertToStringとかConvertFromStringを使う。

その他Serialize周りでは色々例外が投げられたりする場合もあるので適切に処理するように。

C#の色の名前を得る

C#のXmlSerializerで色を扱いたかったんだけどうまく扱えなかったので自分でARGBを持つクラスを作った。ついでなのでColor.Nameで得られる名前も得てみたくなった。

ということでMSDNから色の値と名前をコピペしてswitchで返すようなプロパティを作ってみた。一部重複したモノがあって、それはスイッチできないので世間一般で使われているはずの方を残してそれ以外はコメントアウトした。また名前が存在しない場合はColorのName準拠、つまりConvert.ToStringで16進に変換した文字列を返す。

C#のXmlSerializer、クラスにSave/Loadメソッドを作っておけば大抵はそのままクラスのデータを簡単に保存・読み込みできるから楽なんだけど、ColorとかFontとかよく使うモノがシリアライズできなくて不便。

今回は自前でクラスを作ったけど、本来はFontConverterとかColorConverterを使ったほうが良いかも。というかせっかく標準で用意されてるので積極的に使うべき。
c# - convert font to string and back again - Stack Overflow

2016年10月17日月曜日

防衛省規格 用語

防衛省規格 用語 site:http://www.mod.go.jp/atla/nds/Y/ - Google 検索

PDF資料で様々なジャンルの用語がある。主に小火器かな。日本語、意味、参考英訳があるので用語の意味を調べたいときとか、それを指す英語を調べたいときに便利。もっとも役所の面倒な言い回しを多用した辞書という感じなので、それを詳しく調べるには向かないけど。
総火演の映像とか見ながら何を行ってるのか調べつつ、というのに良いかも。

黒点的25m



JGSDFの訓練で使われている?的っぽいやつ。予備自衛官補の訓練とかで使われてるみたいです。本物の背景はダンボールっぽい色になります。コンビニ印刷とかだと色に関係なく一律1枚いくらなので、そういうところで印刷する場合は背景を適当な色で塗りつぶして下さい。本物はもうちょっと肩が人間っぽい形をしてます。射距離は25mで、4点の円が直径10MOAくらいになるみたいです。1クリック1MOAのサイトなら、グルーピングが肩にあれば逆方向に5クリック分、とかそういう感じです。
大きさはなんとなくなので、全然違ってたらごめんなさい。

肩幅11cmくらいで25m先なので、4分の1くらいの大きさになります。100m先の人間と同じくらいの大きさです。アサルトライフルなら100mくらいが平均的な距離なのかな。結構離れてるような気もしますが、Google Earthとかで歩きなれた場所を測ってみるとかなり短い距離です。叫べば聞こえる距離ですし、走ればあっという間です。

2016年10月16日日曜日

FRESULT

FatFsのFRESULTを文字列に変換する関数。
文字列はff.hの構造体のコメントをそのまま使用。現在の最新版である0.12bを使用しているが、リビジョンが変わった場合はエラーになる。

この間まで動いてたはずなのに別のところ色々いじってたら動かなくなって絶賛デバッグ中。