--下面列出了常用的回调函数
--更多功能请阅读<<LUA脚本API.pdf>>

--初始化函数
--function on_init()
--end

--定时回调函数，系统每隔1秒钟自动调用。
--function on_systick()
--end

--用户通过触摸修改控件后，执行此回调函数。
--点击按钮控件，修改文本控件、修改滑动条都会触发此事件。
--function on_control_notify(screen,control,value)
--end

--当画面切换时，执行此回调函数，screen为目标画面。
--function on_screen_change(screen)
--end
local progress = 0      --进度条值
local meter_value = 0   --仪表值
local meter_flag = 0    --仪表标志

local page = {  --界面页面
    main1          = 0,  --主界面一
    main2          = 1,  --主界面二
    main3          = 2,  --主界面三
    button         = 3,  --按钮
    text           = 4,  --文本
    progress       = 5,  --进度条
    meter          = 6,  --仪表
    slider         = 7,  --滑块
    rtc            = 8,  --时间
    animation      = 9,  --动画
    icon           = 10, --图标
    graph          = 11, --曲线
    menu           = 12, --下拉菜单
    selector       = 13, --滚轮选择
    qrcode         = 14, --二维码
    record         = 15, --数据记录
    history_graph  = 16, --历史曲线
    audio          = 17, --音频
    language       = 18, --多语言
    dialog         = 19, --对话框
    video          = 20, --视频
    test           = 30, --测试
    boot_animation = 39, --开机动画
    set_wifi       = 40, --设置WiFi
    search_wifi    = 41, --扫描WiFi
    av_input       = 43, --AV输入
}

local control_id = {    --测试界面测试信息控件ID
    can = 16,
    usb = 12,
    sd = 14,
    uart2 = 15,
}


--单前选中的wifi的名称和密码
local cwifi_ssid = 0    --已连接设备名
local cwifi_pwd  = 0    --输入WiFi密码
local can_cmd_id = 10   --CAN ID

--双串口检测
local cmd = {
    head_tag = 0,   --检测头标识
    head     = 0,   --存放头字节
    tail     = 0,   --存放尾字节
    buff     = {},  --指令缓存
    len      = 0,   --指令长度
    datalen  = 0,   --内容长度
}


--[[***************************************************************************
** Function name:  my_log
** Descriptions:   打印虚拟屏调试信息，设置 en_debug_msg = 1
                   注意：实体屏运行时， en_debug_msg 不能等于 1
***************************************************************************--]]
local en_debug_msg = 0 --0-不显示调试信息;1-虚拟屏; 2-实体屏，串口1输出
function my_log(debug_msg)
    if en_debug_msg == 1 then
        print(debug_msg)

    elseif en_debug_msg == 2 then
        uart_send_string(debug_msg)
        uart_send_string('\r\n')
    end
end



function on_init()
    dofile('esp32.lua')
    uart_set_baudrate2(115200)  --设置与4G模块通讯的串口2的波特率为115200
    air_set_callback(on_air_send_cb,on_air_resp_callback,on_air_log_cb)     --设置4G回调函数
    set_button_notify_release()     --设置按键通知

    if type(canbus_open) == nil then
        set_visiable(0,101,0)
    end

    local cur_lang = get_language()
    if cur_lang == 0 then       --当前语言为中文
        set_visiable(page.main1,101,0)  --隐藏英文时间显示
        set_value(page.language,1,1)
        set_value(page.language,2,0)

    elseif cur_lang == 0x81 then    --当前语言为英文
        set_visiable(page.main1,100,0)  --隐藏中文时间显示
        set_value(page.language,2,1)
        set_value(page.language,1,0)
    end

    esp32_int_station()
    search_wifi_clear()

    start_timer(8,1000,0,0)     --历史曲线
    start_timer(2,5000,0,1)     --虚拟屏定时退出

    uart_set_baudrate3(19200)   --双串口初始化

    set_av_option(0,1)          --AV初始化

    canbus_open(0,125,0,0)      --CAN初始化
end

function on_init_cb(key, value) 
    my_log('on_init_cb key:'..key..',value:'..value)
    if string.find(key,'+CWMODE=1') ~= nil and string.find(value,'OK') ~= nil then
        search_wifi_clear()
        esp32_search_wifi()
        search_wifi_num = 0
    end
end

--清空WiFi扫描名称
function search_wifi_clear()
    for i = 1, 14 do
        set_text(page.search_wifi,i,'')
    end
end

local search_wifi_num = 0
--+CWLAP:(4,"RD",-52,"08:9b:4b:9d:c8:ed",1,-1,-1,4,4,7,0)
function on_search_wifi_cb(key, value) 
    my_log('on_search_wifi_cb key:'..key..',value:'..value)
--local regular_e = '+ICCID: (%d*)'                       --正则表达式
--local my_iccid = string.match( value, regular_e)        --获取的值赋给 my_iccid 
    
    if string.find(key,'+CWLAP') ~= nil and string.find(value,'CWLAP:') ~= nil 
    then
        local regular_e = '.*CWLAP:[(0-9]*,"(.*)",[-0-9]*,".*",.*'                       --正则表达式
        local my_wifi_ssid = string.match( value, regular_e)        --获取的值赋给 my_iccid 
        my_log('my_wifi_ssid :'..my_wifi_ssid)
        set_text(page.search_wifi,1+search_wifi_num,my_wifi_ssid)
        
        local regular_e2 = '.*CWLAP:[(0-9]*,".*",([-0-9]*),".*",.*'                       --正则表达式
        local my_wifi_rssi = string.match( value, regular_e2)        --获取的值赋给 my_iccid 
        my_log('my_wifi_ssid :'..my_wifi_rssi)
        --set_text(page.search_wifi,101+search_wifi_num,my_wifi_rssi)
        
        search_wifi_num = search_wifi_num + 1
    end
end

function on_connect_ap_cb(key, value) 
    my_log('on_connect_ap_cb key:'..key..',value:'..value)

    if string.find(key,'+CWJAP') ~= nil and string.find(value,'OK') ~= nil then
        set_text(page.set_wifi,1,'已连接')
        set_text(page.set_wifi,3,cwifi_ssid)
        my_log('sus:wifi connect ok')
        esp32_search_ip()
    end

    if string.find(key,'+CWJAP') ~= nil and string.find(value,'ERROR') ~= nil then
        set_text(page.set_wifi,1,'连接失败')
        my_log('error:wifi connect error')
    end
end

function on_search_wifi_ip(key, value)
    my_log('on_search_wifi_ip')
    if string.find(key,'+CIPSTA') ~= nil and string.find(value,'CIPSTA:ip:') ~= nil
    then
        local my_wifi_ip = string.match(value, '%d+%.%d+%.%d+%.%d+')
        my_log('wifi_ip:my_wifi_ip')
        set_text(page.set_wifi,2,my_wifi_ip)
        my_log('my_wifi_ip:'..my_wifi_ip)
    end
end



function on_timer(timer_id)

    on_esp_timer(timer_id)

    if timer_id == 1 then       --仪表
        if meter_value <= 0 then        --小于0时，数值加
            meter_flag = 0
        end

        if meter_value >= 270 then      --大于0时，数值减
            meter_flag = 1
        end

        if meter_flag == 0 then
            set_value(page.meter,1,meter_value)
            set_value(page.meter,5,meter_value)     --指针转动
            meter_value = meter_value + 2           --数值增加
        end

        if meter_flag == 1 then
            set_value(page.meter,1,meter_value)
            set_value(page.meter,5,meter_value)     --指针转动
            meter_value = meter_value - 2           --数值增加
        end
    end

    if timer_id == 2 then   --虚拟屏退出动画
        change_screen(0)
    end

    if timer_id == 8 then   --历史曲线
        local Curve_value = math.random(1,254)
        set_history_graph_value(page.history_graph, 1,Curve_value)
    end

    if timer_id == 4 then      --双串口测试
        local uart3_buffer= {0x04,0xFF,0xFC,0xFF,0xFF}
        uart3_buffer[0] = 0xEE
        uart_send_data3(uart3_buffer)
    end
end


function on_control_notify(screen,control,value)

    if screen == page.meter then        --仪表
        if control == 4 and value == 1 then
            start_timer(1,15,0,0)
        end

        if control == 4 and value == 0 then
            stop_timer(1)
        end
    end
    
    if screen == page.selector then     --滚轮选择
        if control == 1 then
            if value >= 0 and value <= 6 then
                set_value(screen,3,0)
            end

            if value > 6 and value <= 12 then
                set_value(screen,3,1)
            end

            if value > 12 and value <= 18 then
                set_value(screen,3,2)
            end

            if value > 18 and value <= 21 then
                set_value(screen,3,3)
            end

            if value > 21 and value <= 23 then
                set_value(screen,3,4)
            end
        end
    end

    if screen == page.rtc then      --时间
        if control == 8 and value == 0 then
            local year,mon,day,hour,min,sec,week = get_date_time()
            if week == 0 then week = "日" end
            if week == 1 then week = "一" end
            if week == 2 then week = "二" end
            if week == 3 then week = "三" end
            if week == 4 then week = "四" end
            if week == 5 then week = "五" end
            if week == 6 then week = "六" end
            set_text(screen,1,year)
            set_text(screen,2,mon)
            set_text(screen,3,day)
            set_text(screen,4,hour)
            set_text(screen,5,min)
            set_text(screen,6,sec)
            set_text(screen,7,week)	
        end
    end

    if screen == page.progress then     --进度条
        if control == 3
        then
            if value == 0 or value == 2 then
                progress = progress - 1
                if progress <= 0 then
                    progress = 0
                end
                set_value(screen,1,progress)
                set_value(screen,2,progress)
            end

        elseif control == 1
        then
            set_value(screen, 2, value)
            progress = value

        elseif control == 4
        then
            if value == 0 or value == 2 then
                progress = progress + 1
                if progress >= 100 then
                    progress = 100
                end
                set_value(screen,1,progress)
                set_value(screen,2,progress)
            end
        end
    end

    if screen == page.slider then       --滑块
        if control == 2 then
            set_value(screen,3,value)
            set_backlight(value)
        end

        if control == 5 then
            set_value(screen,6,value)
        end
    end

    if screen == page.set_wifi then   --设置WiFi
        if control == 50 then       --选取网络
            search_wifi_clear()
            esp32_search_wifi()
            search_wifi_num = 0
        end

        if control == 51 then       --连接设备
            cwifi_pwd = get_text(page.set_wifi,5)
            esp32_connect_ap(cwifi_ssid,cwifi_pwd)
        end
    end

    if screen == page.search_wifi then    --扫描WiFi
        if control == 50 then       --扫描热点
            search_wifi_clear()
            esp32_search_wifi()
            search_wifi_num = 0
        end

        if control > 14 and control < 29 then   --选择WiFi
            cwifi_ssid = get_text(page.search_wifi,control - 14)
            print(cwifi_ssid)
            set_text(page.set_wifi,4,cwifi_ssid)
        end
    end
end


--切换页面回调
function on_screen_change(screen)
    if screen == page.test then --进入测试界面
        stop_timer(4)
        start_timer(4,1000,0,0)     --发送
    else
        stop_timer(4)
    end
end


--视频播放回调
function on_video_notify(msg,v1,v2)
    local anim_id = get_current_screen()
    if anim_id == page.boot_animation and msg == 0 then
        stop_timer(2)
        change_screen(0)
    end
end


--音频播放结束回调
function on_audio_callback(state)
    set_value(page.audio,3,0)
    set_value(page.audio,4,0)
end



--[[***************************************************************************
** Function name:  on_air_log_cb
** Descriptions:   4G模块-调试信息输出
***************************************************************************--]]
function on_air_log_cb(msg)
    --数据打印到记录控件
    --record_add(0,4,string.sub(msg,1,100))
end


--[[***************************************************************************
** Function name:  on_air_send_cb
** Descriptions:   4G模块-发送数据
***************************************************************************--]]
function on_air_send_cb(msg)
    if air_debug_mode == 1
    then
        uart_send_string(msg)            -- air_debug_mode==1 ，使用虚拟屏调试，通过串口1发送数据
        my_log(msg)
    else
        uart_send_string2(msg)          -- air_debug_mode==0 ，使用实体屏调试，通过串口3发送数据
        --my_log('out: '..msg..'\r\n')
    end
end


--[[***************************************************************************
** Function name:  on_air_resp_callback
** Descriptions :  4G模块-数据回调接口
** @key         :  屏幕->4G模块的发送请求
** @value       :  4G模块->返回的数据
***************************************************************************--]]
function on_air_resp_callback(key, value)  

    my_log('on_air_resp_callback()')

    if value == nil
    then
        return              --value为空时退出
    end
    --***************************************************************************
    --功能：    判断 key
    --          如果 key 为空，则退出函数。
    --          因为 key 为空时，下方 string.find( key , ) 是不正确的使用。
    --          以下key的处理必须不为空，
    --***************************************************************************
    if key == nil 
    then
        return
    end
end


--[[***************************************************************************
** Function name : on_uart_recv_data
** Descriptions  : 接收串口1的数据的回调函数。串口1是普通串口。
**                 虚拟屏调试时, air_debug_mode = 1，处理串口1的数据。
** @packet       : 接收的数据包
** @return       : nil,无返回值
***************************************************************************--]]
function on_uart_recv_data(packet)
    --4G模块直接PC串口
    if air_debug_mode == 1 
    then
        on_esp_recv_data(packet)
    end
    if air_debug_mode == 0
    then
        uart_send_data2(packet)
    end
end

--[[***************************************************************************
** Function name:  on_uart_recv_data3
** Descriptions:   接收串口3的数据的回调函数。串口3是连接4G模块。
***************************************************************************--]]
function on_uart_recv_data2(packet)
    on_esp_recv_data(packet)
end

--***************测试界面CAN，双串口，SD，USB检测******************************
function on_uart_recv_data3(packet)     --串口2

    for i = 0,(#(packet))
    do
        if cmd.head_tag == 0
        then
            cmd.head = (cmd.head | packet[i]) & 0xFF
        end

        if cmd.head == 0xEE and cmd.head_tag == 0 then
            cmd.buff = {}
            cmd.datalen = 1
            cmd.buff[0] = 0xEE
            cmd.head_tag = 1
        end

        if cmd.head_tag == 1 then
            cmd.buff[cmd.datalen] = packet[i]
            cmd.datalen = cmd.datalen + 1
        end

        if cmd.head_tag == 1 then
            cmd.tail = ((cmd.tail << 8) & 0xFFFFFFFF) | packet[i]
        end
    end

    if cmd.datalen >= 6 and cmd.tail == 0xFFFCFFFF then    --指令长度判定
        set_text(peage.test, control_id.uart2, "串口2通信:成功")
        cmd = {    --初始化，清空串口相关标识，缓冲区
            head_tag = 0,
            head     = 0,
            tail     = 0,
            buff     = {},
            len      = 0,
            datalen  = 0
        }
        stop_timer(4)
    end
end


function on_canbus_recv (index,identifier,dlc,rtr,ide,data)     --CAN通讯

    if can_cmd_id == identifier then
        if data[0] == 0xA0 then
            canbus_write(0, can_cmd_id, 8, 0, 0, {[0] = (data[1] + 1),0x55,0x00,0x08,0xF2,0x01,0xCC,0xCC})
        elseif data[0] == 0xA2 then
            set_text(page.test, control_id.can, "CAN通信:成功")
        end
    end
end


function on_usb_inserted(driver)    --U盘插入
    set_text(page.test, control_id.usb, 'U盘检测：正常')
end


function on_sd_inserted(dir)    --SD卡插入
    set_text(page.test, control_id.sd, 'SD卡检测：正常')
end
