#
# 2020/06/16 12:12
#
# Copyright(c) 2020 Soho Enterprise Ltd. (https://soho-enterprise.com/)
#
#==============================================================================
# ・本プログラムは,
#   https://github.com/6by9/raspiraw
#   を参考に作成されたものです.
# ・camera_i2c は,      https://github.com/6by9/raspiraw/blob/master/camera_i2c
#   rpi3_gpiovirbuf は, https://github.com/6by9/rpi3-gpiovirtbuf
#   を流用しています.
#==============================================================================


==========================
インストールおよび実行方法
==========================
  -----------------------------------------------------------------------------
0) Raspberry Pi に 2019-09-26版イメージを導入します.
  -----------------------------------------------------------------------------
   設定->Raspberry Piの設定->インターフェイス で,
   カメラ -> 有効
   I2C    -> 有効
   にします.

  -----------------------------------------------------------------------------
1) 必要なソフトウェアをインストールします.
  -----------------------------------------------------------------------------
   $ sudo apt update
   $ sudo apt -y upgrade
   $ sudo apt-get install -y libjasper-dev libjpeg8-dev liblcms2-dev
   $ sudo apt-get install -y wiringpi
   $ sudo apt-get install -y i2c-tools
   $ sudo apt-get install -y libopencv-dev
   $ sudo apt-get install -y python-opencv  (← python版を使用する場合)
   $ sudo apt-get install -y ffmpeg         (← rawcapを使用する場合)
   $ wget https://raw.githubusercontent.com/6by9/raspiraw/master/camera_i2c
   $ chmod +x camera_i2c
   $ mkdir tmp000
   $ cd tmp000
   $ wget https://github.com/6by9/rpi3-gpiovirtbuf/archive/master.zip -O rpi3-gpiovirtbuf.zip
   $ unzip rpi3-gpiovirtbuf.zip
   $ cd rpi3-gpiovirtbuf-master
   $ make
   $ cp rpi3-gpiovirtbuf ../../    (camera_i2c と同じディレクトにコピーする)

  -----------------------------------------------------------------------------
2) 環境を設定します.
  -----------------------------------------------------------------------------
   /boot/config.txt の最下行に
   dtparam=i2c_vc=on
   を追加します.

   /etc/modules-load.d/modules.conf に
   i2c-dev
   があることを確認し,なければ追加します.

  -----------------------------------------------------------------------------
3) sampleプログラムを実行します.
  -----------------------------------------------------------------------------
  C 言語,Python 共通
   $ ./camera_i2c    (rpi3-gpiovirtbufが同じディレクトリにあること)
    +----
    |setting GPIO for board revsion: a02082
    |Raspberry Pi3/Pi3+
    |Set state of 133 to 1
    |     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    |00:          -- -- -- -- -- -- -- -- -- -- -- -- --
    |10: 10 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    |20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    |30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    |40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    |50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    |60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    |70: -- -- -- -- -- -- -- --
    +----
   と表示されること(アドレス0x10が10であること)を確認します.

  C 言語版
   $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
   $ g++ -o viewer_sample -L./ -limx219cpp `pkg-config --libs opencv` viewer_sample.c
   $ ./viewer_sample {モード}
     [ESC]または[q]で終了します.

   $ sudo cp libimx219cpp.so /usr/lib
     を実行しておくと,再起動毎に export... をする必要はありません.
   
  Python 版
   $ python -B viewer_sample.py {モード}
   [ESC]または[q]で終了します.

  C 言語,Python 共通
   $ ./viewer_sample
   もしくは
   $ python -B viewer_sample.py
   で,使用できるモードとその設定値を表示します.

  -----------------------------------------------------------------------------
4) highspeed キャプチャを実行します.
  -----------------------------------------------------------------------------
   RAWからMP4に生成する途中で,一時ファイルをSDカード上に書き出します.
   SDカードに十分な余裕があることを確認して下さい.
   $ make all
   $ ./mkramdisk.sh  (RAMディスクを生成します)
   $ ./camera_i2c    (rpi3-gpiovirtbufが同じディレクトリにあること)

   $ ./rawcap {モード}
   $ ./raw2mp4
    out.mp4 が作成されます.
    ファイルマネージャから out.mp4 を選択して再生して下さい.

==========================
ファイルの説明　
==========================
  a) ReadMe.txt
       本ファイル
  b) imx219Document.txt
       libimx219cpp.so, libimx219python.so 内の関数説明書
  c) libimx219cpp.so, libimx219python.so
       IMX219制御関数ライブラリ
       libimx219cpp.so    は C言語  用
       libimx219python.so は Python 用
  d) imx219.py
       python用libimx219python.so ラッパー
  e) mkramdisk.sh
       RAMディスク生成スクリプト
  f) Makefile
       viewer_sample.c, rawcap.c, raw2mp4.c 用Makefile
       make all で,全て生成
  g) viewer_sample.c
       C言語用 画像の表示を行うサンプルプログラム
  h) viewer_sample.py
       Python用 画像の表示を行うサンプルプログラム
  i) rawcap.c util.c
       高速キャプチャ用サンプルプログラム
       実行前に mkramdisk.sh を実行しておく必要があります.
       キャプチャしたフレーム画像(RAW)をRAMディスクに書き込みます.
       書き込むフレーム数は,RAMディスクのサイズによって自動的に計算されます.
  j)  raw2mp4.c
       RAMディスクに格納されたRAWデータを
       １フレームづつJPEGに変換し,カレントディスクに格納します.
       全フレームの変換が終わったら,FFMPEGを使用して,out.mp4 ファイルに変換します.
       out.mp4 ファイルは,ファイルマネージャーから,ダブルクリックすれば再生可能です.

以上
