5. 一拖多调VCOM

本章节主要介绍如何在自动调VCOM的基础上,进一步实现一拖多调VCOM的功能。

主要内容:

  • 1 添加设置不同对象VCOM和GetFlick函数

  • 2 添加不同对象调VCOM流程

  • 3 添加初始化

  • 4 启动不同对象的线程

  • 5 一拖多调VCOM示例

Attention

  • 如果还未点屏成功,请到前面的章节学习如何点亮屏幕

  • 如果还未成功初始化镜头或者校准镜头,请到前面的章节学习如何使用

  • 如果还未了解过线程使用方法,请到 Micropython特定的库 查看 线程 的章节学习如何使用

5.1. 添加设置不同对象VCOM和GetFlick函数:

def SetVCOM_0(vcom):

    vcomh = (vcom>>8)&0x03
    vcoml = vcom&0xff

    SHARP_user.My_MIPI_Board[0].MIPI_WR((0x29, 0xD5, vcomh,vcoml,vcomh,vcoml,vcomh,vcoml))
    user_mode.Delay_ms(10)
    return 1

def GetFlick_0():
    for i in range(20):
        try:
            CA410_DB = SHARP_user.My_CA410_0.COMCA410_GetdB(1)
            user_mode.Delay_ms(100)
            return 1,CA410_DB
        except Exception as e:
            if i==19:
                raise e

def SetVCOM_1(vcom):

    vcomh = (vcom>>8)&0x03
    vcoml = vcom&0xff

    SHARP_user.My_MIPI_Board[1].MIPI_WR((0x29, 0xD5, vcomh,vcoml,vcomh,vcoml,vcomh,vcoml))
    user_mode.Delay_ms(10)
    return 1

def GetFlick_1():
    for i in range(20):
        try:
            CA410_DB = SHARP_user.My_CA410_1.COMCA410_GetdB(1)
            user_mode.Delay_ms(100)
            return 1,CA410_DB
        except Exception as e:
            if i==19:
                raise e

5.2. 添加不同对象调VCOM流程:

    1. 方法 AutoVcom_ScanRange 用于实现 在规定的范围内 从小到大扫描,找到最佳VCOM。(是VCOM从小到底 不是闪烁从小到大)

    • vcom_min - 最小VCOM值,开始值

    • vcom_max - 最大VCOM值,结束值

    • step - VCOM递增的阶数

    • step_delay_ms - 每一步间隔时时间

    • 返回 res - >0 : 扫描完成; <=0 : 负数出错,结束。

    • 返回 Value - 查找到最佳VCOM

    1. 方法 AutoVcom_ScanDef 用于实现 从默认值开始扫描,寻找最佳VCOM

    • vcom_def - VCOM默认值,以这个值为中心值寻找最佳VCOM

    • step - VCOM递增的阶数

    • step_delay_ms - 每一步间隔时时间

    • 返回 res - >0 : 扫描完成; <=0 : 负数出错,结束。

    • 返回 Value - 查找到最佳VCOM

def AutoOTP_0():
    print("threadName AutoOTP_0")
    t_start_0 = user_mode.MeasureTimeStart_ms()

    SHARP_user.Auto_VCOM_0.one_vcom_flag = 0
    user_mode.Delay_ms(1000)
    if SHARP_user.Auto_VCOM_0.one_vcom_flag == 0:
        user_mode.DEBUG("AutoOTP_0 : 1 scan vcom ..\r\n")
        res,Value =SHARP_user.Auto_VCOM_0.Auto_Vcom_Object.AutoVcom_ScanRange(0x250,0x290,5,500)
        print("AutoOTP_0 : 1 scan vcom end")
        if res<0:
            print("AutoOTP_0 : scan error1")
            SHARP_user.task0.release()                      #释放锁
            return 0
        print("AutoOTP_0 : 1 scan vcom ok")
        print("AutoOTP_0 : 1 good vcom =%d "%Value)
        user_mode.DEBUG("AutoOTP_0 : 1 good vcom =%d\n"%Value)
        SHARP_user.Auto_VCOM_0.center_vcom = Value #保存VCOM中心值
        SHARP_user.Auto_VCOM_0.one_vcom_flag = 1   #第一次找值标志位置一,下次不再进行第一次找值
    #第二次 进行中心值的小范围找值
    print("AutoOTP_0 : 2 scan vcom...")
    res,Value = SHARP_user.Auto_VCOM_0.Auto_Vcom_Object.AutoVcom_ScanDef(SHARP_user.Auto_VCOM_0.center_vcom, 2, 300)
    if res<0:
            print("AutoOTP_0 : scan error2\r\n")
            SHARP_user.task0.release()                      #释放锁
            return 0
    print("AutoOTP_0 : 2 scan vcom ok")
    print("AutoOTP_0 : 2 good vcom =%d "%Value)
    user_mode.DEBUG("2 good vcom =%d\n"%Value)
    #第三次 进行精准找值
    print("AutoOTP_0 : 3 scan vcom ...")
    res,Value = SHARP_user.Auto_VCOM_0.Auto_Vcom_Object.AutoVcom_ScanRange(Value - 2, Value + 2, 1, 500)
    if res<0:
        print("AutoOTP_0 : scan error3")
        SHARP_user.task0.release()                      #释放锁
        return 0
    print("AutoOTP_0 : 3 scan vcom ok")
    print("AutoOTP_0 : 3 good vcom =%d "%Value)
    user_mode.DEBUG("AutoOTP_0 : 3 good vcom =%d\n"%Value)
    SHARP_user.Auto_VCOM_0.VCOM_VAL = Value #保存最佳VCOM

    print("AutoOTP_0 : vcom scan time =%.2f s"%((user_mode.GetMeasureTime_ms(t_start_0))/1000.0))
    SHARP_user.task0.release()                      #释放锁

def AutoOTP_1():
    print("threadName AutoOTP_1")
    t_start_1 = user_mode.MeasureTimeStart_ms()

    SHARP_user.Auto_VCOM_1.one_vcom_flag = 0
    user_mode.Delay_ms(1000)
    if SHARP_user.Auto_VCOM_1.one_vcom_flag == 0:
        user_mode.DEBUG("AutoOTP_1 : 1 scan vcom ..\r\n")
        res,Value =SHARP_user.Auto_VCOM_1.Auto_Vcom_Object.AutoVcom_ScanRange(0x250,0x290,5,500)
        print("AutoOTP_1 : 1 scan vcom end")
        if res<0:
            print("AutoOTP_1 : scan error1")
            SHARP_user.task1.release()                      #释放锁
            return 0
        print("AutoOTP_1 : 1 scan vcom ok")
        print("AutoOTP_1 : 1 good vcom =%d "%Value)
        user_mode.DEBUG("AutoOTP_1 : 1 good vcom =%d\n"%Value)
        SHARP_user.Auto_VCOM_1.center_vcom = Value #保存VCOM中心值
        SHARP_user.Auto_VCOM_1.one_vcom_flag = 1   #第一次找值标志位置一,下次不再进行第一次找值
    #第二次 进行中心值的小范围找值
    print("AutoOTP_1 : 2 scan vcom...")
    res,Value = SHARP_user.Auto_VCOM_1.Auto_Vcom_Object.AutoVcom_ScanDef(SHARP_user.Auto_VCOM_1.center_vcom, 2, 300)
    if res<0:
            print("scan error2\r\n")
            SHARP_user.task1.release()                      #释放锁
            return 0
    print("AutoOTP_1 : 2 scan vcom ok")
    print("AutoOTP_1 : 2 good vcom =%d "%Value)
    user_mode.DEBUG("AutoOTP_1 : 2 good vcom =%d\n"%Value)
    #第三次 进行精准找值
    print("AutoOTP_1 : 3 scan vcom ...")
    res,Value = SHARP_user.Auto_VCOM_1.Auto_Vcom_Object.AutoVcom_ScanRange(Value - 2, Value + 2, 1, 500)
    if res<0:
        print("AutoOTP_1 : scan error3")
        SHARP_user.task1.release()                      #释放锁
        return 0
    print("AutoOTP_1 : 3 scan vcom ok")
    print("AutoOTP_1 : 3 good vcom =%d "%Value)
    user_mode.DEBUG("3 good vcom =%d\n"%Value)
    SHARP_user.Auto_VCOM_1.VCOM_VAL = Value #保存最佳VCOM

    print("AutoOTP_1 : vcom scan time =%.2f s"%((user_mode.GetMeasureTime_ms(t_start_1))/1000.0))
    SHARP_user.task1.release()                      #释放锁

5.3. 添加初始化:

在main函数初始化时候添加。

  • 1.在硬件初始化函数之后实现,实例化不同对象调vcom 类

  • 2.实例化不同对象的探头模块类

  • 3.实例化不同对象的 SHARP_Auto_Vcom 用于自动调vcom 类

    -Debug 打印函数, None–打印 1–Print 打印 打印函数–按打印函数的格式打印

    -Set_VCOM 设置vcom 函数 函数形式: SetVCOM(vcom) , return 写入成功与否返回值

    -GetFlick 获取flick 函数 函数形式: GetFlick() , return 读取成功与否返回值,flick值

    1. 创建互斥锁,用于线程阻塞

class User_Fun():
    Auto_VCOM_0 = User_Auto_VCOM()    #实例化调vcom 类
    Auto_VCOM_1 = User_Auto_VCOM()    #实例化调vcom 类

    My_CA410_0 = COMCA410(SHARP_Multi_BusRS232_init(id=1),1,0,id=1)
    My_CA410_1 = COMCA410(SHARP_Multi_BusRS232_init(id=3),1,0,id=3)

    Auto_VCOM_0.Auto_Vcom_Object=SHARP_Auto_Vcom(user_mode.DEBUG,SetVCOM_0,GetFlick_0)
    Auto_VCOM_1.Auto_Vcom_Object=SHARP_Auto_Vcom(user_mode.DEBUG,SetVCOM_1,GetFlick_1)

    task0 = _thread.allocate_lock()           #创建互斥锁
    task1 = _thread.allocate_lock()           #创建互斥锁

5.4. 启动不同对象的线程

本章通过创建多个线程的方式,同时启动不同对象调VCOM流程,实现一拖多调VCOM

  • _thread.start_new_thread(function,args [,kwargs]) 用于启动指定对象的线程

    • function : 要启动的函数

    • args : 函数的参数列表(必须是元组)

    • kwargs : 指定关键字参数的字典(可选)

_thread.start_new_thread(AutoOTP_0,())      #启动线程
_thread.start_new_thread(AutoOTP_1,())      #启动线程

5.5. 一拖多调VCOM示例

from sharp_user import user_mode,SHARP_Multi_BusRS232_init
from sharp_auto_vcom import *
from sharp_lens import COMCA410
import _thread

class User_Auto_VCOM():         #调vcom使用的类
    Auto_Vcom_Object = 0        #
    vcom_adap = 0               #硬件设备
    one_vcom_flag = 0           #第一次vcom查找标志位
    center_vcom = 0             #vcom中心值
    VCOM_VAL = 0                #最佳VOCM值

def SetVCOM_0(vcom):

    vcomh = (vcom>>8)&0x03
    vcoml = vcom&0xff

    SHARP_user.My_MIPI_Board[0].MIPI_WR((0x29, 0xD5, vcomh,vcoml,vcomh,vcoml,vcomh,vcoml))
    user_mode.Delay_ms(10)
    return 1

def GetFlick_0():
    for i in range(20):
        try:
            CA410_DB = SHARP_user.My_CA410_0.COMCA410_GetdB(1)
            user_mode.Delay_ms(100)
            return 1,CA410_DB
        except Exception as e:
            if i==19:
                raise e

def SetVCOM_1(vcom):

    vcomh = (vcom>>8)&0x03
    vcoml = vcom&0xff

    SHARP_user.My_MIPI_Board[1].MIPI_WR((0x29, 0xD5, vcomh,vcoml,vcomh,vcoml,vcomh,vcoml))
    user_mode.Delay_ms(10)
    return 1

def GetFlick_1():
    for i in range(20):
        try:
            CA410_DB = SHARP_user.My_CA410_1.COMCA410_GetdB(1)
            user_mode.Delay_ms(100)
            return 1,CA410_DB
        except Exception as e:
            if i==19:
                raise e

######################### 调vcom流程 ########################################
def AutoOTP_0():
    print("threadName AutoOTP_0")
    t_start_0 = user_mode.MeasureTimeStart_ms()

    SHARP_user.Auto_VCOM_0.one_vcom_flag = 0
    user_mode.Delay_ms(1000)
    if SHARP_user.Auto_VCOM_0.one_vcom_flag == 0:
        user_mode.DEBUG("AutoOTP_0 : 1 scan vcom ..\r\n")
        res,Value =SHARP_user.Auto_VCOM_0.Auto_Vcom_Object.AutoVcom_ScanRange(0x250,0x290,5,500)
        print("AutoOTP_0 : 1 scan vcom end")
        if res<0:
            print("AutoOTP_0 : scan error1")
            SHARP_user.task0.release()                      #释放锁
            return 0
        print("AutoOTP_0 : 1 scan vcom ok")
        print("AutoOTP_0 : 1 good vcom =%d "%Value)
        user_mode.DEBUG("AutoOTP_0 : 1 good vcom =%d\n"%Value)
        SHARP_user.Auto_VCOM_0.center_vcom = Value #保存VCOM中心值
        SHARP_user.Auto_VCOM_0.one_vcom_flag = 1   #第一次找值标志位置一,下次不再进行第一次找值
    #第二次 进行中心值的小范围找值
    print("AutoOTP_0 : 2 scan vcom...")
    res,Value = SHARP_user.Auto_VCOM_0.Auto_Vcom_Object.AutoVcom_ScanDef(SHARP_user.Auto_VCOM_0.center_vcom, 2, 300)
    if res<0:
            print("AutoOTP_0 : scan error2\r\n")
            SHARP_user.task0.release()                      #释放锁
            return 0
    print("AutoOTP_0 : 2 scan vcom ok")
    print("AutoOTP_0 : 2 good vcom =%d "%Value)
    user_mode.DEBUG("2 good vcom =%d\n"%Value)
    #第三次 进行精准找值
    print("AutoOTP_0 : 3 scan vcom ...")
    res,Value = SHARP_user.Auto_VCOM_0.Auto_Vcom_Object.AutoVcom_ScanRange(Value - 2, Value + 2, 1, 500)
    if res<0:
        print("AutoOTP_0 : scan error3")
        SHARP_user.task0.release()                      #释放锁
        return 0
    print("AutoOTP_0 : 3 scan vcom ok")
    print("AutoOTP_0 : 3 good vcom =%d "%Value)
    user_mode.DEBUG("AutoOTP_0 : 3 good vcom =%d\n"%Value)
    SHARP_user.Auto_VCOM_0.VCOM_VAL = Value #保存最佳VCOM

    print("AutoOTP_0 : vcom scan time =%.2f s"%((user_mode.GetMeasureTime_ms(t_start_0))/1000.0))
    SHARP_user.task0.release()                      #释放锁

def AutoOTP_1():
    print("threadName AutoOTP_1")
    t_start_1 = user_mode.MeasureTimeStart_ms()

    SHARP_user.Auto_VCOM_1.one_vcom_flag = 0
    user_mode.Delay_ms(1000)
    if SHARP_user.Auto_VCOM_1.one_vcom_flag == 0:
        user_mode.DEBUG("AutoOTP_1 : 1 scan vcom ..\r\n")
        res,Value =SHARP_user.Auto_VCOM_1.Auto_Vcom_Object.AutoVcom_ScanRange(0x250,0x290,5,500)
        print("AutoOTP_1 : 1 scan vcom end")
        if res<0:
            print("AutoOTP_1 : scan error1")
            SHARP_user.task1.release()                      #释放锁
            return 0
        print("AutoOTP_1 : 1 scan vcom ok")
        print("AutoOTP_1 : 1 good vcom =%d "%Value)
        user_mode.DEBUG("AutoOTP_1 : 1 good vcom =%d\n"%Value)
        SHARP_user.Auto_VCOM_1.center_vcom = Value #保存VCOM中心值
        SHARP_user.Auto_VCOM_1.one_vcom_flag = 1   #第一次找值标志位置一,下次不再进行第一次找值
    #第二次 进行中心值的小范围找值
    print("AutoOTP_1 : 2 scan vcom...")
    res,Value = SHARP_user.Auto_VCOM_1.Auto_Vcom_Object.AutoVcom_ScanDef(SHARP_user.Auto_VCOM_1.center_vcom, 2, 300)
    if res<0:
            print("scan error2\r\n")
            SHARP_user.task1.release()                      #释放锁
            return 0
    print("AutoOTP_1 : 2 scan vcom ok")
    print("AutoOTP_1 : 2 good vcom =%d "%Value)
    user_mode.DEBUG("AutoOTP_1 : 2 good vcom =%d\n"%Value)
    #第三次 进行精准找值
    print("AutoOTP_1 : 3 scan vcom ...")
    res,Value = SHARP_user.Auto_VCOM_1.Auto_Vcom_Object.AutoVcom_ScanRange(Value - 2, Value + 2, 1, 500)
    if res<0:
        print("AutoOTP_1 : scan error3")
        SHARP_user.task1.release()                      #释放锁
        return 0
    print("AutoOTP_1 : 3 scan vcom ok")
    print("AutoOTP_1 : 3 good vcom =%d "%Value)
    user_mode.DEBUG("3 good vcom =%d\n"%Value)
    SHARP_user.Auto_VCOM_1.VCOM_VAL = Value #保存最佳VCOM

    print("AutoOTP_1 : vcom scan time =%.2f s"%((user_mode.GetMeasureTime_ms(t_start_1))/1000.0))
    SHARP_user.task1.release()                      #释放锁

class User_Fun():
    Auto_VCOM_0 = User_Auto_VCOM()    #实例化调vcom 类
    Auto_VCOM_1 = User_Auto_VCOM()    #实例化调vcom 类

    My_CA410_0 = COMCA410(SHARP_Multi_BusRS232_init(id=1),1,0,id=1)
    My_CA410_1 = COMCA410(SHARP_Multi_BusRS232_init(id=3),1,0,id=3)

    Auto_VCOM_0.Auto_Vcom_Object=SHARP_Auto_Vcom(user_mode.DEBUG,SetVCOM_0,GetFlick_0)
    Auto_VCOM_1.Auto_Vcom_Object=SHARP_Auto_Vcom(user_mode.DEBUG,SetVCOM_1,GetFlick_1)

    task0 = _thread.allocate_lock()           #创建互斥锁
    task1 = _thread.allocate_lock()           #创建互斥锁


SHARP_user=User_Fun()
if __name__ == '__main__':
    user_mode.DEBUG("Enter Python OK !")

    try:
        SHARP_user.My_CA410_0.COMCA410_Cal0()        #校准镜头
        SHARP_user.My_CA410_1.COMCA410_Cal0()        #校准镜头
        print('410_1_zero OK\n')
        break
    except Exception as e:
        print("410_1_zero NG\r")

    task_start_time = user_mode.MeasureTimeStart_ms()

    SHARP_user.task0.acquire()                     #获取锁
    SHARP_user.task1.acquire()                     #获取锁

    #一拖多
    _thread.start_new_thread(AutoOTP_0,())          #启动线程
    _thread.start_new_thread(AutoOTP_1,())          #启动线程

    #一拖一
    # AutoOTP_0()
    # AutoOTP_1()

    while(SHARP_user.task0.locked()==True or SHARP_user.task1.locked()==True):        #等待锁释放
        user_mode.Delay_ms(1)

    print("Task Time : %.2f s" %(user_mode.GetMeasureTime_ms(task_start_time)/1000.0))