「すべての芸術の中で、映画とサーカスは私たちにとって最も重要です」
-V.I. レーニン
ビデオを見るのは、現代世界で人気のあるエンターテイメントの1つであり、映画は冷蔵庫を含むほぼすべてのデバイスで視聴されるようになりました。 残念ながら、近くに適切な冷蔵庫がなかったため、バーコードスキャナーで映画を見ることにしました。 Cipher Lab 8001スキャナーが手元に
- 16ビットCMOSプロセッサ
- プログラム用に1 MBのメモリ
- データ用1 MB SRAM
- 100×64の解像度のLEDバックライトを備えたFSTNディスプレイ
ビデオを保存するには1 MBのメモリで十分でしたが、これによりプレーヤーのインタラクティブ性が失われ、開発プロセスが複雑になります。 したがって、赤外線ポートから直接来るデータを画面に表示します。 また、簡単にするために、画面の極端な4列は使用していません。 画像の最終的な解像度は96×64です(1行のドット数はバイトのサイズの倍数です)。
スキャナーファームウェア
ファームウェアには複雑なものはありません。
- 赤外線ポートからデータを読み取ります。
- 画面に表示します。
- 次のフレームの要求をコンピューターに送信します。
注意する必要があるのは、着信バッファのサイズが256バイトに制限されていることだけです。 また、フレーム全体のサイズは96×64/8 = 768バイトなので、フレームを16行の4ブロックに分割する必要があります。 はい、データは256バイトの3つのブロックに収まりますが、入力バッファの最初のバイトとしてブロック番号を送信したかったのです。
int PlaceFromCom ( void ) {
long timer ;
int position ;
char c , picture [ BLOCK_SIZE ] ;
unsigned char blockId , loaded ;
SendRequest () ;
timer = sys_msec ;
loaded = 0 ;
position = 0 ;
while ( sys_msec < = timer + TIMEOUT_MSEC ) {
if ( read_com ( COM_PORT_NUM , & c ) ) {
picture [ position ] = c ;
position + + ;
if ( position = = BLOCK_SIZE ) {
loaded = 1 ;
break ;
}
}
}
if ( ! loaded ) {
printf ( "Comm error\r\n" ) ;
return 1 ;
}
blockId = ( picture [ 0 ] % 4 ) ;
show_image ( 0 , blockId * BLOCK_H , IMAGE_WIDTH , BLOCK_H , & ( picture [ 1 ] ) ) ;
return 0 ;
}
出力プログラム
COMでビデオを出力するプログラムは、ファームウェアよりも簡単に見えます。
- 画面のスクリーンショットを撮ります。
- サイズを変更して、2色の画像に変換します。
- ブロックに分割し、バイトストリームに変換します。
- スキャナーからの要求を待って、バッファーを返します。
何らかの理由で、Pythonでスクリーンショットを撮るのに時間がかかるため、プログラムではこのアクションは別のストリームで取り出されます。 残りのコードは簡単です。 たとえば、出力ループ:
while True :
data = ser . read ( 9999 )
if len ( data ) > 0 :
if data [ 0 ] = = "V" :
ser . write ( chr ( currentBlock ) )
ser . write ( desktop . strings [ currentBlock ] )
currentBlock = ( currentBlock + 1 ) % blockCount
作業結果
プログラムのソースはこちらからダウンロードできます 。