-------------------------------------------------------
--   设置CV的值
-------------------------------------------------------
local CV_Index = 0
local CV_value = -2


local str
local can_id = 0x120
local byte0 = 0x00
local byte1 = 0x00
local byte2 = 0x00
local byte3 = 0x00
local byte4 = 0x00
local byte5 = 0x00
local byte6 = 0x00
local byte7 = 0x00

print("设置CV的值")
can_bus("open", 0, 8, 500000, 500000) 

byte0 = ((CV_Index >> 0) & 0xFF)
byte1 = ((CV_Index >> 8) & 0xFF)

byte2 = ((CV_value >> 0) & 0xFF)
byte3 = ((CV_value >> 8) & 0xFF)
byte4 = ((CV_value >> 16) & 0xFF)
byte5 = ((CV_value >> 24) & 0xFF)

str= string.format("%c%c%c%c%c%c%c%c", byte0, byte1, byte2, byte3, byte4, byte5, byte6, byte7)

can_bus("send", 0, 0, can_id, str)
-------------------------------------------------------
--   读取CV的值
-------------------------------------------------------
local CV_Index = 0

local str
local can_id = 0x121
local byte0 = 0x00
local byte1 = 0x00
local byte2 = 0x00
local byte3 = 0x00
local byte4 = 0x00
local byte5 = 0x00
local byte6 = 0x00
local byte7 = 0x00

print("读取CV的值")
can_bus("open", 0, 8, 500000, 500000) 

byte0 = ((CV_Index >> 0) & 0xFF)
byte1 = ((CV_Index >> 8) & 0xFF)

str= string.format("%c%c%c%c%c%c%c%c", byte0, byte1, byte2, byte3, byte4, byte5, byte6, byte7)

can_bus("send", 0, 0, can_id, str)

-------------------------------------------------------
--   读取GV
-------------------------------------------------------
local GV_Index = 0
local GV_Length = 1
local GV_config = 1

local str
local can_id = 0x130
local byte0 = 0x00
local byte1 = 0x00
local byte2 = 0x00
local byte3 = 0x00
local byte4 = 0x00
local byte5 = 0x00
local byte6 = 0x00
local byte7 = 0x00

print("读取GV的值")
can_bus("open", 0, 8, 500000, 500000) 

byte0 = ((GV_Index >> 0) & 0xFF)
byte1 = ((GV_Index >> 8) & 0xFF)

byte2 = ((GV_Length >> 0) & 0xFF)
byte3 = ((GV_Length >> 8) & 0xFF)

byte4 = ((GV_config >> 0) & 0xFF)

str= string.format("%c%c%c%c%c%c%c%c", byte0, byte1, byte2, byte3, byte4, byte5, byte6, byte7)

can_bus("send", 0, 0, can_id, str)

___________________
-------------------------------------------------------
--   
--     H7-TOOL CAN FD脱机烧录Lua小程序实现
--
-------------------------------------------------------	
local str
local len
local bytes
local bin
local offset
local value
local count
local filesize
local byte0
local byte1
local byte2
local byte3
local filepath = "0:/H7-TOOL/Programmer/User/ROBOT/H7_Bootloader_APP_Test.bin" -- 表示CAN脱机烧录文件夹下存的文件
local filepath1 = "0:/H7-TOOL/Lua/CANFD_UPDATE"        -- 浏览CAN脱机烧录文件下存的文件
local can_id = 0x222  -- 目标板的ID
local str_offset
local str_offset1

local update_index
local update_index_str
local update_sum
local update_index_str

-------------------------------------------------------
--   第1步：浏览串口脱机烧录文件夹下存的文件
-------------------------------------------------------
f_dir(filepath1)
print()

-------------------------------------------------------
--   第2步：CAN FD配置
-------------------------------------------------------
print("CAN FD测试")

--第1个参数
----open，close，send，recive
--第2个参数
----- 0 表示FDCAN_FRAME_CLASSIC
----- 1 表示FDCAN_FRAME_FD_NO_BRS
----- 2 表示FDCAN_FRAME_FD_BRS
--第3个参数，支持的数据个数
---- 表示64个字节
--第4个参数，仲裁阶段波特率
--第5个参数，数据阶段波特率
can_bus("open", 1, 64, 500000, 500000) 

-------------------------------------------------------
--   第3步：发送固件大小，方便目标板擦除相应大小扇区
-------------------------------------------------------
-- 获取固件大小
filesize=f_size(filepath)    
print("============================================")
str= string.format("固件大小：%d",filesize)
print(str)

-- 将固件大小转换成四个字节
byte0 = ((filesize >> 0) & 0xFF)
byte1 = ((filesize >> 8) & 0xFF)
byte2 = ((filesize >> 16) & 0xFF)
byte3 = ((filesize >> 24) & 0xFF)

--发送固件大小给目标板
--发送*号表示固件大小命令
--发送固件大小
--固定发送64字节
str_offset = string.format("%02d", 64 - 5)
str= string.format("%c%c%c%c%c".."%"..str_offset.."s", 42, byte0, byte1, byte2, byte3, "A")
print(str)

--第1个参数
----open，close，send，recive
--第2个参数
----ID类型，0表示标准ID，1表示扩展ID
--第3个参数
----0数据帧，1遥控帧
--第4个参数
----字符串
can_bus("send", 0, 0, can_id, str)

print("执行扇区擦除.....")

-- 正常这里应该等待CAN返回应答0x30，暂时用延迟实现
delayms(2000) 

-------------------------------------------------------
--   第4步：发送固件大小
-------------------------------------------------------
offset = 0
-- 第1个参数是路径，第2个参数的偏移地址，第3个参数读取大小
-- 返回值bytes表示读取的字节数，bin表示都回的数据
bytes, bin = f_read(filepath, 0, 32) 
offset = offset + bytes

update_index = 0

while(bytes > 0)
do
    -- 发送$表示开始传输固件命令
    -- 发送固件数据给目标板
    -- 固定每次发送64个字节
    count = 64 - 2 - 2 - 4 - bytes
    str_offset = string.format("%02d", count)
    str_offset1 = string.format("%"..str_offset.."s", "A")
    str_offset2 =  string.format("$%c", bytes)

    byte0 = ((update_index >> 0) & 0xFF)
    byte1 = ((update_index >> 8) & 0xFF)
    byte2 = ((update_index >> 16) & 0xFF)
    byte3 = ((update_index >> 24) & 0xFF)

    update_index_str = string.format("%c%c%c%c",byte0, byte1, byte2, byte3)

    update_sum = 0

    for i=1,bytes,1 do
      update_sum = update_sum + string.byte(bin,i)
    end

    byte0 = ((update_sum >> 0) & 0xFF)
    byte1 = ((update_sum >> 8) & 0xFF)

    update_sum_str = string.format("%c%c",byte0, byte1)

    str= str_offset2..update_index_str..update_sum_str..bin..str_offset1
    can_bus("send", 0, 0, can_id, str)
    
    -- 等待目标板返回确认数据0x30
    -- 返回0x30表示发送成功
    -- 暂时用延迟实现
    delayms(30)
    
    bytes, bin = f_read(filepath, offset, 32)  -- 继续读取数据
    offset = offset + bytes
    update_index = update_index+1
    if(bytes ~= 0) then                         -- 读取不为0，打印发送的总字节数
        print("发送固件:", offset)
    end
end

-------------------------------------------------------
--   第5步：发送传输结束命令
-------------------------------------------------------
str_offset = string.format("%02d", 64 - 1)
str= string.format("#".."%"..str_offset.."s", "A")
can_bus("send", 0, 0, can_id, str)
print("固件传输完成")

-------------------------------------------------------
--  end of file
-------------------------------------------------------

--local byte0 = 0x12
--local byte1 = 0x12
--local byte2 = 0x12
--local byte3 = 0x12
--local str_offset
--local str_offset1
--str_offset = string.format("%02d", 64 - 5)
--str= string.format("%c%c%c%c%c".."%"..str_offset.."s", 42, byte0, byte1, byte2, byte3, "A")
--for i=1,64,1 do
--  print(string.format("%02d", i),"=",string.format("%02x", string.byte(string.sub(str,i,i))))
--end