#ifndef REMOVE_MC_TEST

#include "ucps2.h"
#include "SyncVer.h"
#include "SlidingCorrelation.h"
#include "SlidingCorrelationSecond.h"
#include <stdio.h>
#include <math.h>

#define DATA_SIZE 62464
#define CHUNK_SIZE 1024
#define WINDOW_SIZE 32  // 理想的窗口大小（前16，后15，加当前位置）


__DM1 int Input1_part1[] = {
    #include <Inputdata1_part1.dat>
};
__DM1 int Input1_part2[] = {
    #include <Inputdata1_part2.dat>
};
__DM2 int Input2_part1[] = {
    #include <Inputdata2_part1.dat>
};
__DM2 int Input2_part2[] = {
    #include <Inputdata2_part2.dat>
};
__DM3 int ConfigMatrix[] = {
    #include "ConfigSlidingCorrelation.dat"
};
__DM3 int ConfigMatrix2[] = {
    #include "ConfigSlidingCorrelationSecond.dat"
};
__DM3 int Config2[] = {
    #include "ConfigSyncVer.dat"
};

__DM1 int slice1[1055];  // 用于存储Input1切片数据
__DM2 int slice2[1055];  // 用于存储Input2切片数据
__DM5 int MaxData[2];
__DM0 int result[2];  // 存储SyncVer微码模块的计算结果

__DM4 int OutputData[DATA_SIZE];  // 初步同步时的输出存储
__DM4 int OutputData2[1055];
v16u32 KI = { 2, 4, 6 };
__DM3 v16s32 SVRReg  = {
    0, 0, 0, 0,
    0x40, 0, 0, 0,
    0xff00ff, 0, 0, 0x0000,
    0xffff, 0x6, 0, 0
};

// 动态获取切片数据
void GetSliceData(int* input, int* slice, int start, int length) {
    for (int i = 0; i < length; i++) {
        if ((start + i) < 0 || (start + i) >= DATA_SIZE) {
            slice[i] = 0;  // 超出范围的部分填充为0
        } else {
            slice[i] = input[start + i];
        }
    }
}


int main(void) {
    int a;
    int is_synced = 0;  // 同步状态标志
    int maxPosition = 0;
    int maxsum = 0;

    // 初步同步：执行滑动相关性计算
    if (!is_synced) {
        SlidingCorrelation((int)ConfigMatrix, MPU_ADDR(Input1_part1), MPU_ADDR(Input2_part1), MPU_ADDR(OutputData),MPU_ADDR(MaxData));
        SVRReg[0] = MPU_ADDR(ConfigMatrix);
        SlidingCorrelationAsm(SVRReg);
        a = __ucps2_getStatB();
        __ucps2_delay();

        //second part
        SlidingCorrelationSecond((int)ConfigMatrix2, MPU_ADDR(Input1_part2), MPU_ADDR(Input2_part2), MPU_ADDR(OutputData),MPU_ADDR(MaxData));
        SVRReg[0] = MPU_ADDR(ConfigMatrix2);
        SlidingCorrelationSecondAsm(SVRReg);
        a = __ucps2_getStatB();
        __ucps2_delay();

        maxPosition = MaxData[0];
        maxsum = MaxData[1];
        // 设置同步标志
        is_synced = 1;
        printf("初步同步位置：%d\n", maxPosition);
    }

    // 同步后，执行精确同步位置计算
    if (is_synced) {

        // 从初步同步位置前16后15提取切片数据，总共1055个样点
        int startSlice = maxPosition - 16;
        GetSliceData(Input1_part1, slice1, startSlice, 1055);
        GetSliceData(Input2_part1, slice2, startSlice, 1055);

        // 使用SyncVer微码模块进行精确同步的内积计算
        SyncVer((int)Config2, MPU_ADDR(slice1), MPU_ADDR(slice2),MPU_ADDR(OutputData2), MPU_ADDR(result));
        SVRReg[0] = MPU_ADDR(Config2);
        SyncVerAsm(SVRReg);
        a = __ucps2_getStatB();
        __ucps2_delay();

        // 在主函数中对每个起始位置的 1024 个内积累加，寻找最大值
        int maxWindowSum = result[1];
        int bestPosition =result[0];

        printf("精确同步位置：%d，窗口内最大累加和：%d\n", bestPosition, maxWindowSum);
    }

    return 0;
}

#endif