模仿老式拨盘电话机拨号原理拨号
总是有不少怀旧的人喜欢老电话,老相机,比如我,每次看到老上海的电话机,老香港的手提砖头块,总是会产生一种奇怪的感觉。
老话机每一个格就是一个脉冲,拨1就一个格,拨9就9个格,也就是能听到咔咔声9次。每个对应位置就接通一次脉冲,错过位置就断了,
下一个格又是一个脉冲,0就是10个脉冲。
这里只是在MTK做一些小尝试,非完整代码,请勿模仿。
#define DIAL_X (UI_device_width/2) #define DIAL_Y ((UI_device_height/2)+30) #define DIAL_R ((((UI_device_height>UI_device_width)?(UI_device_width/2):(UI_device_height/2)))) #define DIAL_IN_R (20) #define DIAL_COLOR (GDI_COLOR_BLACK) void my_gdi_draw_line(S32 x1, S32 y1, S32 x2, S32 y2, gdi_color line_color, S32 w) { mmi_pen_point_struct a[4]; S32 sinx; S32 cosx; S32 r; S32 tmp; tmp = sqrt(((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))); sinx = (int)(((y2-y1)*1000/(int)tmp)); cosx = (int)(((x2-x1)*1000/(int)tmp)); if (w >2) { r = w/2; a[0].x = x1 + (int)((r*sinx)/1000); a[0].y = y1 - (int)((r*cosx)/1000); a[1].x = x2 + (int)(((((r%2)!=0)?(r+1):r)*sinx)/1000); a[1].y = y2 - (int)(((((r%2)!=0)?(r+1):r)*cosx)/1000); a[2].x = x2 - (int)(((((r%2)!=0)?(r+1):r)*sinx)/1000); a[2].y = y2 + (int)(((((r%2)!=0)?(r+1):r)*cosx)/1000); a[3].x = x1 - (int)((r*sinx)/1000); a[3].y = y1 + (int)((r*cosx)/1000); gdi_draw_solid_polygon(a,4,DIAL_COLOR); } else { color c; c.r = (U8) ((0xFF000000 & line_color) >> 24); c.g = (U8) ((0x00FF0000 & line_color) >> 16); c.b = (U8) ((0x0000FF00 & line_color) >> 8); c.alpha = (U8) ((0x000000FF & line_color)); gui_wline(x1, y1, x2, y2, c, w); } } extern void my_gdi_draw_line(S32 x1, S32 y1, S32 x2, S32 y2, gdi_color line_color, S32 w); extern void my_gui_draw_anm_dial(void); void exit_myapp_screen(void) { if (buf_ptr != NULL) { med_free_ext_mem((void **)&buf_ptr); } if (my_layer2 != NULL) { gdi_layer_free(my_layer2); } InitDesktopScreen(); gui_cancel_timer(my_gui_draw_anm_dial); //GoBackHistory(); } void my_gui_draw_dial(U16 angle) { U8 i; char *t[] = {L"0", L"1",L"2", L"3", L"4",L"5", L"6", L"7", L"8", L"9", L"*", L"#", L"←", L"A", L"B", L"C"}; gdi_draw_circle(DIAL_X,DIAL_Y,DIAL_R,DIAL_COLOR); gdi_draw_circle(DIAL_X,DIAL_Y,(DIAL_R*618)/1000,DIAL_COLOR); gdi_draw_point(DIAL_X,DIAL_Y,DIAL_COLOR); gdi_draw_point(DIAL_X+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_cosine_table[angle],DIAL_Y+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_sine_table[angle],DIAL_COLOR); for (i = 0; i < 16; i++) { gdi_draw_circle(DIAL_X+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_cosine_table[((i*22)+angle)>=360?(((i*22)+angle)-360):((i*22)+angle)],DIAL_Y+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_sine_table[((i*22)+angle)>=360?(((i*22)+angle)-360):((i*22)+angle)],(DIAL_R*100)/1000,DIAL_COLOR); gui_move_text_cursor(DIAL_X+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_cosine_table[((i*22)+angle)>=360?(((i*22)+angle)-360):((i*22)+angle)]-5, DIAL_Y+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_sine_table[((i*22)+angle)>=360?(((i*22)+angle)-360):((i*22)+angle)]-5); gui_print_text((UI_string_type)t[i]); } } void my_gui_draw_anm_dial(void) { static U16 a = 0; gdi_layer_get_base_handle(&my_base_layer); gdi_layer_set_active(my_base_layer); gdi_layer_clear(GDI_COLOR_TRANSPARENT); my_gui_draw_dial(a); //UI_start_timer(100, my_gui_draw_anm_dial); gdi_layer_set_blt_layer(my_base_layer, my_layer2, NULL, NULL); gdi_layer_blt_previous(0, 0, UI_device_width - 1, UI_device_height - 1); a = a + 5; if (a >= 360) { a = 0; } gui_start_timer(100, my_gui_draw_anm_dial); } void entry_myapp_screen(void) { U8 *gui_buffer; BOOL isEnable; gdi_color base_color; mmi_pen_point_struct a[4]; U16 angle = 0; U8 i; ExitDesktopScreen(); //EntryNewScreen (MAIN_MENU_SCREENID,exit_myapp_screen,entry_myapp_screen, NULL); // gui_buffer = GetCurrGuiBuffer(MAIN_MENU_SCREENID); entry_full_screen(); gdi_layer_clear(GDI_COLOR_TRANSPARENT); gdi_layer_multi_layer_enable(); gdi_layer_create(0, 0, UI_device_width, UI_device_height, &my_layer2); gdi_layer_set_active(my_layer2); gdi_layer_clear_background(GDI_COLOR_TRANSPARENT); gdi_layer_set_source_key(TRUE, GDI_COLOR_TRANSPARENT); //draw handle a[0].x = DIAL_X; a[0].y = DIAL_Y; a[2].x = DIAL_X + (int)(((DIAL_R*618)/1000)*g_qj_gui_clock_acm_cosine_table[angle]); a[2].y = DIAL_Y + (int)(((DIAL_R*618)/1000)*g_qj_gui_clock_acm_sine_table[angle]); a[1].x = DIAL_X + (int)(DIAL_IN_R*g_qj_gui_clock_acm_cosine_table[((angle-42)>0?(angle-42):(angle-42+360))]); a[1].y = DIAL_Y + (int)(DIAL_IN_R*g_qj_gui_clock_acm_sine_table[((angle-42)>0?(angle-42):(angle-42+360))]); a[3].x = DIAL_X + (int)(DIAL_IN_R*g_qj_gui_clock_acm_cosine_table[((angle+42)<360?(angle+42):(angle+42-360))]); a[3].y = DIAL_Y + (int)(DIAL_IN_R*g_qj_gui_clock_acm_sine_table[((angle+42)<360?(angle+42):(angle+42-360))]); gdi_draw_polygon(a,4,DIAL_COLOR); gui_wline(a[0].x, a[0].y,a[2].x,a[2].y, UI_COLOR_GREEN,2); gui_wline(a[1].x, a[1].y,a[3].x,a[3].y, UI_COLOR_GREEN,2); //draw earphone //gdi_draw_circle(DIAL_X,DIAL_Y,UI_device_height/2+20,DIAL_COLOR); //my_gdi_draw_line(10, 20, 100, 50, DIAL_COLOR, 10); gdi_layer_get_base_handle(&my_base_layer); gdi_layer_set_active(my_base_layer); //draw dial #if 0 gdi_draw_circle(DIAL_X,DIAL_Y,DIAL_R,DIAL_COLOR); gdi_draw_circle(DIAL_X,DIAL_Y,(DIAL_R*618)/1000,DIAL_COLOR); gdi_draw_circle(DIAL_X,DIAL_Y,20,DIAL_COLOR); gdi_draw_point(DIAL_X,DIAL_Y,DIAL_COLOR); gdi_draw_point(DIAL_X+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_cosine_table[angle],DIAL_Y+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_sine_table[angle],DIAL_COLOR); for (i = 0; i < 16; i++) { gdi_draw_circle(DIAL_X+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_cosine_table[(i*22)],DIAL_Y+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_sine_table[(i*22)],(DIAL_R*100)/1000,DIAL_COLOR); gui_move_text_cursor(DIAL_X+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_cosine_table[(i*22)]-5, DIAL_Y+(int)((DIAL_R*809)/1000)*g_qj_gui_clock_acm_sine_table[(i*22)]-5); gui_print_text((UI_string_type)t[i]); } #else //gui_start_timer(100, my_gui_draw_anm_dial); //my_gui_draw_dial(90); my_gui_draw_anm_dial(); #endif gdi_layer_set_blt_layer(my_base_layer, my_layer2, NULL, NULL); gdi_layer_blt_previous(0, 0, UI_device_width - 1, UI_device_height - 1); SetKeyHandler(exit_myapp_screen, KEY_RSK, KEY_EVENT_UP); }
该文用到的三角形函数值数组请参阅拙作:
巧用数学函数生成函数表
http://blog.csdn.net/blogercn/archive/2011/03/28/6283278.aspx
模仿老式拨盘电话机拨号原理拨号相关推荐
- java调用bat脚本实现pppoe拨号_pppoe客户端自动拨号原理及实现
家庭上网大多采用ADSL拨号上网,很多人使用ADSL网络提供商的拨号软件,可这些软件广告太多,并且还公窃取你的上网习惯等信息,所以可以使用XP自带的拨号软件.一般的XP下ADSL拨号操作如下:开始-附 ...
- Cisco(PacketTracer) - PPPoE协议测试实验(ADSL拨号原理)
▶ PPPoE服务器配置: 路由器版本:Cisco Router 2811 PacketTracer版本: 5.3支持 7.2.2不支持 ▶ 拓扑图: ▶ 配置步骤: //开启VPDN en conf ...
- MT7628 OpenWRT21 SIM8202驱动ppp拨号rndis拨号
1.模块USB设备概述 使用MT7628通过USB连接SIM8202.SIM8202的VID是0x1e0e,PID9011.添加驱动后USB描述如下: 2.驱动调试使用场景 1.PPP拨号:只需要配置 ...
- 微信公众号菜单栏设置直接打电话拨号一键拨号
添加自定义菜单一键拨号方法: 1.后台关联小程序"小正方助手" 2.关联成功后即可创建菜单 1)菜单内容选择:跳转小程序 2)选择刚刚关联的"小正方助手" 3) ...
- RAS使用拨号网络拨号的类
前一段时间使用了Socket与远程PC进行UDP通讯,使用了一个RAS拨号类,与大家分享一下. 在使用下面的代码建立 TCP/IP 链接前,请断开 ActiveSync,否则会导致失败. 头文件:Ra ...
- php拨号接口,拨号网络对应的协议是什么
拨号网络对应的协议是PPPoE. PPPoE(英语:Point-to-Point Protocol Over Ethernet),以太网上的点对点协议,是将点对点协议(PPP)封装在以太网(Ether ...
- python拨号_python 拨号代码(win10 系统亲测有效)
# -*- coding: utf-8 -*- import win32ras import time,os def Connect(dialname, account, passwd): dial_ ...
- 树莓派 4G模块 PPP 拨号 NDIS 拨号
资料参考:树莓派使用4G模块(华为ME909s-821)亲身尝试的可行方法(上) 转载于:https://www.cnblogs.com/suozhang/p/8488008.html
- python pptp拨号_pptp拨号上网
一.软件 dkms..pptpd 二.下载软件 wget http://sourceforge.net/projects/poptop/files/mppe%20module%20builder/dk ...
最新文章
- 【 FPGA 】UltraFast设计方法学:时序约束
- 再学 GDI+[81]: TGPImage(1) - 显示图像
- python matplotlib散点图-python的matplotlib散点图
- 让AngularJS的$http 服务像jQuery.ajax()一样工作
- CVPR2016:Improving Person Re-identification via Pose-aware Multi-shot Matching
- bootstrap的td可以增加title样式_3.CSS样式的三种使用方式
- java多线程之:SynchronousQueue队列
- linux编码 form表单,Linux以form表单形式上传文件讲解
- 计算机公式or,【转载】 odds、OR和RR的计算公式和实际意义
- CentOS7安装ETCD
- 华润燃气各大区总经理_华润燃气“十四五”战略研讨会在华润大学小径湾校区举办...
- 如何保证进程间同步工作_系统设计硬核知识(2)——操作系统的进程管理
- 6)Thymelead th:with 局部变量 与 属性优先级 和 Thymeleaf 注释
- ◆谷歌热榜|百度中文搜索风云榜|Top 50
- 用C语言求和、找数组中的最大值以及求平均值
- java.lang.IllegalArgumentException 如何解决这个异常
- 使用Godaddy续费我的域名时遇到支付问题
- C 语言隐式类型转换
- 【BULL中文文档】用于在 NodeJS 中处理分布式作业和消息的队列包
- 量化交易框架开发实践(二)