ユースケース変更後に試験を行いましたが,レビュー後に再び変更する可能性があります

bundle_photo_data_downlink.cpp

Committer:
yousei
Date:
2017-09-03
Revision:
0:393297a738c5

File content as of revision 0:393297a738c5:

#include "mbed.h"
#include "type_define.h"
#include "bundle_photo_data_downlink.h"
#include "fm_dd.h"
#include "missionDR.h"

#pragma diag_suppress 870

Timer BPDDtimer;

Fm transmitter;
MissionDR dr;

BPDD::BPDD()//コンストラクタ
{
    flag_BPDD=0;
    permit[0]=0;
    permit[1]=0;
    permit[2]=0;
    permit[3]=0;
    camera_id=0;
    downlink_num=1;//最低1回は送信するので
    downlink_cnt=0;
    com_style=0;
    save_data_id=1;
    readout_block_num=0;
    send_cnt=0;
    num_repeat=0;
    total_cnt=0;
    size=1;//デバッグ
    block_num=0;

}

void BPDD::photo_info_sending(void)
{
    uint8_t photo_info[512]= {0};
    uint8_t first_telemetry[128]= {0};

    bpdd_debug_printf("photo info readout process\r\n");
    bpdd_debug_printf("save_data_id(in photo info sending func):%d\r\n",save_data_id);
    block_num = 1 + save_data_id*321;
    bpdd_debug_printf("block num for photo info:%d\r\n",block_num);
    //dr.read(photo_info,block_num,1);
    bpdd_debug_printf("photo info reading...\r\n");

    size = photo_info[4+camera_id];//DRマップ参照のこと
    size=2;//SDに0しか書かれていなくて困るので、今だけ

    //bpdd_debug_printf("画像サイズ(ブロック):%d\r\n",size);

    first_telemetry[0] = 3;//テレメトリID
    first_telemetry[1] = camera_id+1;//カメラ番号(1~4)
    first_telemetry[2] = save_data_id+1;//画像保存データID(1~10)
    for(int i=3; i<34; i++) {
        first_telemetry[i]=photo_info[i-3];//RTC時刻(4byte)画像容量(4byte),姿勢データ(24byte)を保存
    }
    bpdd_debug_printf("first telemetly has formed\r\n");

    /*printf("first telemetry of photo data\r\n");
    for(int i=0;i<128;i++){
     printf("%d,",first_telemetry[i]);
     }*/

    transmitter.baud(com_style);
    //transmitter.send(first_telemetry,128);
    printf("first telemetly sended\r\n");
    block_num=block_num+1+80*camera_id;//画像データ保存先へ移動
    printf("block_num:%d\r\n",block_num);
    num_repeat++;
    //printf("photo info processing time:%d\r\n",BPDDtimer.read_ms());
}

void BPDD::photo_data_AFSK_sending(void)
{
    bpdd_debug_printf("send_cnt:%d\r\n",send_cnt);
    uint8_t photo_data_AFSK[512]= {0};
    uint8_t photo_packet_afsk[128]= {0};
    printf("block_num : %d\r\n",block_num);
    if(send_cnt<=4) {
        if(send_cnt==0) {
            //dr.read(photo_data_AFSK,block_num,1);
            bpdd_debug_printf("photo data reading...\r\n");
        }
        /*printf("photo data\r\n");
        for(int i=0;i<512;i++){
            printf("%d,",photo_data[i]);
        }*/
        for(int i=0; i<128; i++) {
            photo_packet_afsk[i]=photo_data_AFSK[i+128*send_cnt];
        }
        //transmitter.baud(com_style);
        //transmitter.send(photo_packet_afsk,128);
        bpdd_debug_printf("photo data sending...\r\n");
        send_cnt++;
        //printf("%dブロック目、%dパケット目送信完了\r\n",block_num,send_cnt);
        num_repeat++;
        //printf("AFSK photo data send processing time:%d\r\n",BPDDtimer.read_ms());
        if(send_cnt>=4) {
            printf("%dblock sended\r\n",block_num);
            send_cnt=0;
            readout_block_num++;
            block_num++;
            //printf("block number send processing time:%d\r\n",BPDDtimer.read_ms());

            //bpdd_debug_printf("readout_block_num:%d\r\n",readout_block_num);
            //printf("num_repeat:%d\r\n",num_repeat);
        }
    }
}

void BPDD::photo_data_GFSK_sending(void)
{
    bpdd_debug_printf("GMSK or rapid communication process\r\n");

    uint8_t photo_data_GFSK[512]= {0};
    uint8_t photo_packet1[256]= {0};
    uint8_t photo_packet2[256]= {0};
    ///dr.read(photo_data_GFSK,block_num,1);
    for(int i = 0; i<256; i++) {
        photo_packet1[i] = photo_data_GFSK[i];
        photo_packet2[i] = photo_data_GFSK[i+256];
    }
    transmitter.baud(com_style);
    transmitter.send(photo_packet1,256);
    transmitter.send(photo_packet2,256);

    printf("%d sending complete\r\n",block_num);
    num_repeat++;
    readout_block_num++;
    block_num++;
    //printf("GFSK photo data send processing time:%d\r\n",BPDDtimer.read_ms());
}


bool BPDD::bundle_photo_data_downlink(u8* uart_data)
{
    BPDDtimer.reset();
    BPDDtimer.start();

    //printf("%dループ目\r\n",num_repeat+1);

    if(total_cnt==0) {
        uint8_t p=0;
        for(int i=0; i<4; i++) {
            p=uart_data[6]<<(7-i);
            permit[i]=p>>7;
        }

        save_data_id = uart_data[3];
        com_style = uart_data[4]<<5;
        com_style = com_style>>5;
        downlink_num = uart_data[4]>>6;

        printf("%d,%d,%d,%d\r\n",permit[0],permit[1],permit[2],permit[3]);//test
        printf("save_data_ID:%d\r\n",save_data_id);//test
        printf("com_style%d\r\n",com_style);//test
        printf("downlink_num:%d\r\n",downlink_num);//test
    }

    total_cnt++;

    for(int i=0; i<4; i++) {
        if(permit[3-i]==1) {
            camera_id=3-i;
        }
    }
    bpdd_debug_printf("camera_id is %d\r\n",camera_id);
    //printf("カメラID:%d\r\n",camera_id);//test
    bpdd_debug_printf("num_repeat is %d\r\n",num_repeat);
    if(num_repeat == 0) {
        bpdd_debug_printf("photo info sending process\r\n");
        photo_info_sending();
    } else {
        bpdd_debug_printf("photo data sending process\r\n");
        printf("downlink_cnt :%d,downlink_num :%d\r\n",downlink_cnt,downlink_num);
        printf("com_style is %d\r\n",com_style);
        if(downlink_cnt<downlink_num) { //分割データ送信回数回データを送る
            if(com_style == 0) {
                printf("AFSK sending process\r\n");
                photo_data_AFSK_sending();
            } else {
                photo_data_GFSK_sending();
            }
        }else{
            printf("downlink count is not inputed\r\n");
            return 1;//ダウンリンクする回数が指定されていなかったとき用の例外処理
            }
    }

    if(readout_block_num == size) { //読み出したブロックの数と画像のブロックサイズが一致している
        downlink_cnt++;
        readout_block_num=0;
        //if(num_repeat-1==downlink_num*4*readout_block_num||downlink_num*readout_block_num == num_repeat-1) { //画像を実際送信した回数と指定した送信回数が一致している(cnt実装前)}
        if(downlink_cnt>=downlink_num) {
            permit[camera_id]=0;
            downlink_cnt=0;
            num_repeat=0;
            if((permit[0]|permit[1]|permit[2]|permit[3])==0) {
                printf("permit=%d\r\n",permit[0]|permit[1]|permit[2]|permit[3]);
                total_cnt=0;
                printf("mission complete!\r\n");
                flag_BPDD = 1;
            } else {
                flag_BPDD = 0;
            }
        } else {
            flag_BPDD = 0;
        }
    } else {
        flag_BPDD = 0;
    }

    return flag_BPDD;
}