查看: 3713|回复: 2

【SAM-4S Xplained手记】从一幅漫画想到的

  [复制链接]
  • TA的每日心情
    郁闷
    2024-10-28 10:11
  • 签到天数: 1703 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2013-2-5 14:19:17 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 nemon 于 2013-2-5 16:32 编辑

    记得小学时,语文考试最后一题的作文一般是看图说话,最常出的作文题是《从XXXX想到的》,今天我们从这幅漫画开始。
    Internet_dog.jpg


    这是《纽约客》漫画家Peter Steiner于1993年7月5日发表的作品,这幅漫画的标题估计尽人皆知:“在互联网上,没人知道你是一条狗”。这则漫画体现了一种对互联网的理解,强调用户能够以一种不透露个人信息的方式来发送或接受信息的能力,可以说是对互联网时代隐私的一种社会学探讨。每当我看到这幅画,就会想起这样一种测试——测试时如果一个人(代号C)使用测试对象皆理解的语言去询问两个他不能看见的对象任意一串问题。对象为:一个是正常思维的人(代号B)、一个是机器(代号A)。如果经过若干询问以后,C不能得出实质的区别来分辨A与B的不同,则此机器A通过测试。这个测试叫做……是滴,图灵测试。不过很不幸,图灵的死,却是因为当时的英国很容不下他很隐私的一些取向。(以上文字引用了wikipedia中 内容 )图灵有多强,大家都知道。关于某著名水果公司的标志是不是向图灵致敬的问题,那位已故的老大解释说"It isn't true, but God, we wish it were."今天我们就做这件连jobs都没能做的事,方式很简单,实现一个图灵机。
    图灵机的定义很抽象,所以我们先来通俗的解释一下要做的到底是个啥玩意。
    假如有这么一台机器,你把一条分成一格一格的写着字的纸带作为输入给它,它根据机器本身的状态(由之前的输入决定)和读写头输入纸带当前格子里的值,按照预先输入的规则来决定做什么操作(可以是改写当前纸带上的内容、向前或后移动读写头、输出一个字),那么这套机器就是一个图灵机了。我们把这个定义再具体化一点:
    1】输入纸带上只有3种子符:0、1、E;
    2】输出纸带上只有2种子符:0、1;
    3】规则定义为以下格式
    q w q1 w1 d
    或q w q1 w1 d e
    其中:q为输入纸带当前格子里的值,w为机器本身的状态号,q1向输入纸带当前格子里写的值,w1为机器本步执行完后的状态号,d为读写头移动的方向(+为向后、-为向前、0为不动),e为输出的值。
    那么对于任意一个以E结尾的输入纸带,下面的规则库就是输出E之前的0、1组成的序列表示的二进制数的奇偶:
    1. 1 0 1 0 +
    2. 1 1 1 1 +
    3. 1 e 2 e -
    4. 2 1 3 1 0 1
    5. 2 0 3 0 0 0
    复制代码
    用SAM-4S Xplained实现后,我们在串口做的控制台上实验一下:
    首先显示菜单:
    2013-02-05_134637_00003.png
    然后,按1选择输入一条规则:
    2013-02-05_135338_00005.png
    输入第一条规则,以@作为输入结束的标识符:
    2013-02-05_135353_00006.png
    照此把其余几条规则都输入:
    2013-02-05_135427_00007.png
    然后按2全部显示出来,注意这里看到的已经是内部代码表示了:
    2013-02-05_135440_00008.png
    然后按5,选择录入输入纸带:
    2013-02-05_135456_00009.png
    输入纸带的内容我们定义成"10111e@",注意是以@结尾的6位,但其中只有5位是数字:
    2013-02-05_135502_00010.png
    然后按8显示输入纸带的内容,检查一下:
    2013-02-05_135510_00011.png
    这时候,按7,可以看到初始化的输出纸带,上面全是0:
    2013-02-05_135526_00012.png
    然后,按6,运行程序,可以看到调试信息,也就是每一步用到的规则:
    2013-02-05_135550_00014.png
    最后,再次选7,看输出纸带:
    2013-02-05_135601_00015.png
    哇,10111e的个位数还真的是1,好神奇啊。
    那么,这个神奇的功能之如何实现的呢?上代码!
    首先是头文件:
    1. /*
    2. * turing.h
    3. *
    4. * Created: 2013-2-1 18:32:23
    5. *  Author: Nemon
    6. */
    7. #ifndef TURING_H
    8. #define TURING_H

    9. #define BUFF_IN_SIZE  4 //输入纸带长,实际可容纳的字符数是 (BUFF_IN_SIZE*sizeof(unsignd char))/2-2 (每个字符占2位,头、尾为“E”)
    10. #define BUFF_OT_SIZE  4 //输出纸带长
    11. #define PATTERN_SIZE 64 //规则库大小(由q+w决定) 1<<(sizeof(q)+sizeof(w))=1<<(4+2)=64

    12. #define SHEFT_NONE  0 //输入读写头不动 00
    13. #define SHEFT_LEFT  2 //输入读写头左移 10
    14. #define SHEFT_RIGHT 3 //输入读写头右移 11

    15. #define TOKEN_E  0 //信号“E” 00
    16. #define TOKEN_0  2 //信号“0” 10
    17. #define TOKEN_1  3 //信号“1” 11

    18. #define CMD_WRITE 1 // 有输出
    19. #define CMD_NOOUT 0 // 无输出


    20. //规则 q,w,q1,w1,d,e :q[4],w[2],q1[4],w1[2],d[3],e[1]=[16]
    21. // q : 1111 00 0000 00 000 0 : 0x0f << 12
    22. // w : 0000 11 0000 00 000 0 : 0x03 << 10
    23. // q1: 0000 00 1111 00 000 0 : 0x0f <<  6
    24. // w1: 0000 00 0000 11 000 0 : 0x03 <<  4
    25. // d : 0000 00 0000 00 111 0 : 0x07 <<  1
    26. // e : 0000 00 0000 00 000 1 : 0x01 <<  0

    27. // 规则各位的掩码
    28. #define MASK_PATTERN_q  0x0f << 12
    29. #define MASK_PATTERN_w  0x03 << 10
    30. #define MASK_PATTERN_q1 0x0f <<  6
    31. #define MASK_PATTERN_w1 0x03 <<  4
    32. #define MASK_PATTERN_d  0x07 <<  1
    33. #define MASK_PATTERN_dh 0x03 <<  2
    34. #define MASK_PATTERN_dl 0x01 <<  1
    35. #define MASK_PATTERN_e  0x01 <<  0

    36. //获取规则内容的宏
    37. #define GET_PATTERN_q(x)  (((x)&MASK_PATTERN_q )>>12)
    38. #define GET_PATTERN_w(x)  (((x)&MASK_PATTERN_w )>>10)
    39. #define GET_PATTERN_q1(x) (((x)&MASK_PATTERN_q1)>> 6)
    40. #define GET_PATTERN_w1(x) (((x)&MASK_PATTERN_w1)>> 4)
    41. #define GET_PATTERN_d(x)  (((x)&MASK_PATTERN_d )>> 1)
    42. #define GET_PATTERN_dh(x) (((x)&MASK_PATTERN_dh)>> 2)
    43. #define GET_PATTERN_dl(x) (((x)&MASK_PATTERN_dl)>> 1)
    44. #define GET_PATTERN_e(x)  (((x)&MASK_PATTERN_e )>> 0)

    45. //翻译为规则的宏
    46. #define MACRO_PATTERN(q,w,q1,w1,dh,dl,e)  \
    47. ( (((q ) &0x0f)<<12)    \
    48. | (((w )&0x03)<<10)    \
    49. | (((q1)&0x0f)<< 6)    \
    50. | (((w1)&0x03)<< 4)    \
    51. | (((dh)&0x03)<< 2)    \
    52. | (((dl)&0x01)<< 1)    \
    53. | (((e )&0x01)<< 0)    \
    54. )

    55. //翻译为输入纸带的宏
    56. #define MAKE_INPUT_TIE(c1,c2,c3,c4) (((c1)<<6)|((c2)<<4)|((c3)<<2)|((c4)<<0))

    57. //翻译为“无输出的规则”或“有输出的规则”的宏
    58. #define MACRO_PATTERN_DOIT(q,w,q1,w1,d)   MACRO_PATTERN(q,w,q1,w1,d,CMD_NOOUT,0)
    59. #define MACRO_PATTERN_DOUT(q,w,q1,w1,d,e) MACRO_PATTERN(q,w,q1,w1,d,CMD_WRITE,e)

    60. //int turing();
    61. /*
    62. INPUT:
    63. //输入纸带
    64. unsigned char v_uc_input[BUFF_IN_SIZE];
    65. unsigned long v_ul_input_length;
    66. //输出纸带
    67. unsigned char v_uc_output[BUFF_OT_SIZE];
    68. unsigned long v_uc_output_length;
    69. //规则库 q,w,q1,w1,d,e :q[4],w[2],q1[4],w1[2],d[3],e[1]=[16]
    70. // q:={1~15}
    71. unsigned short v_ui_patterns[PATTERN_SIZE];
    72. unsigned long  v_ui_patterns_length;

    73. OUPUT:
    74. //输出纸带的长度
    75. unsigned int  
    76. */
    77. unsigned int RunTuring( unsigned char * v_uc_input , unsigned long v_ul_input_length , unsigned char * v_uc_output , unsigned long v_uc_output_length , unsigned short * v_ui_patterns , unsigned long  v_ui_patterns_length );

    78. #endif //TURING_H
    复制代码
    然后是图灵机的执行逻辑:
    1. #include "turing.h"
    2. /*
    3. INPUT:
    4. //输入纸带
    5. unsigned char v_uc_input[BUFF_IN_SIZE];
    6. unsigned long v_ul_input_length;
    7. //输出纸带
    8. unsigned char v_uc_output[BUFF_OT_SIZE];
    9. unsigned long v_uc_output_length;
    10. //规则库 q,w,q1,w1,d,e :q[4],w[2],q1[4],w1[2],d[3],e[1]=[16]
    11. // q:={1~15}
    12. unsigned short v_ui_patterns[PATTERN_SIZE];
    13. unsigned long  v_ui_patterns_length;

    14. OUPUT:
    15. //输出纸带的长度
    16. unsigned int  
    17. */
    18. unsigned int RunTuring ( unsigned char * v_uc_input , unsigned long v_ul_input_length , unsigned char * v_uc_output , unsigned long v_ul_output_length , unsigned short * v_ui_patterns , unsigned long  v_ul_patterns_length )
    19. {
    20.         //循环用通用计数器
    21.         unsigned short ui_pointer=0;
    22.         //输入纸带
    23.         unsigned char uc_input[BUFF_IN_SIZE];
    24.         //输出纸带
    25.         //unsigned char uc_output[BUFF_OT_SIZE];
    26.         unsigned char * uc_output;
    27.         //规则库 q,w,q1,w1,d,e :q[4],w[2],q1[4],w1[2],d[3],e[1]=[16]
    28.         // q:={1~15}
    29.         unsigned short ui_patterns[PATTERN_SIZE];
    30.         //当前输入指针
    31.         unsigned short ui_input_pointer=1;
    32.         //当前输出指针
    33.         unsigned short ui_output_pointer=0;
    34.         //当前输入
    35.         unsigned char ui_input=0;
    36.         //当前状态
    37.         unsigned short ui_state=1;
    38.         //当前规则
    39.         unsigned short ui_pattern=0;

    40.         //初始化规则库
    41.         ui_patterns[0]=0;
    42.         for(ui_pointer=1;ui_pointer<=v_ul_patterns_length && ui_pointer<PATTERN_SIZE;ui_pointer++)
    43.         {
    44.                 ui_patterns[ui_pointer]=v_ui_patterns[ui_pointer-1];
    45.         }
    46.         
    47.         //初始化当前输入指针
    48.         ui_input_pointer=1;
    49.         //初始化输入纸带
    50.         for(ui_pointer=0;ui_pointer<v_ul_input_length && ui_pointer<BUFF_IN_SIZE;ui_pointer++)
    51.         {
    52.                 uc_input[ui_pointer]=v_uc_input[ui_pointer];
    53.         }

    54.         //初始化当前输出指针
    55.         ui_output_pointer=0;
    56.         //初始化输出纸带
    57.         uc_output=v_uc_output;
    58.         for(ui_pointer=0;ui_pointer<v_ul_output_length;ui_pointer++)
    59.         {
    60.                 uc_output[ui_pointer]=0;
    61.         }
    62.         

    63.         //初始化当前状态
    64.         ui_state=1;

    65.         //执行
    66.         while(ui_state!=0)
    67.         {
    68.                 //获取当前输入
    69.                 ui_input=(uc_input[ui_input_pointer/4]>>(2*(3-(ui_input_pointer%4))))& 3;
    70.                 //获取当前规则
    71.                 //for(ui_pointer=PATTERN_SIZE-1;ui_pointer>0;ui_pointer--)
    72.                 for(ui_pointer=v_ul_patterns_length;ui_pointer>0;ui_pointer--)
    73.                 {
    74.                         ui_pattern=ui_patterns[ui_pointer];
    75.                         if (GET_PATTERN_q(ui_pattern)==ui_state && GET_PATTERN_w(ui_pattern)==ui_input)
    76.                         {
    77.                                         break;//找到
    78.                         }
    79.                 }
    80.                 /* debug */
    81.                 printf( "{%d}[%d]=%d,(%d)=%x,q=%d,w=%d,q1=%d,w1=%d,dh=%d,dl=%d,e=%d\n"
    82.                            , ui_state
    83.                            , ui_input_pointer
    84.                            , ui_input
    85.                            , ui_pointer
    86.                            , ui_pattern
    87.                            , GET_PATTERN_q(ui_pattern)
    88.                            , GET_PATTERN_w(ui_pattern)
    89.                            , GET_PATTERN_q1(ui_pattern)
    90.                            , GET_PATTERN_w1(ui_pattern)
    91.                            , GET_PATTERN_dh(ui_pattern)
    92.                            , GET_PATTERN_dl(ui_pattern)
    93.                            , GET_PATTERN_e(ui_pattern)
    94.                            );
    95.                 /* */
    96.                 if(ui_pointer!=0)
    97.                 {
    98.                         //状态转换为q1
    99.                         ui_state = GET_PATTERN_q1(ui_pattern);
    100.                         if( GET_PATTERN_w(ui_pattern)!= GET_PATTERN_w1(ui_pattern))
    101.                         {
    102.                                 //写w1
    103.                                 switch(3-(ui_input_pointer%4))
    104.                                 {
    105.                                         case 0:
    106.                                                 uc_input[ui_input_pointer/4] &= 0xfc; //11111100
    107.                                                 break;
    108.                                         case 1:
    109.                                                 uc_input[ui_input_pointer/4] &= 0xf3; //11110011
    110.                                                 break;
    111.                                         case 2:
    112.                                                 uc_input[ui_input_pointer/4] &= 0xcf; //11001111
    113.                                                 break;
    114.                                         case 3:
    115.                                                 uc_input[ui_input_pointer/4] &= 0x3f; //00111111
    116.                                                 break;
    117.                                         default:
    118.                                                 //RAISE ERROR
    119.                                                 break;
    120.                                 }
    121.                                 uc_input[ui_input_pointer/4] |= ((GET_PATTERN_w1(ui_pattern))>>(3-(ui_input_pointer%4))) ;
    122.                         }
    123.                         //移动输入指针
    124.                         switch (GET_PATTERN_dh(ui_pattern))
    125.                         {
    126.                                 case SHEFT_LEFT:
    127.                                         if (ui_input_pointer>0)ui_input_pointer--;
    128.                                         break;
    129.                                 case SHEFT_RIGHT:
    130.                                         //if (ui_input_pointer<BUFF_IN_SIZE*8/2-1)ui_input_pointer++;
    131.                                         if (ui_input_pointer<v_ul_input_length*8/2-1)ui_input_pointer++;
    132.                                         break;
    133.                                 case SHEFT_NONE:
    134.                                         break;
    135.                                 default:
    136.                                         //RAISE ERROR
    137.                                         break;
    138.                         }
    139.                         //输出
    140.                         switch (GET_PATTERN_dl(ui_pattern))
    141.                         {
    142.                                 case CMD_WRITE:
    143.                                         //if (ui_output_pointer<BUFF_OT_SIZE*8/1){
    144.                                         if (ui_output_pointer<v_ul_output_length*8/1){
    145.                                                 if(GET_PATTERN_e(ui_pattern))
    146.                                                 {
    147.                                                         uc_output[ui_output_pointer/8] |= 1<<(7-(ui_output_pointer%8));//写1
    148.                                                 }
    149.                                                 else
    150.                                                 {
    151.                                                         uc_output[ui_output_pointer/8] &= (0xff-(1<<(7-(ui_output_pointer%8))));//写0

    152.                                                 }
    153.                                                 //if(ui_output_pointer<BUFF_OT_SIZE*8/1-1)
    154.                                                 if(ui_output_pointer<v_ul_output_length*8/1-1)
    155.                                                 {
    156.                                                         ui_output_pointer++;
    157.                                                 }
    158.                                                 else
    159.                                                 {
    160.                                                         //RAISE ERROR
    161.                                                 }
    162.                                         }
    163.                                         else
    164.                                         {
    165.                                                 //RAISE ERROR
    166.                                         }
    167.                                         break;
    168.                                 case CMD_NOOUT:
    169.                                         break;
    170.                                 default:
    171.                                         //RAISE ERROR
    172.                                         break;
    173.                         }
    174.                 }
    175.                 else
    176.                 {
    177.                         //没找到,停机
    178.                         ui_state=0;
    179.                 }
    180.         }
    181.         
    182.         //输出 输出纸带 的长度
    183.     return ui_output_pointer;
    184. }
    复制代码
    最后是菜单项的定义和事件响应函数:
    1. //菜单项的定义
    2. …………
    3.         int i,n,iCnt;

    4.         char console_buff[1000];
    5.         struct stCosnoleMenu st_CosnoleMenu_buff[MENU_BUFF_SIZE];
    6.         //Cosnole_Menu_Init(&stMenu,stCosnoleMenu,"back up",MENU_DEFAULT_SELECTED_EVENT_FUNC,MENU_DEFAULT_SELECTED_EVENT_FUNC,MENU_DEFAULT_SELECTED_EVENT_FUNC);
    7.         Cosnole_Menu_Init(&stMenu,st_CosnoleMenu_buff,"back up",my_selected_event,my_command_event,my_submenu_event);

    8.         iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x11,"Add a Rule"     ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'1');//1
    9.         iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x12,"Show all Rules" ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'2');//2
    10.         iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x13,"Del all Rules"  ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'3');//3
    11.         iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x14,"Del a Rule"     ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'4');//4
    12.         iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x15,"Input the Tape" ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'5');//5
    13.         iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x16,"Run the Tape"   ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'6');//6
    14.         iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x17,"Show output"    ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'7');//7
    15.         iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x18,"Show Input"    ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'8');//8
    16. …………

    17. //事件响应函数

    18. void my_command_event(struct stCosnoleMenuRoot *stRt,unsigned int ui_ID)
    19. {
    20.         char ac_buff[512]={0};
    21.         unsigned int ui_l,ui_i,ui_j;
    22.         printf("command 0x%x is be selected\r\n",ui_ID);
    23.         switch(ui_ID)
    24.         {
    25.                 case 0x11://iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x11,"Add a Rule"   ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'1');//1
    26.                         if(uig_patterns_length>=PATTERN_SIZE-1)
    27.                         {
    28.                                 printf("there is %d ruls, so can't add new one.\r\n",uig_patterns_length);
    29.                         }
    30.                         else
    31.                         {
    32.                                 //增加1条规则
    33.                                 ui_l=inputLineFromConsole("Input a Rule.",ac_buff,512);
    34.                                 //规则库 q,w,q1,w1,d,e :q[4],w[2],q1[4],w1[2],d[3],e[1]=[16]
    35.                                 //MACRO_PATTERN_DOIT(q,w,q1,w1,d,e)
    36.                                 //MACRO_PATTERN_DOUT(q,w,q1,w1,d)
    37.                                 unsigned int uptr,u1,u2,u3,u4,u5;
    38.                                 if(ui_l<9)
    39.                                 {
    40.                                         printf("%d is too short to be a rule",ui_l);
    41.                                 }
    42.                                 else
    43.                                 {
    44.                                         uptr=0;
    45.                                         //q
    46.                                         printf("%s\r\n",ac_buff);
    47.                                         if(' '==ac_buff[uptr+1]){
    48.                                                 u1=(ac_buff[uptr]-'0');
    49.                                                 uptr+=2;
    50.                                         }
    51.                                         else
    52.                                         {
    53.                                                 u1=(ac_buff[uptr]-'0')*10+(ac_buff[uptr+1]-'0');
    54.                                                 uptr+=3;
    55.                                         }
    56.                                         //w
    57.                                         switch(ac_buff[uptr]){
    58.                                                 case '0':
    59.                                                         u2=TOKEN_0;
    60.                                                         break;
    61.                                                 case '1':
    62.                                                         u2=TOKEN_1;
    63.                                                         break;
    64.                                                 case 'e':
    65.                                                 case 'E':
    66.                                                         u2=TOKEN_E;
    67.                                                         break;
    68.                                                 default:  
    69.                                                         u2=TOKEN_E;
    70.                                                         break;
    71.                                         }
    72.                                         uptr+=2;
    73.                                         //q1
    74.                                         if(' '==ac_buff[uptr+2]){
    75.                                                 u3=(ac_buff[uptr]-'0')*10+(ac_buff[uptr+1]-'0');
    76.                                                 uptr+=3;
    77.                                         }
    78.                                         else
    79.                                         {
    80.                                                 u3=(ac_buff[uptr]-'0');
    81.                                                 uptr+=2;
    82.                                         }
    83.                                         //w1
    84.                                         switch(ac_buff[uptr]){
    85.                                                 case '0':
    86.                                                         u4=TOKEN_0;
    87.                                                         break;
    88.                                                 case '1':
    89.                                                         u4=TOKEN_1;
    90.                                                         break;
    91.                                                 case 'e':
    92.                                                 case 'E':
    93.                                                         u4=TOKEN_E;
    94.                                                         break;
    95.                                                 default:  
    96.                                                         u4=TOKEN_E;
    97.                                                         break;
    98.                                         }
    99.                                         uptr+=2;
    100.                                         //d
    101.                                         switch(ac_buff[uptr]){
    102.                                                 case '+':
    103.                                                         u5=SHEFT_RIGHT;
    104.                                                         break;
    105.                                                 case '-':
    106.                                                         u5=SHEFT_LEFT;
    107.                                                         break;
    108.                                                 case '0':
    109.                                                 default:  
    110.                                                         u5=SHEFT_NONE;
    111.                                                         break;
    112.                                         }
    113.                                         //e
    114.                                         if(uptr+1<ui_l)
    115.                                         {
    116.                                                 uptr+=2;
    117.                                                 if('0'==ac_buff[uptr])
    118.                                                 {
    119.                                                         uig_patterns[uig_patterns_length]= MACRO_PATTERN_DOUT(u1,u2,u3,u4,u5,0) ;
    120.                                                         uig_patterns_length++;
    121.                                                 }else
    122.                                                 {
    123.                                                         uig_patterns[uig_patterns_length]= MACRO_PATTERN_DOUT(u1,u2,u3,u4,u5,1) ;
    124.                                                         uig_patterns_length++;
    125.                                                 }
    126.                                         }
    127.                                         else
    128.                                         {
    129.                                                 uig_patterns[uig_patterns_length] = MACRO_PATTERN_DOIT(u1,u2,u3,u4,u5) ;
    130.                                                 uig_patterns_length++;
    131.                                         }
    132.                                         printf("a Rule be added, now there is %d ruls.\r\n",uig_patterns_length);
    133.                                 }
    134.                         }
    135.                         /*
    136.                         * TODO
    137.                         */
    138.                         break;
    139.                 case 0x12://iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x12,"Show all Rules" ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'2');//2
    140.                         //显示所有规则
    141.                         printf("Show all %d Rules:\r\n",uig_patterns_length);
    142.                         //打印规则库
    143.                         for(ui_l=0;ui_l<uig_patterns_length;ui_l++)
    144.                         {
    145.                                 printf( "[%d]={%x},q=%d,w=%d,q1=%d,w1=%d,dh=%d,dl=%d,e=%d\r\n"
    146.                                         , ui_l
    147.                                         , uig_patterns[ui_l]
    148.                                         , GET_PATTERN_q( uig_patterns[ui_l] )
    149.                                         , GET_PATTERN_w( uig_patterns[ui_l] )
    150.                                         , GET_PATTERN_q1( uig_patterns[ui_l] )
    151.                                         , GET_PATTERN_w1( uig_patterns[ui_l] )
    152.                                         , GET_PATTERN_dh( uig_patterns[ui_l] )
    153.                                         , GET_PATTERN_dl( uig_patterns[ui_l] )
    154.                                         , GET_PATTERN_e( uig_patterns[ui_l] )
    155.                                 );
    156.                         }
    157.                         printf("the Rules be Show\r\n");
    158.                         break;
    159.                 case 0x13://iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x13,"Del all Rules"  ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'3');//3
    160.                         //删除所有规则
    161.                         ui_l=inputLineFromConsole("Delete all Rules?(N,y)",ac_buff,1);
    162.                         if(ui_l>0 && (  'Y'==ac_buff[0] ||  'y'==ac_buff[0] ))//需要确认
    163.                         {
    164.                                 //规则条数改作0即可
    165.                                 uig_patterns_length=0;
    166.                                 printf("all Rules Deleted.\r\n");
    167.                         }
    168.                         else
    169.                         {
    170.                                 printf("Delete cancled.\r\n");
    171.                         }
    172.                         break;
    173.                 case 0x14://iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x14,"Delete a Rule"     ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'4');//4
    174.                         //删除1条规则
    175.                         ui_l=inputLineFromConsole("Delete a Rule.Input Num",ac_buff,5);
    176.                         ui_j=0;
    177.                         for(ui_i=0;ui_i<ui_l;ui_i++)
    178.                         {
    179.                                 if( ac_buff[ui_i]>='0' && ac_buff[ui_i]<='9' )
    180.                                 {
    181.                                         ui_j=ui_j*10+ac_buff[ui_i]-'0';
    182.                                 }
    183.                         }
    184.                         //显示删除哪条规则
    185.                         printf("Delete the %d Rule.\r\n",ui_j);
    186.                         if(ui_j<uig_patterns_length-1)
    187.                         {
    188.                                 //如果不是最后一条条规则,被删除那条后面的前移
    189.                                 for(ui_i=ui_j;ui_i<uig_patterns_length-1;ui_i++)
    190.                                 {
    191.                                         uig_patterns[ui_i]=uig_patterns[ui_i+1];
    192.                                 }
    193.                                 uig_patterns_length--;
    194.                         }
    195.                         else if(ui_j==(uig_patterns_length-1))
    196.                         {
    197.                                 //如果是最后一条条规则,只修改规则数量
    198.                                 uig_patterns_length--;
    199.                         }
    200.                         else
    201.                         {
    202.                                 printf("there isn't %d rule, check pls.\r\n",ui_j);
    203.                         }
    204.                         printf("Remove %d, Done.\r\n",ui_j);
    205.                         break;
    206.                 case 0x15://iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x15,"Input the Tape" ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'5');//5
    207.                         //输入 输入纸带
    208.                         ui_l=inputLineFromConsole("Input the Tape.",ac_buff,512);
    209.                         ui_j=0;
    210.                         //初始化 输入纸带
    211.                         //for(ui_i=0;ui_i<((ui_l+1+1)/4);ui_i++)ucg_input[ui_i]=MAKE_INPUT_TIE( TOKEN_E , TOKEN_E , TOKEN_E , TOKEN_E );
    212.                         ucg_input[0]=MAKE_INPUT_TIE( TOKEN_E , TOKEN_E , TOKEN_E , TOKEN_E );
    213.                         //将0、1、E写入 输入纸带
    214.                         for(ui_i=0;ui_i<ui_l && ui_i<BUFF_IN_SIZE*4-1;ui_i++)
    215.                         {
    216.                                 switch (ac_buff[ui_i])
    217.                                 {
    218.                                 case '0':
    219.                                         ui_j++;
    220.                                         ucg_input[(ui_j/4)] |= TOKEN_0<<(2*(3-ui_j%4));//TODO
    221.                                         //printf("%d,%d,%d,%d,%x,%x.\r\n",ui_j,ac_buff[ui_i],(ui_j/4),(2*(3-ui_j%4)),TOKEN_0<<(2*(3-ui_j%4)),TOKEN_0);
    222.                                         break;
    223.                                 case '1':
    224.                                         ui_j++;
    225.                                         ucg_input[(ui_j/4)] |= TOKEN_1<<(2*(3-ui_j%4));//TODO
    226.                                         //printf("%d,%d,%d,%d,%x,%x.\r\n",ui_j,ac_buff[ui_i],(ui_j/4),(2*(3-ui_j%4)),TOKEN_1<<(2*(3-ui_j%4)),TOKEN_1);
    227.                                         break;
    228.                                 case 'e':
    229.                                 case 'E':
    230.                                         ui_j++;
    231.                                         ucg_input[(ui_j/4)] |= TOKEN_E<<(2*(3-ui_j%4));//TODO
    232.                                         //printf("%d,%d,%d,%d,%x,%x.\r\n",ui_j,ac_buff[ui_i],(ui_j/4),(2*(3-ui_j%4)),TOKEN_E<<(2*(3-ui_j%4)),TOKEN_E);
    233.                                         break;
    234.                                 default:
    235.                                         break;
    236.                                 }
    237.                         }
    238.                         uig_input_length=ui_j;
    239.                         printf("the Tape has %d char.\r\n",ui_j);
    240.                         break;
    241.                 case 0x16://iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x16,"Run the Tape"   ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'6');//6
    242.                         //按 规则库 运行 输入纸带
    243.                         printf("the Tape is Running...\r\n");
    244.                         uig_output_length = RunTuring(ucg_input,uig_input_length,ucg_output,BUFF_OT_SIZE,uig_patterns,uig_patterns_length);
    245.                         printf("the Tape is Done\r\n");
    246.                         break;
    247.                 case 0x17://iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x17,"Show output"    ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'7');//7
    248.                         //显示 输出纸带
    249.                         printf("Output Tape with %d char:\r\n",uig_output_length);
    250.                         //打印输出纸带
    251.                         for(ui_l=0;ui_l<uig_output_length;ui_l++)
    252.                         {
    253.                                 printf("%d",(ucg_output[ui_l/8]>>(7-(ui_l%8)))& 1);
    254.                 }
    255.                 printf("\r\n");
    256.                 printf("the OutTape shown as above.\r\n");
    257.                         break;
    258.                 case 0x18://iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x18,"Show Input"    ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'8');//8
    259.                         //显示 输入纸带
    260.                         printf("Input Tape with %d char:\r\n",uig_input_length);
    261.                         //输入纸带
    262.                         for(ui_l=1;ui_l<=uig_input_length;ui_l++)
    263.                         {
    264.                                 //printf("([%d]%d=%x,%d)",ui_l,ui_l/4,ucg_input[ui_l/4],(3-ui_l%4)*2);
    265.                                 switch( (ucg_input[ui_l/4]>>( (3-ui_l%4)*2 ))&3 )
    266.                                 {
    267.                                         case TOKEN_E:printf("e");break;
    268.                                         case TOKEN_0:printf("0");break;
    269.                                         case TOKEN_1:printf("1");break;
    270.                                 }
    271.                         }
    272.                         printf("\r\n");
    273.                         printf("the Input Tape shown as above.\r\n");
    274.                         break;
    275.                 default:
    276.                         printf("command 0x%x is be undefined.\r\n",ui_ID);
    277.         }
    278.         show_current_menu(&stMenu);

    279. }
    280. //获取一段控制台输入,以@结尾,返回长度
    281. unsigned int inputLineFromConsole(char * pc_promaptStr,char *pc_buff,unsigned int ui_buff_length)
    282. {
    283.         uint8_t uc_char;
    284.         unsigned int ui_len=0;
    285.         for(ui_len=0;ui_len<ui_buff_length;ui_len++)pc_buff[ui_len]=0;
    286.         ui_len=0;
    287.         uc_char=0;
    288.        
    289.         printf("%s\r\n",pc_promaptStr);
    290.         uart_read(CONSOLE_UART, &uc_char);
    291.         while(uc_char!='@' && ui_len<ui_buff_length-1)
    292.         {
    293.                 if(uc_char>=32 && uc_char<=126 )
    294.                 {
    295.                         pc_buff[ui_len++]=uc_char;
    296.                         uc_char=0;
    297.                 }
    298.                 uart_read(CONSOLE_UART, &uc_char);
    299.         }
    300.         pc_buff[ui_len]=0;
    301.         //printf("%s",pc_buff);
    302.         //puts("\r\n");
    303.         return ui_len;
    304. }
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-7-16 09:10
  • 签到天数: 361 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-2-5 14:39:35 | 显示全部楼层
    沙发啦,好多好多代码呀
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-4-2 16:02
  • 签到天数: 257 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-2-5 22:30:07 | 显示全部楼层
    只能坐板凳了,呵呵
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-19 12:18 , Processed in 0.137052 second(s), 19 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.