当前位置: 首页 > news >正文

 一套莫尔斯电报听写、翻译系统

  单位来新人,惯例要先学三个月的莫尔斯报,由于训练软件是是十年前用MFC开发的,无法修改功能,且不兼容win7,经常有错误闪退,所以我写了一个简易的练习系统。从设计到完成一共用了七天左右时间,具备随机生成、考核、听写、翻译和中文译解功能,并可以控制报文类型,数量,速度,可以设置背景音乐和声音强度。

源码下载地址:https://github.com/gusuziyi/morse-train.git


 图片

图一:主界面


图片

 图二:支持五种报文


图片

 图三:随机生成20组字码


图片

 图四:点击听写,会按照设定速度发报,并可以设置背景杂音和杂音强度


图片

 图五:翻译功能,目前支持中文,大写英文,小写英文以及各种符号


图片

 图六:点击红色按钮,进行翻译


图片

 图七:翻译功能支持不同语言,大小写和各种符号同时输入



图片
    图八:翻译出的结果支持听写,发报时相应的元素会标红,就不会看串行了~

 


图片
            图九:反译功能能够把莫斯码反译成可理解的报文

 

API

均位于morse.js当中

Getmorse:(line9)用于生成各类型莫尔斯码,目前支持长码、短码、字码、混合码、勤务用语五种,可根据需要自行扩充

InitBtn:(line70)用于为页面中所有按钮赋予功能

goTranslate:(line221)翻译模块,首先判断是否有中文,无中文,使用混合码字典,有中文,则调用xmorse模块

artiTranslate:(line259)反译模块,判断是否只有 . 和 – 的莫尔斯码,是则反译成报文,不是则翻译成莫尔斯码

playBg:(line279)播放选定的背景音乐

closeBg:(line289)终止选定的背景音乐

async play:(line296)用于处理系统产生的 点、划、字、词等事件,决定如何播放和等待

playAudio:(line322)区分点、划进行播放调度

sleep:(line342)系统休眠,用于生成听写时的时间间隙

createTranslate:(line349)将翻译出的报文转译成系统可播放、识别的格式。思路是字符串转数组,数组元素包裹span插入dom,以实现跟随听写字符标红,摩斯码打碎成点划并加入byte、word等控制信息

createMessage:(line419)随机生成若干组报文,实现思路同上

initWidget:(line480)初始化widget,注意不要在widget内再封装widget,没有内部通信方法

playDot:(line532)为正弦波添加矩形滤波器后调制,在440hz上0.1秒内声音近似为点

playLine:(line567)同上,只是将包络时长设置为dot的三倍

 

 

总结:

  一、关于gulp,由于之前一直在学webpack,所以经常看到webpack和gulp相比较的文章,正好这次有这个需求,就尝试了一下gulp,使用体验就是很简单,用了二小时看了几篇文章就很熟练了,当然缺点也是简单,一些事情做不到,还有一些事情要用额外插件来做,配置起来很麻烦。比如这个程序里绝大部分使用es5语法,有一些[…]、promise、require之类的es6语法,还有await、async这种es7语法,而浏览器只认识es5,这就导致必须用babel转码,而babel在gulp需要手工配置,这是一个天坑。首先babel-core和 gulp-babel版本不能用最新的,会报错误找不到@babelcore,至少要退化两个以上的版本


    
图片
    图十:我使用的babel-core 和 gulp-babel版本

 

其次要支持es7,必须添加babel-plugin-transform-runtime,同时在.babelrc文件中添加对应的plugins

    图片

    图十一:支持es7 asyns的配置

 

你以为这就完了?transform-runtime会把regenerator转换成require,只是把es7转成了es6,可以在node上运行,但是想要用script直接引用还要添加gulp-browserify转成es5,注意顺序,要在babel()之后,在uglity()之前

    图片

     图十二:gulp-browserify的配置

 

  二 关于jQueryUi框架,页面使用了jQueryUi,也没多想,就是想试试没用过的东西,尝尝鲜,在菜鸟教程看了几篇文章大概半天上手,在思路上它是对dom元素进行widget初始化的方式来表现ui,但是这些widget屏蔽了外部通信事件,不容易找到解决方案,比如这个软件中,一开始我把背景杂音和背景强度封装在一个controlGroup当中,结果select的onchange事件居然失效了!震惊,后来不得不用css实现了controlGroup的样式。这个地方如果不熟悉的话坑会很多,所以我感觉没有bootstrap+jquery效率高,jQueryUi对我来说应该是浅尝辄止,以后不会再用了。

 
图片
    图十三:jQueryUi的初始化十分简单易懂


图片

 

图十四:select的change事件

 

  三 关于异步低速函数,以前在node里就是无限的回调函数嵌套,在es7中有了await和async这两个方法。

await和async就类似于回调嵌套,但声明他们的时候不会执行,如图十五和图十六中,tempI和play全是async函数,他们把任务不断细分,函数执行是在图十七和图十八中的playAudio和sleep函数,他们两个都是play中的分支任务,当他们返回new Promise时会执行自身。在内存中定义自己,而当setTimeOut运行之后返回的resolve会结束await状态,父函数play会继续执行,从而可以实现使用setTimeOut节拍来控制发报速度
    
图片
       图十五:tempI


图片

 图十六:tempI的子函数play


图片

 图十七:play的子函数playAudio


图片

 图十八:play的子函数sleep


图片

 图十九:gulp正确运行

 

  最后,关于使用开关取消promise链,控制播放与停止的思路:为开关添加isOn属性,点击时能控制isOn在true和false之间切换,然后在async play中监听此属性,若关闭,则抛出错误,如图二十一,然后在其父函数中catch这个错误,打印错误,如图二十。该方法的核心就是在子函数中监听全局变量,然后抛出错误给父函数进行处理。

图片

图二十:使用try-catch运行异步函数

图片

图二十一:子函数play中监听点击事件,抛出错误

 

源码下载地址:https://github.com/gusuziyi/morse-train.git

 

转载于:https://www.cnblogs.com/qmzy/p/9625523.html

相关文章:

  • linux系统挂载
  • vue的全局变量和全局拦截请求器
  • 微信小程序 - 输入起点、终点获取距离并且进行路线规划(腾讯地图)
  • 讨论微服务之前,你知道微服务的 4 个定义吗?
  • quick sort(重复数版)
  • 二层负载分担(一)
  • Material Design 实战 之第三弹—— 悬浮按钮和可交互提示(FloatingActionButton Snackbar CoordinatorLayout)...
  • WPF一步步实现完全无边框自定义Window(附源码)
  • 简单易懂的laravel事件,这个功能非常的有用(监听事件,订阅者模式)
  • express中间件系统的基本实现
  • iOS开发 适配iPhoneX/iPhoneXr/iPhoneXs/iPhonexs max
  • 互融云采购招标供应链系统:为供应链行业创造良好环境
  • 第一次作业
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • 大数据
  • 【Amaple教程】5. 插件
  • 【React系列】如何构建React应用程序
  • C++11: atomic 头文件
  • CentOS7简单部署NFS
  • ES6 ...操作符
  • GraphQL学习过程应该是这样的
  • Java比较器对数组,集合排序
  • Java方法详解
  • Koa2 之文件上传下载
  • Mithril.js 入门介绍
  • Quartz初级教程
  • Vue官网教程学习过程中值得记录的一些事情
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 笨办法学C 练习34:动态数组
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 简单数学运算程序(不定期更新)
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 我与Jetbrains的这些年
  • 学习笔记TF060:图像语音结合,看图说话
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​Java基础复习笔记 第16章:网络编程
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #include到底该写在哪
  • $.ajax()方法详解
  • (1)(1.11) SiK Radio v2(一)
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (Java数据结构)ArrayList
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)visual stdio 书签功能介绍
  • (转)原始图像数据和PDF中的图像数据
  • .NET Core 版本不支持的问题
  • .NET Core使用NPOI导出复杂,美观的Excel详解