4227|6

46

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

[ MicroPython DIY ] Wire Connecting State Detector 导线连接状态检测器(0) [复制链接]

 
  本帖最后由 中国罗宾鸟 于 2018-7-26 19:03 编辑
前期报名参加了两项活动("MicroPython 大作战"和"pyboardCN V2畅玩"),竟一直未来发帖分享,实在遗憾,今天特来补上,重在分享!

Wire Connecting State Detector导线连接状态检测器 -----

这是一个我很久以前想到的一个项目,由于工作性质的原因,经常需要对同事提交过来的有问题的线缆进行检测是哪里出了问题(当然,同事并不关心这个,重新给了一个新的线就走了),但面对各种各样的线缆和各种各样的接口,真是有心无力呀。于是便有了一个是否可以做一个可以检测各种接口的不同数量的线缆的设备的想法。通常线缆的连接故障状态有:断(开)路、短路、线序错误以及接触不良(时好时坏)。 本想用单片机+C语言实现,连外壳都准备好了,外观图也设计了一些。但由于种种原因,未能实现。现有趁着这次搞活动的机会,用MicroPython 来实现一把。

设计思路:
通过向一端发送信号,另一端接收信号,并比对发送信号与接收信号之间的关系是否与设定的一至即可进行判断,当发送端为1时,接收端为0则表示当前线路存在断路问题,如果接收端为1,且与当前端口对应的位置(如果是一一对应的话,就是1号端口对应1号端口)为1则为正常,若同时出现两个或以上为1,则为短路,若只在其它位置出现一个为1,则为线序错误。

产品设计:

  1. 功能设计

    • 通过接口转接器将RJ45网线与PyboardCN V2.0 排针连接
    • 使用SSD1306显示测试结果,如果通过,直接显示“PASS!”即可,如果出现问题,则直接显示问题报告界面,并可翻页查看,由于检测过程很短,几乎不超过1秒,所以显示的内容不一定能看得见(来不及反应);
    • 使用板载按钮进行控制,或外接一个按钮进行控制;
    • 测试流程:
      1. 打开电源
      2. 将与待测线对应的正常的线与接口连接,用于作为检测参考学习并记录(系统默认为一一对应模式,即若没有学习记录,则采用一一对应的方式进行检测);
      3. 长按按键3秒以上,进入学习状态,学习完成后显示一遍当前的学习结果,并将结果以文件的方式保存到板子上,掉电不丢失,学习完毕后回到待检测状态;
      4. 双击按键(短时间内快速边结按键两次)后开始检测,检测结束后,若检测通过,则在屏幕中央显示“PASS!”字样,若有问题,则会跳转到问题报告页面;
      5. 在问题报告页面,通过单击按键进行翻页(如果存在1页以上的话),若到达最后一页,再次单击,则会跳转到第一页再次循环。
  2. 模块组件:
    • PyboardCN V2.0 (固件信息:MicroPythonv1.9.4-114-g309fe39d on 2018-06-04; PYBv1.0 with STM32F405RG)
    • SSD1306 (I2C通讯)
    • 接口转接器
    • 网线(实测对象)

  1. 界面显示
    • 学习结果显示界面(暂无)
    • 问题报告显示
  2. 软件设计 代码部分主要分4个模块(线路检测模块、机械按键驱动模块、ssd1306驱动模块、OLED界面显示模块)外加一个检测调度文件组成,启动后由调度文件调度各模块进行分工合作。

最新回复

楼主什么时候搞好能不能发上来看看?  详情 回复 发表于 2018-7-28 13:36

赞赏

1

查看全部赞赏

点赞 关注(3)
 
 

回复
举报

46

帖子

1

TA的资源

一粒金砂(中级)

来自 6楼
 
本帖最后由 中国罗宾鸟 于 2018-8-15 11:23 编辑





本次主要更新以下内容:
1、增加菜单功能,通过菜单对测试过程进行操作;
2、增加测试与学习记录查看功能;
3、增加关于设备信息显示功能;
4、增加长按3秒以上恢复默认设置(学习记录恢复到一对一直连)功能,主要防止因误操作而修改了学习记录(设置参数);

扩展或升级方向:
1、将按键由当前的1个扩展为2个,操作更方便;
2、使用带WIFI或蓝牙功能的板子,可增加无线通讯功能,通过手机端直接对设置文件进行编辑,并可查看测试与学习记录;
3、将当前的学习和测试记录由1个扩展为更多。


正确的操作步骤:
1、将测试参考线缆接入检测口;
2、屏幕菜单上单击按键移动光标到“Studay“项,再双击按键,开始学习(扫描)并记录当前线缆的通断状态,学习完成之后将自动进入学习记录查看界面;
3、待界面中图标闪烁(通常只闪烁3次)停止后再单击按键翻页查看学习记录,确认学习结果与当前线缆一致。当到达末页后继续单击按键将会自动回到首页开始;
4、待界面中图标闪烁(通常只闪烁3次)停止后再双击按键退出当前界面,回到菜单界面;
5、更换线缆为待测线缆;
6、单击按键移动光标到”TEST“项,再双击按键,开始对当前线缆进行测试,若结果与学习记录一致,则在屏幕显示“PASS’文字,3秒后返回菜单界面,若不一致,则会自动进入测试记录查看界面;
7、测试记录提查阅与退出方式与学习记录一致。同时测试记录给出了问题线号与问题原因("Open circuit!":开路、"Short circuit!":短路、"Wrong order!":线序错误);
8、移动光标到”VIEW“菜单,双击按键进入,通过单击和双击操作,可在些分别进入、查看和退出测试记录与学习记录。

备注:
1、若参考线缆为1对1 直接连接的线缆,则可以通过长按按键3秒以上,直接设置,无需再进行学习操作;
2、在接入待测线缆后,请勿进行学习操作,否则无法检测出问题;
3、在记录查看过程中,若上方图标在闪烁过程中,则此时操作按键将会无反应(闪烁语句中使用的是sleep_ms());
4、由于每个人的手速不一样,按键单击、双击间隔时间可自行调整。
当前代码已全部调整完成,可正常使用。部分功能可以继续优化。
本准备在启动时增加启动LOGO的,但由于对OLED图片显示功能还没搞懂,所以暂放下。

主菜单


记录查看菜单


测试记录显示界面


学习记录显示界面


关于信息界面




屏幕显示界面

  1. # -*- coding:UTF-8 -*-

  2. '''
  3. MIT License
  4. Copyright (c) 2018 Robin Chen
  5. Permission is hereby granted, free of charge, to any person obtaining a copy
  6. of this software and associated documentation files (the "Software"), to deal
  7. in the Software without restriction, including without limitation the rights
  8. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. copies of the Software, and to permit persons to whom the Software is
  10. furnished to do so, subject to the following conditions:
  11. The above copyright notice and this permission notice shall be included in all
  12. copies or substantial portions of the Software.
  13. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  14. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  15. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  16. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  17. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  18. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  19. SOFTWARE.
  20. '''

  21. '''
  22. ******************************************************************************
  23. * 文  件:GUI.py
  24. * 概  述:当前模块主要用于OLED(SSD1306)屏画面显示。
  25. * 版  本:V0.10
  26. * 作  者:Robin Chen
  27. * 日  期:2018年7月26日
  28. * 历  史: 日期             编辑           版本         记录
  29.           2018年7月26日    Robin Chen      V0.10       创建文件
  30. `
  31. ******************************************************************************'''
  32. from machine import Pin, I2C
  33. from ssd1306 import SSD1306_I2C
  34. from time import sleep_ms
  35. i2c = I2C(scl= Pin("C2"), sda= Pin("C3"))
  36. oled = SSD1306_I2C(128, 64, i2c)

  37. oled.text("Hellow MicroPython!", 0, 30)
  38. oled.show()
  39. sleep_ms(1000)
  40. oled.fill(0)
  41. oled.show()

  42. '''*************************************************************************
  43. * 功   能:图示显示
  44. * 说   明:报告(包括问题报告与学习报告)界面图示显示。
  45. * 输入参数:
  46.           x: 横坐标
  47.           y: 纵坐标
  48.           l: 显示图形的二进制制编码,通常用16进制形式表示。
  49. * 输出参数:None
  50. * 返 回 值:True
  51. **************************************************************************'''
  52. def dhView(x, y, l):
  53.     l = int(l)    # 将字符串型16进制数转换为整型16进制数
  54.     # ll = list(bin(1 << 8 | l)[3:])[::-1]
  55.     ll = bin(1 << 8 | l)[3:]
  56.     #print('ll = ',ll)
  57.     oled.framebuf.fill_rect(x, y, 108, 8, 0)
  58.     for i in range(8):
  59.         if ll[i] == '1':
  60.             oled.framebuf.fill_rect((x + 14 * i), y, 8, 8, 1)
  61.         else:
  62.             oled.framebuf.rect((x + 14 * i), y, 8, 8, 1)
  63.     oled.show()

  64. '''*************************************************************************
  65. * 功   能:报告显示
  66. * 说   明:根据提供的参数,判断当前当部属于哪种类型,并返回错误提示。
  67. * 输入参数:
  68.           l1: 源线号,整型值,1~8
  69.           l2: 待测线路显示位,二进制处理,16进制表示。
  70.           x:  图形区域的起始位置x坐标
  71.           y:  图形区域的起始位置y坐标
  72.           cont: 位置图示闪烁次数,为 -1 时一直闪烁,为 0 时不闪烁。
  73. * 输出参数:None
  74. * 返 回 值:True
  75. **************************************************************************'''
  76. def oledFlash(l1, l2, x=20, y=0, cont = 1):
  77.     n = 128 >> (int(l1) - 1)
  78.     oled.framebuf.fill_rect(0, 0, 128, 35, 0)
  79.     oled.text("S:", 0, y)
  80.     oled.text("T:", 0, (y+14))
  81.     oled.framebuf.hline(0, (y + 26), 128, 1)
  82.     while cont:
  83.         dhView(x, y, 0x00)
  84.         dhView(x, (y + 14), 0x00)
  85.         sleep_ms(500)
  86.         dhView(x, y, n)
  87.         dhView(x, (y + 14), l2)
  88.         sleep_ms(500)
  89.         cont -= 1


  90. '''*************************************************************************
  91. * 名    称:问题信息显示
  92. * 说    明:显示错误信息(线路号和故障原因(开路、短路、错序))
  93. * 输入参数:
  94.           znum:总页数
  95.           nonum:当前页码
  96.           err:错误内容
  97.           _line:线号
  98. * 输出参数:None
  99. * 返 回 值:True
  100. **************************************************************************'''
  101. def viewReportText(strTitle, strR1, strR2):
  102.     oled.framebuf.fill_rect(0, 35, 128, 29, 0)
  103.     oled.text(strTitle, 0, 35)
  104.     oled.text(strR1, 10, 45)
  105.     oled.text(strR2, 10, 56)
  106.     oled.show()



  107. '''*************************************************************************
  108. * 名    称:菜单显示与处理
  109. * 说    明:在屏幕上显示菜单,并根据按键的操作来显示不同的菜单界面。
  110. * 输入参数:
  111.          _lmenu:菜单内容,tule格式,0位为菜单标题。
  112.          _gb: 光标所在行号,默认为None(不显示)。
  113. * 输出参数:None
  114. * 返 回 值:True
  115. **************************************************************************'''
  116. def oledView(_lmenu, _gb = None):
  117.     oled.fill(0)
  118.     oled.text(_lmenu[0], ((128 - (len(_lmenu[0])*8)) // 2), 5)
  119.     oled.framebuf.hline(0, 20, 128, 1)
  120.     for i in range(len(_lmenu))[1:]:
  121.         oled.text(_lmenu[i], ((128 - (len(_lmenu[i])*8)) // 2), (i*10+15))
  122.     if _gb != None:
  123.         if _gb == 0:
  124.             _gb += 1
  125.         oled.text(">", (((128 - (len(_lmenu[_gb])*8)) // 2) - 16), (_gb * 10 + 15))
  126.         oled.text("<", (((128 - (len(_lmenu[_gb]) * 8)) // 2) + (len(_lmenu[_gb]) * 8) + 8), (_gb * 10 + 15))
  127.     oled.show()


  128. '''*************************************************************************
  129. * 名    称:报告显示与翻页效果
  130. * 说    明:在报告页面按下翻页按钮后,报告将向后轮循翻页,同时适用检测报告与学习报告
  131. * 输入参数:
  132.          _drReport:报告内容,包含线号、报告内容、报告说明。格式为:((linenumber,0x00, "note"), (linenumber,0x00, "note"),...)
  133.          _gb: 报告页码,整型,值为 1~ max
  134.          ty:报告类型,字符串型,通常为 'ERR' 或 'STU'
  135. * 输出参数:None
  136. * 返 回 值:None
  137. **************************************************************************'''
  138. def repView(_drReport, _gb, ty = 'ERR'):
  139.     l1 = _drReport[_gb][0]
  140.     l2 = _drReport[_gb][1]
  141.     strTitle = ty + ' ' + str(len(_drReport)) + '-' + str(_gb + 1) + '     >>'
  142.     strR1 = 'Line ' + str(_drReport[_gb][0])
  143.     strR2 = _drReport[_gb][2]
  144.     viewReportText(strTitle, strR1, strR2)
  145.     oledFlash(l1, l2, cont=3)
  146.     return True




复制代码



测试主模块

  1. # -*- coding:UTF-8 -*-

  2. '''
  3. MIT License
  4. Copyright (c) 2018 Robin Chen
  5. Permission is hereby granted, free of charge, to any person obtaining a copy
  6. of this software and associated documentation files (the "Software"), to deal
  7. in the Software without restriction, including without limitation the rights
  8. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. copies of the Software, and to permit persons to whom the Software is
  10. furnished to do so, subject to the following conditions:
  11. The above copyright notice and this permission notice shall be included in all
  12. copies or substantial portions of the Software.
  13. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  14. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  15. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  16. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  17. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  18. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  19. SOFTWARE.
  20. '''

  21. '''
  22. ******************************************************************************
  23. * 文  件:wiretest.py
  24. * 概  述:当前模块主要用于线路检测,并返回检测结果。
  25. * 版  本:V0.10
  26. * 作  者:Robin Chen
  27. * 日  期:2018年7月26日
  28. * 历  史: 日期             编辑           版本         记录
  29.           2018年7月26日    Robin Chen      V0.10       创建文件
  30. `
  31. ******************************************************************************'''
  32. from time import sleep_ms

  33. class WIRETEST:
  34.     def __init__(self, _lIN, _lOUT):
  35.         self.lin = _lIN
  36.         self.lout = _lOUT

  37.         # 接收端初始化,注意,如果实际电路中使用了外部下拉或芯片内部无内部下拉,请取消此处的下拉声明。
  38.         for i in self.lin:
  39.             i.init(i.IN, i.PULL_DOWN)

  40.         # 发送端初始化
  41.         for o in self.lout:
  42.             o.init(o.OUT)
  43.             o.value(0)

  44.     '''*************************************************************************
  45.     * 功   能:线路扫描
  46.     * 说   明:给线路一端加高电平,检测另一端是高电平还是低电平。
  47.     * 输入参数:
  48.                 _filName: 文件名
  49.     * 输出参数:None
  50.     * 返 回 值:
  51.     *          lScan : 扫描结果,16进制形式的 tule。
  52.     **************************************************************************'''
  53.     def doScan(self, _filName = None):
  54.         lScan2 = ()
  55.         bLab = 0
  56.         while True:
  57.             lScan = ()
  58.             for o in self.lout:
  59.                 o.value(1)
  60.                 iValue = 0
  61.                 for i in self.lin:
  62.                     iValue = (iValue << 1) | i.value()
  63.                 lScan += (hex(iValue),)
  64.                 o.value(0)
  65.             sleep_ms(10)

  66.             # 重复扫描连续5次结果一致算通过,否则重新计数,直到满足条件为止。
  67.             if lScan == lScan2:
  68.                 bLab += 1
  69.             else:
  70.                 bLab = 0
  71.             if bLab > 5:
  72.                 if _filName == None:
  73.                     return lScan
  74.                 else:
  75.                     # 将扫描记录写入指定的文件
  76.                     sep = ','
  77.                     f = open(_filName, 'w')
  78.                     f.write(sep.join(lScan))
  79.                     f.close()
  80.                 break
  81.             lScan2 = lScan
  82.         return True


  83.     '''*************************************************************************
  84.     * 功   能:检测线路状态
  85.     * 说   明:
  86.     * 输入参数:None
  87.     * 输出参数:None
  88.     * 返 回 值:True
  89.     **************************************************************************'''
  90.     def doTest(self):
  91.         tuResult=()   # 错误信息元组格式
  92.         lmemory = self.getLog("LineSequence.stu")
  93.         #print('文件中提取得到的线序:', lmemory)
  94.         lLineSeq = self.doScan()
  95.         #print("待测线缆扫描结果(线序):", lLineSeq)
  96.         if lmemory == lLineSeq:
  97.             return True, tuResult
  98.         else:
  99.             for j in range(len(lLineSeq)):
  100.                 if lLineSeq[j] != lmemory[j]:
  101.                     if lLineSeq[j] == '0x0':  # 开(断)路
  102.                         strErr = "Open circuit!"
  103.                     elif lLineSeq[j] != '0x0' and not (lLineSeq[j] in lmemory):  # 短路
  104.                         strErr = "Short circuit!"
  105.                     elif lLineSeq[j] != '0x0' and (lLineSeq[j] in lmemory):  # 错序
  106.                         strErr = "Wrong order!"
  107.                     tuResult = tuResult + ((j+1, lLineSeq[j], strErr),)  # 结果中有问题的序号+内容组成的字典
  108.             return False, tuResult

  109.     '''*************************************************************************
  110.     * 功   能:获取学习记录文件内容
  111.     * 说   明:
  112.     * 输入参数:
  113.                _filName: 记录文件名
  114.     * 输出参数:None
  115.     * 返 回 值:
  116.                temp:记录内容,元组。
  117.     **************************************************************************'''
  118.     def getLog(self, _filName):
  119.         f = open(_filName, 'r')
  120.         temp = f.readline()
  121.         f.close()
  122.         temp = tuple(temp.split(','))
  123.         return temp


  124.     '''*************************************************************************
  125.     * 功   能:恢复默认设置
  126.     * 说   明:将当前设置文件恢复到初始状态(1对1直连)
  127.     * 输入参数:
  128.                _filName: 记录文件名
  129.     * 输出参数:None
  130.     * 返 回 值:None
  131.     **************************************************************************'''
  132.     def setDefault(self, _filName):
  133.         temp = ('0x80', '0x40', '0x20', '0x10', '0x8', '0x4', '0x2', '0x1')
  134.         sep = ','
  135.         f = open(_filName, 'w')
  136.         f.write(sep.join(temp))
  137.         f.close()
  138.         return True
复制代码



测试调度与菜单操作模块

  1. # -*- coding:UTF-8 -*-

  2. '''
  3. MIT License
  4. Copyright (c) 2018 Robin Chen
  5. Permission is hereby granted, free of charge, to any person obtaining a copy
  6. of this software and associated documentation files (the "Software"), to deal
  7. in the Software without restriction, including without limitation the rights
  8. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. copies of the Software, and to permit persons to whom the Software is
  10. furnished to do so, subject to the following conditions:
  11. The above copyright notice and this permission notice shall be included in all
  12. copies or substantial portions of the Software.
  13. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  14. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  15. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  16. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  17. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  18. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  19. SOFTWARE.
  20. '''

  21. '''******************************************************************************
  22. * 文  件:testline.py
  23. * 概  述:当前模块主要用于测试调用调用相关模块或程序完成相应动作。
  24. * 版  本:V0.10
  25. * 作  者:Robin Chen
  26. * 日  期:2018年7月26日
  27. * 历  史: 日期             编辑           版本         记录
  28.           2018年7月26日    Robin Chen      V0.10       创建文件

  29. ******************************************************************************'''
  30. from wiretest import WIRETEST
  31. from GUI import *
  32. from machine import Pin
  33. from pyb import Timer
  34. from time import sleep_ms
  35. from keyboard import KEYBOARD

  36. lin = (Pin('C1'), Pin('C0'), Pin('C13'), Pin('C5'), Pin('C4'), Pin('A6'), Pin('A5'),  Pin('A4'))
  37. lout = (Pin('A13'), Pin('A14'), Pin('A15'), Pin('B4'), Pin('B1'), Pin('B0'), Pin('B12'), Pin('B9'))
  38. wt = WIRETEST(lin, lout)

  39. # 按键引脚
  40. p = Pin('B3')

  41. # 定时器,按键时钟使用
  42. s = Timer(1)

  43. # 经过处理的测试记录
  44. tuTest = ()

  45. # 经过处理的学习记录
  46. tuStu = ()

  47. bLab = 0         # 按键点击状态标志字
  48. guangbiao = 1    # 光标位置计数


  49. # 菜单的字典格式
  50. diMenu = {'WCSD': ('WCSD MENU', 'TEST', 'STUDAY', 'VIEW', 'ABOUT'), 'VIEW': ('VIEW MENU', 'TEST LOG', 'STUDAY LOG', 'BACK'), 'ABOUT': ('ABOUT', '', 'Wire Connecting', 'State Detector', 'V 1.00')}

  51. # 主菜单与子菜单标题元组
  52. lMenu = ('WCSD', 'VIEW', 'ABOUT')

  53. # 主菜单标题
  54. menu = diMenu['WCSD']

  55. # 学习函数
  56. def stu():
  57.     doView("Studaying...", 10, 30)
  58.     wt.doScan("LineSequence.stu")
  59.     doReportGo('STULOG')
  60.     return True

  61. # 测试函数
  62. def test():
  63.     global tuTest
  64.     tuTest = ()
  65.     doView('Test Start....', 10, 30)
  66.     bTets, tuTest = wt.doTest()
  67.     if not bTets:
  68.         sleep_ms(3000)
  69.         return False
  70.     else:
  71.         doView("PASS!!!.", 10, 30)
  72.         sleep_ms(3000)
  73.         return True

  74. # 长按按键事件
  75. def evn_long():
  76.     global bLab
  77.     bLab = 3

  78. # 在指定位置显示文字
  79. def doView(text, x, y):
  80.     oled.fill(0)
  81.     oled.text(text, x, y)
  82.     oled.show()

  83. # 连续点击事件
  84. def evn_con(con):
  85.     global bLab
  86.     if con == 1:
  87.         bLab = 1
  88.     elif con == 2:
  89.         bLab = 2


  90. '''
  91. *************************************************************************
  92. * 名    称:报告显示与查阅
  93. * 说    明:
  94. * 输入参数:
  95.          sta:报告阅读状态标志字,通常为 TESTLOG:测试报告    STULOG: 学习报告(记录)
  96. * 输出参数:None
  97. * 返 回 值:None
  98. **************************************************************************'''
  99. def doReportGo(sta):
  100.     global bLab, tuStu
  101.     mjs = 0
  102.     bLab = 0
  103.     if sta == 'TESTLOG':
  104.         if tuTest == ():
  105.             doView("No have Log!", 10, 30)
  106.             sleep_ms(3000)
  107.         else:
  108.             repView(tuTest, mjs % len(tuTest), ty='ERR')
  109.     elif sta == 'STULOG':
  110.         tuStu = ()
  111.         tempStu = wt.getLog("LineSequence.stu")
  112.         for i in range(len(tempStu)):
  113.             tuStu = tuStu + ((i + 1, tempStu[i], ''),)
  114.         if tuStu == ():
  115.             doView("No have Log!", 10, 30)
  116.             sleep_ms(3000)
  117.         else:
  118.             repView(tuStu, mjs % len(tuStu), ty='STU')
  119.     while True:
  120.         if bLab == 1:
  121.             mjs += 1
  122.             if sta == 'TESTLOG':
  123.                 repView(tuTest, mjs % len(tuTest), ty='ERR')
  124.             elif sta == 'STULOG':
  125.                 repView(tuStu, mjs % len(tuStu), ty='STU')
  126.             bLab = 0
  127.         elif bLab == 2:
  128.             bLab = 0
  129.             break


  130. sw = KEYBOARD(p, s, 0, evn_long, evn_con, "UP")
  131. oledView(menu, 1)
  132. menuLab = 'MENU'
  133. tuStu = wt.getLog("LineSequence.stu")
  134. while True:
  135.     if bLab == 1:    # 检测到按钮当前单击
  136.         if menu[0] != 'ABOUT':
  137.             # 光标循环处理
  138.             guangbiao = (guangbiao + 1)%len(menu)
  139.             if guangbiao == 0:
  140.                 guangbiao = 1
  141.             oledView(menu, guangbiao)
  142.         bLab = 0
  143.         #oledMenu(menunum, guangbiao)
  144.     elif bLab == 2:
  145.         if menu[guangbiao] in lMenu:               # 如果当前菜单项下有子菜单
  146.             menu = diMenu[menu[guangbiao]]
  147.             if menu[0] == "ABOUT":
  148.                 oledView(menu)
  149.             else:
  150.                 guangbiao = 1
  151.                 oledView(menu, guangbiao)
  152.         else:
  153.             if menu[guangbiao] == 'TEST':           # 测试问题线路
  154.                 test()
  155.                 menuLab = 'TESTLOG'
  156.                 if tuTest:
  157.                     doReportGo(menuLab)
  158.                 menuLab = 'MENU'
  159.             elif menu[guangbiao] == 'STUDAY':       # 学习、记忆标准线路
  160.                 stu()
  161.                 menuLab = 'STULOG'
  162.                 if tuStu:
  163.                     doReportGo(menuLab)
  164.                 menuLab = 'MENU'
  165.             elif menu[guangbiao] == 'TEST LOG':     # 查看测试报告
  166.                 # 此处由代码演示按钮翻页效果
  167.                 menuLab = 'TESTLOG'
  168.                 if tuTest:
  169.                     doReportGo(menuLab)
  170.                 else:
  171.                     doView("No have Log!", 10, 30)
  172.                     sleep_ms(3000)
  173.                 menuLab = 'MENU'
  174.             elif menu[guangbiao] == 'STUDAY LOG':    # 查看学习记录
  175.                 menuLab = 'STULOG'
  176.                 if tuStu:
  177.                     doReportGo(menuLab)
  178.                 else:
  179.                     doView("Studaying...", 10, 30)
  180.                 menuLab = 'MENU'
  181.             elif menu[guangbiao] == 'BACK':          # 返回上一层菜单
  182.                 menu = diMenu[lMenu[0]]
  183.                 guangbiao = 3
  184.             else:
  185.                 menu = diMenu[lMenu[0]]
  186.             oledView(menu, guangbiao)
  187.         bLab = 0
  188.     # 为防止误操作将已学习的记录覆盖或损坏,在此增加长按3秒恢复默认设置(即一对一直连模式)
  189.     elif bLab == 3:
  190.         print("开始恢复默认设置!")
  191.         wt.setDefault("LineSequence.stu")
  192.         print("当前设置已恢复默认设置!")
  193.         doView("Default Seted!...", 10, 30)
  194.         sleep_ms(1500)
  195.         bLab = 0
复制代码








 
 
 

回复

1903

帖子

0

TA的资源

版主

沙发
 
分享的很不错,点个赞

点评

谢谢版主,只是代码还没调整好,给大家的阅读增添难度了。  详情 回复 发表于 2018-7-27 09:18
 
 
 

回复

46

帖子

1

TA的资源

一粒金砂(中级)

板凳
 
star_66666 发表于 2018-7-26 21:19
分享的很不错,点个赞

谢谢版主,只是代码还没调整好,给大家的阅读增添难度了。
 
 
 

回复

1903

帖子

0

TA的资源

版主

4
 
整理一下就好了
 
 
 

回复

19

帖子

1

TA的资源

一粒金砂(中级)

5
 
楼主什么时候搞好能不能发上来看看?

点评

已经搞好了。  详情 回复 发表于 2018-8-20 17:27
 
 
 

回复

46

帖子

1

TA的资源

一粒金砂(中级)

7
 
风语者之哥 发表于 2018-7-28 13:36
楼主什么时候搞好能不能发上来看看?

已经搞好了。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表