radio_mv114_kst.c
上传用户:caisangzi8
上传日期:2013-10-25
资源大小:15756k
文件大小:31k
源码类别:

DVD

开发平台:

C/C++

  1. /* note: this program is for self tuned radio MV114, MV014, MV011 */
  2. /* PLL IC: LC72131, TUNER IC: LA1844 */
  3. /* state=FM AM mode */
  4. #include "regmap.h"
  5. #include "global.h"
  6. #include "func.h"
  7. #include "radio_mv114_kst.h"
  8. #include "radio_rds.h"
  9. #include "ircode.h" 
  10. #include "osd.h"
  11. #include "dsp3_if.h"
  12. #include "set.h"
  13. #include "audctrl.h"
  14. #include "util.h"
  15. extern UINT16 check_sum(BYTE *data,BYTE len); 
  16. #define NEW_AUTO_SEARCH_ALL
  17. #define TUNER_DBG
  18. /*
  19. #ifdef SUPPORT_TUNER_DBG
  20. #define  TUNER_DBG
  21. #endif
  22. */ 
  23. /*
  24. #ifndef DVDRELEASE
  25. #define TUNER_DBG
  26. #endif
  27. #ifndef   TUNER_DBG
  28. #undef printf
  29. #undef print_block
  30. #define printf(f, a...) do {} while (0)
  31. #define print_block(x,y) do {} while (0)
  32. #endif
  33. */
  34. #ifndef  SUPPORT_OSD
  35. #undef   PrintOsdMsg(x,y,z,w)
  36. #define  PrintOsdMsg(x,y,z,w)
  37. #endif
  38. /*
  39. * declare extern function
  40. */
  41. extern void init_ir_num(void);
  42. extern void  polling_vfdr(void);
  43. /*from lc72131.c*/
  44. extern void tuner_mute( BYTE );
  45. extern void set_band(BYTE);
  46. extern void set_mono_stereo(BYTE);
  47. extern void set_station(BYTE i);
  48. extern BYTE is_station();
  49. extern void init_tuner();
  50. extern BYTE test_tuner();
  51. extern void set_freq(UINT16 freq);
  52. extern BYTE is_stereo(void);
  53. BYTE search_station=0;
  54. static BYTE   search_dir=0;
  55. BYTE write2mem=0;
  56. extern int rep_ir_times;
  57. #include ".\Customers\Sunplus\vfd_gbmsample_l.h"  
  58. #include "vfdfunc.h"
  59. extern void  vfd_set_str();
  60. /*/////////////////////////
  61. Creator: xyy 2004-3-12 
  62. Function:Auto search all station and save the station to e2prom
  63. //////////////////////////*/
  64. #ifndef NEW_AUTO_SEARCH_ALL
  65. void auto_search_all()
  66. {
  67. int i=0;
  68. search_dir = 1;
  69. if(tuner.bandswitch)//am
  70. {
  71. tuner.ambak=AM_FREQ_MIN+0x30;
  72. while(1)
  73. {
  74. if(tuner.ambak == AM_FREQ_MIN)
  75. {
  76. i = 0;
  77. search_station = 0;
  78. save_tuner_E2PROM();
  79. tuner.am_ch = 1;
  80. set_station(tuner.am_ch);
  81.     break;
  82. }
  83. Amautosearch(AUTOSEARCHUP);
  84. if(search_station==1)
  85. {
  86. tuner.amfreq[i] = tuner.ambak;
  87. i++;
  88. //save station
  89. search_station = 0;
  90. search_dir = 1;
  91. }
  92. }
  93. }
  94. else //fm*/
  95. {
  96. tuner.fmbak=FM_FREQ_MIN+1;
  97. while(1)
  98. {
  99. if(tuner.fmbak == FM_FREQ_MIN)
  100. {
  101. i = 0;
  102. search_station = 0;
  103. save_tuner_E2PROM();
  104. tuner.fm_ch = 1;
  105. set_station(tuner.fm_ch);
  106.     break;
  107. }
  108. Fmautosearch(AUTOSEARCHUP);
  109. if(search_station==1)
  110. {
  111. tuner.fmfreq[i] = tuner.fmbak;
  112. i++;
  113. //save station
  114. search_station = 0;
  115. search_dir = 1;
  116. }
  117. }
  118. }
  119. }
  120. #endif//NEW_AUTO_SEARCH_ALL
  121. #ifdef NEW_AUTO_SEARCH_ALL
  122. void auto_search_all_am()
  123. {
  124. BYTE ch;
  125. if(tuner.bandswitch  == 0)
  126. {
  127. tuner.bandswitch=(!tuner.bandswitch);
  128. set_band(tuner.bandswitch);
  129. }
  130. //now is am
  131. tuner.ambak = AM_FREQ_MIN;
  132. tuner.am_ch = 0;
  133. for(ch = 0;ch < MAX_MEM_BAND;ch++)
  134. {
  135. while(1)
  136. {       
  137. tuner.ambak = (tuner.ambak + 0x30); // 3*3k step
  138. if(tuner.ambak>AM_FREQ_MAX)  //am max
  139. {
  140. break;
  141. }
  142. tuner.amfreq[tuner.am_ch] = tuner.ambak;
  143. disfreq();
  144. if(is_station())
  145. {
  146. break; 
  147. }        
  148.        }
  149. if(tuner.ambak>AM_FREQ_MAX)  //am max
  150. {
  151. break;
  152. }
  153. if(tuner.am_ch < (MAX_MEM_BAND-1))
  154. tuner.am_ch++;
  155. else
  156. tuner.am_ch = 0;
  157. }
  158. }
  159. void auto_search_all_fm()
  160. {
  161. BYTE ch;
  162. if(tuner.bandswitch  == 1)
  163. {
  164. tuner.bandswitch=(!tuner.bandswitch);
  165. set_band(tuner.bandswitch);
  166. }
  167. //now is fm
  168. tuner.fmbak = FM_FREQ_MIN;
  169. tuner.fm_ch = 0;
  170. tuner.bandswitch = 0;//fm
  171. for(ch = 0;ch < MAX_MEM_BAND;ch++)
  172. {
  173. while(1)
  174. {       
  175. tuner.fmbak=(tuner.fmbak+1); // 100K STEP, ref clock: 25k
  176. if(tuner.fmbak>FM_FREQ_MAX)  //fm max 107.8MHZ
  177. {
  178. break;
  179. }  
  180. tuner.fmfreq[tuner.fm_ch] =tuner.fmbak ;
  181. disfreq();
  182. if(is_station())
  183. break;
  184.        }
  185. if(tuner.fmbak >FM_FREQ_MAX)  //fm max 107.8MHZ
  186. {
  187. break;
  188. }
  189. if(tuner.fm_ch < (MAX_MEM_BAND-1))
  190. tuner.fm_ch++;
  191. else
  192. tuner.fm_ch = 0;
  193. }
  194. }
  195. #endif//NEW_AUTO_SEARCH_ALL
  196. /*
  197. char *capitalise(char *p)
  198. mode==0
  199. ----translate lowercase into capital
  200. mode==1
  201. ----translate capital into lowercase
  202. len ??????
  203. */
  204. void capitalize(char *p,BYTE mode,BYTE len)
  205. {
  206.     while(len)
  207.     {
  208.         if(*p>='a'&&*p<='z')
  209.         {
  210.             if(mode)
  211.                 *p+=0x20;
  212.             else
  213.                 *p-=0x20;
  214.         }
  215.         p++;
  216.         len--;
  217.     }
  218. }
  219. void str_filter(char *p,BYTE len)
  220. {
  221. //capitalize(p,len);
  222.     while(len)
  223.     {
  224.         if(*p>='A'&&*p<='Z')
  225.         {
  226.         }
  227.         else if((*p == '-')||(*p == ':'))
  228.         {
  229.         }
  230.         else if(*p>='0'&&*p<='9')
  231.         {
  232.         }
  233.         else
  234.         {
  235. *p = ' ';
  236.         }
  237.         p++;
  238.         len--;
  239.     }
  240. }
  241. #ifdef XINGQIU_DVD_RECEIVER//xyy 2004-5-24 9:06
  242. void tuner_key(BYTE key)
  243. {
  244.     static BYTE enter_flag=0;
  245. //return;
  246.     switch(key)
  247. {
  248. /* case IRC_0:
  249. case IRC_1:
  250. printf("========  hello hello =======n");
  251. tuner_oper_mode = RECALL_OR_STORE;
  252. break;*/
  253. case IRC_MUTE:
  254. int id;
  255. //rds_decoder_init();
  256. //return;
  257. //printf("size of :%dn",sizeof(tuner));
  258. user_mute=!user_mute;
  259. tuner_mute(user_mute);
  260. if(user_mute)
  261. {
  262. id=STR_OS_MUTE;
  263.                 OSD1000ISP_STATUS(OSDISP_MUTE, OSDIR_MUTE);
  264.      PrintOsdMsg(id,REGION1,0,0);
  265. }
  266. else
  267.             {
  268. //     id=STR_OS_SPACE;
  269.                 OSD1000ISP_STATUS(OSDISP_CLEAR, OSDIR_GLOBAL);
  270.         OSD_OnOffRegion(OSD_OFF,1);//xyy 2003-10-13 17:15
  271.             }
  272. break;
  273. }     
  274. case IRC_GOTO:
  275. tuner_oper_mode = AUTO_SEARCH;
  276. timeout_vfd = 0;   
  277. if(tuner.bandswitch  == 1)
  278. {
  279. auto_search_all_am();
  280. tuner.am_ch = 0;
  281. set_station(tuner.am_ch);
  282. }
  283. else
  284. {
  285. auto_search_all_fm();
  286. tuner.fm_ch = 0;
  287. set_station(tuner.fm_ch);
  288. }
  289. save_tuner_E2PROM();
  290. tuner_oper_mode = NORMAL_TUNE;
  291. disfreq();
  292. break;
  293. case IRC_SETUP:
  294. search_station = 1;
  295. tuner_oper_mode = RECALL_OR_STORE;
  296. timeout_vfd = 6000;
  297. break;
  298. case IRC_AUD_LANGUAGE:
  299. if(!tuner.bandswitch)
  300. {
  301. tuner_st_mono();
  302. timeout_vfd = 4000;
  303. }
  304. break;
  305. case IRC_CLEAR:
  306. printf("======  clear ======n");
  307. break;
  308. case IRC_TITLEMENU:
  309. tuner_oper_mode = FREQ_DIRECT_CALL;
  310. timeout_vfd = 6000;
  311. erase_vfd_mem();
  312. if(tuner.bandswitch)
  313. {
  314. station_input_index = 1;
  315. psprintf(linebuf,"%02d   0000",tuner.am_ch); 
  316. }
  317. else
  318. {
  319. psprintf(linebuf,"%02d  00000",tuner.fm_ch); 
  320. vfd_set_dot(0x49);
  321. }
  322. vfd_set_str(0,0,0,linebuf);
  323. break;
  324. #ifdef SUPPORT_RDS_FUNCTION//xyy 2003-12-4 13:54
  325. case IRC_SELECT:
  326.     if(enter_flag == 0)
  327.     {
  328.              erase_vfd_mem();
  329.              if(psReadyFlag == 0x0f)
  330.              {
  331.               rds_func_flag = PS_FUNC; 
  332.               psprintf(RegionValStr[REGION1],"PS : %s",programServiceBuf);
  333.   PrintOsdMsg(0, REGION1, 0, 1);
  334.           }
  335.      else
  336.           {
  337.             //vfd_set_str(0,0,0,"  NO PS  "); 
  338.             psprintf(RegionValStr[REGION1],"NO PS");
  339.             PrintOsdMsg(0, REGION1, 0, 1);
  340.               rds_func_flag = 0;
  341.           }
  342.        enter_flag++;
  343.     }
  344.     else if(enter_flag == 1)
  345.     {
  346.             erase_vfd_mem();
  347.             if(ptyReadyFlag == 0xff)
  348.              {
  349.              rds_func_flag = PTY_FUNC;
  350. //printf( "PTY %s",programTypeBuf);
  351. //PrintOsdMsg(, y, z, w)
  352.  psprintf(RegionValStr[REGION1],"PYP : %s",programTypeBuf);
  353.  PrintOsdMsg(0, REGION1, 0, 1);
  354.             }
  355.          else
  356.          {
  357.              //vfd_set_str(0,0,0,"  NO PTY  "); 
  358.              psprintf(RegionValStr[REGION1],"NO PYP");
  359.  PrintOsdMsg(0, REGION1, 0, 1);
  360.              rds_func_flag = 0;
  361.          }
  362.         enter_flag++;
  363.     }
  364.     else if(enter_flag == 2)
  365. {
  366.             erase_vfd_mem();
  367.             if((txtBreadyFlag == 0xffff)||(txtAreadyFlag == 0xffff))
  368.              {
  369.              rds_func_flag = RT_FUNC;
  370. //printf("%sn",radioTextBufA[0]);
  371.              capitalize(radioTextBufA[radio_text_type], 0, 64);
  372.  str_filter(radioTextBufA[radio_text_type], 64);
  373.              //printf("%sn",radioTextBufA[0]);
  374.  psprintf(RegionValStr[REGION1],"RT : %s",radioTextBufA[radio_text_type]);
  375.  PrintOsdMsg(0, REGION1, 0, 1);
  376.             }
  377.          else
  378.          {
  379.              //vfd_set_str(0,0,0,"  NO RT  "); 
  380.              psprintf(RegionValStr[REGION1],"NO RT");
  381.  PrintOsdMsg(0, REGION1, 0, 1);
  382.              
  383.              rds_func_flag = 0;
  384.          }
  385.         enter_flag++;
  386.     }
  387.     else if(enter_flag == 3)
  388.             {
  389.             erase_vfd_mem();
  390.             if(ctReadyFlag == 0xff)
  391.              {
  392.              rds_func_flag = CT_FUNC;
  393.              //printf("CT %sn",clocktimeBuf);
  394.  psprintf(RegionValStr[REGION1],"%s",clocktimeBuf);
  395.  PrintOsdMsg(0, REGION1, 0, 1);
  396.        
  397.             }
  398.          else
  399.      {              
  400.              //vfd_set_str(0,0,0,"  NO CT  "); 
  401.              psprintf(RegionValStr[REGION1],"NO CT");
  402.  PrintOsdMsg(0, REGION1, 0, 1);
  403.           
  404.              rds_func_flag = 0;
  405.          }
  406.         enter_flag++;
  407.     }
  408.     else if(enter_flag == 4)
  409.      {
  410.       
  411.             erase_vfd_mem();
  412.             if(ptynReadyFlag == 0x0f)
  413.              {
  414.              rds_func_flag = PTYN_FUNC;
  415.              capitalize(programTypeNameBuf, 0, 9);
  416.              str_filter(programTypeNameBuf,9);
  417. psprintf(RegionValStr[REGION1],"PTYN:%s",programTypeNameBuf);
  418. PrintOsdMsg(0, REGION1, 0, 1);
  419.              }
  420.      else
  421.           {
  422.               //vfd_set_str(0,0,0," NO PTYN "); 
  423.               rds_func_flag = 0;
  424. psprintf(RegionValStr[REGION1],"NO PTYN");
  425.   PrintOsdMsg(0, REGION1, 0, 1);
  426.      }
  427.         enter_flag = 0;
  428.      }
  429.         rdsinfo_dispindex = 0;
  430.         timeout_vfd = 2000;
  431.     
  432.            break;
  433. #endif
  434. case IRC_FORWARD:/* auto search up */
  435. #ifdef SUPPORT_RDS_FUNCTION//xyy 2003-12-4 16:18
  436.         rds_clear_var();
  437. #endif
  438. tuner_oper_mode = NORMAL_TUNE;    
  439. tuner.Istuning[tuner.bandswitch]=1;
  440. timeout_vfd = 0;
  441. // to avoid the noise when enter auto search mode
  442. tuner_mute_flag = 0;
  443. search_dir=1;
  444. break;
  445. case  IRC_BACKWARD:  /* auto search down */
  446. #ifdef SUPPORT_RDS_FUNCTION//xyy 2003-12-4 16:18
  447.         rds_clear_var();
  448. #endif
  449. // to avoid the noise when enter auto search mode
  450. tuner_oper_mode = NORMAL_TUNE; 
  451. timeout_vfd = 0;   
  452. tuner_mute_flag = 0;
  453. search_dir=2;
  454. break;
  455. case IRC_LEFT:
  456. search_dir = 0;
  457. search(SEARCHDEC);
  458. break;
  459. case IRC_RIGHT:
  460. search_dir = 0;
  461. search(SEARCHADD);
  462. break;
  463. case IRC_PREV:
  464. //printf("leftn");
  465. #ifdef SUPPORT_RDS_FUNCTION//xyy 2003-12-4 16:18
  466.         rds_clear_var();
  467. #endif
  468. if(tuner.bandswitch)//am
  469. {
  470. if(tuner.am_ch>1)
  471. tuner.am_ch--;
  472. else
  473. tuner.am_ch = 1;
  474. set_station(tuner.am_ch);
  475. }
  476. else //fm
  477. {
  478. if(tuner.fm_ch>=1)
  479. tuner.fm_ch--;
  480. else
  481. // tuner.fm_ch = 1;
  482. tuner.fm_ch = 0;
  483. set_station(tuner.fm_ch);
  484. }
  485. write2mem =1;
  486. break;
  487. case IRC_NEXT:
  488. #ifdef SUPPORT_RDS_FUNCTION//xyy 2003-12-4 16:18
  489.         rds_clear_var();
  490. #endif
  491. if(tuner.bandswitch) //am
  492. {
  493. if(tuner.am_ch<MAX_MEM_BAND)
  494. tuner.am_ch++;
  495. else
  496. tuner.am_ch = MAX_MEM_BAND;
  497. set_station(tuner.am_ch);
  498. }
  499. else  //fm
  500. {
  501. if(tuner.fm_ch<MAX_MEM_BAND)
  502. tuner.fm_ch++;
  503. else
  504. tuner.fm_ch = MAX_MEM_BAND;
  505. set_station(tuner.fm_ch);
  506. }
  507. write2mem =1;
  508. break;
  509. case  IRC_RCVR_BAND:                             /* serach- */
  510. {
  511. search_dir=0;
  512. tuner.bandswitch=(!tuner.bandswitch);
  513. //printf("bandn");
  514. set_band(tuner.bandswitch);  
  515. write2mem=1;    
  516. break;
  517. }
  518. #ifdef SUPPORT_APOGEE_AMP
  519. case IRC_VOLUME_UP:
  520. //     ircmd_volume_up();
  521. // set_volume(1);
  522. break ;
  523. case IRC_VOLUME_DN:
  524. //     ircmd_volume_down();
  525. // set_volume(0);
  526. break ;
  527. #endif
  528. default:                                      
  529. break;
  530.       }       
  531. }
  532. #elif defined(ORITRON_DVD_RECEIVER)
  533. void tuner_key(BYTE key)
  534. {
  535.     static BYTE enter_flag=0;
  536.     static BYTE stereo = 1;
  537. //return;
  538.     switch(key)
  539. {
  540. case IRC_MUTE:
  541. int id;
  542. //rds_decoder_init();
  543. //return;
  544. //printf("size of :%dn",sizeof(tuner));
  545. user_mute=!user_mute;
  546. tuner_mute(user_mute);
  547. if(user_mute)
  548. {
  549. id=STR_OS_MUTE;
  550. PrintOsdMsg(id,REGION1,0,0);
  551. }
  552. else
  553. //     id=STR_OS_SPACE;
  554.         OSD_OnOffRegion(OSD_OFF,1);//xyy 2003-10-13 17:15
  555. break;
  556. }     
  557. /* //xyy mask 2004-11-9
  558. case IRC_GOTO:
  559. tuner_oper_mode = AUTO_SEARCH;
  560. timeout_vfd = 0;   
  561. if(tuner.bandswitch  == 1)
  562. {
  563. auto_search_all_am();
  564. tuner.am_ch = 0;
  565. set_station(tuner.am_ch);
  566. }
  567. else
  568. {
  569. auto_search_all_fm();
  570. tuner.fm_ch = 0;
  571. set_station(tuner.fm_ch);
  572. }
  573. save_tuner_E2PROM();
  574. tuner_oper_mode = NORMAL_TUNE;
  575. disfreq();
  576. break;
  577. case IRC_SETUP:
  578. search_station = 1;
  579. tuner_oper_mode = RECALL_OR_STORE;
  580. timeout_vfd = 6000;
  581. break;
  582. */
  583. case IRC_RCVR_EQ:
  584. stereo = !stereo;
  585. if(!tuner.bandswitch)
  586. {
  587. set_mono_stereo(stereo);
  588. timeout_vfd = 4000;
  589. }
  590. break;
  591. case IRC_FORWARD:/* auto search up */
  592. case IRC_VFD_RIGHT:
  593. tuner_oper_mode = NORMAL_TUNE;    
  594. tuner.Istuning[tuner.bandswitch]=1;
  595. timeout_vfd = 0;
  596. // to avoid the noise when enter auto search mode
  597. tuner_mute_flag = 0;
  598. search_dir=1;
  599. break;
  600. case  IRC_BACKWARD:  /* auto search down */
  601. case IRC_VFD_LEFT:
  602. // to avoid the noise when enter auto search mode
  603. tuner_oper_mode = NORMAL_TUNE; 
  604. timeout_vfd = 0;   
  605. tuner_mute_flag = 0;
  606. search_dir=2;
  607. break;
  608. case IRC_LEFT:
  609. search_dir = 0;
  610. search(SEARCHDEC);
  611. break;
  612. case IRC_RIGHT:
  613. search_dir = 0;
  614. search(SEARCHADD);
  615. break;
  616. case IRC_PREV:
  617. //printf("leftn");
  618. if(tuner.bandswitch)//am
  619. {
  620. if(tuner.am_ch>1)
  621. tuner.am_ch--;
  622. else
  623. tuner.am_ch = 1;
  624. set_station(tuner.am_ch);
  625. }
  626. else //fm
  627. {
  628. if(tuner.fm_ch>=1)
  629. tuner.fm_ch--;
  630. else
  631. // tuner.fm_ch = 1;
  632. tuner.fm_ch = 0;
  633. set_station(tuner.fm_ch);
  634. }
  635. write2mem =1;
  636. break;
  637. case IRC_NEXT:
  638. if(tuner.bandswitch) //am
  639. {
  640. if(tuner.am_ch<MAX_MEM_BAND)
  641. tuner.am_ch++;
  642. else
  643. tuner.am_ch = MAX_MEM_BAND;
  644. set_station(tuner.am_ch);
  645. }
  646. else  //fm
  647. {
  648. if(tuner.fm_ch<MAX_MEM_BAND)
  649. tuner.fm_ch++;
  650. else
  651. tuner.fm_ch = MAX_MEM_BAND;
  652. set_station(tuner.fm_ch);
  653. }
  654. write2mem =1;
  655. break;
  656. case  IRC_P_SCAN:                             /* serach- */
  657. {
  658. search_dir=0;
  659. tuner.bandswitch=(!tuner.bandswitch);
  660. //printf("bandn");
  661. set_band(tuner.bandswitch);  
  662. write2mem=1;    
  663. disfreq();
  664. break;
  665. }
  666. default:                                      
  667. break;
  668.       }       
  669. }
  670. #else
  671. void tuner_key(BYTE key)
  672. {
  673.     static BYTE enter_flag=0;
  674. //return;
  675.     switch(key)
  676. {
  677. case IRC_MUTE:
  678. int id;
  679. //rds_decoder_init();
  680. //return;
  681. //printf("size of :%dn",sizeof(tuner));
  682. user_mute=!user_mute;
  683. tuner_mute(user_mute);
  684. if(user_mute)
  685. {
  686. id=STR_OS_MUTE;
  687.                 OSD1000ISP_STATUS(OSDISP_MUTE, OSDIR_MUTE);
  688.      PrintOsdMsg(id,REGION1,0,0);
  689. }
  690. else
  691.             {
  692. //     id=STR_OS_SPACE;
  693.                 OSD1000ISP_STATUS(OSDISP_CLEAR, OSDIR_GLOBAL);
  694.         OSD_OnOffRegion(OSD_OFF,1);//xyy 2003-10-13 17:15
  695.             }
  696. break;
  697. }   
  698. #ifdef SUPPORT_RDS_FUNCTION
  699. case IRC_SELECT:
  700. if(rds_func_flag >= 4)
  701. {
  702. rds_func_flag = 0;
  703. }
  704. else
  705. {
  706. rds_func_flag++;
  707. }
  708. disp_rds_func(rds_func_flag);
  709. break;
  710. #endif /*SUPPORT_RDS_FUNCTION*/
  711. case IRC_UP:/* auto search up */
  712. #ifdef SUPPORT_RDS_FUNCTION//xyy 2003-12-4 16:18
  713.         rds_clear_var();
  714. #endif
  715. {
  716. tuner.Istuning[tuner.bandswitch]=1;
  717. if(search_dir&&(rep_ir_times<INC_SPEED_TIMES))
  718. {                
  719. search_dir=0;
  720. //tuner_mute( 0 ); // demute when auto search
  721. tuner_mute_flag = 1; // auto demute after 500ms
  722. }else
  723. {
  724. if(rep_ir_times<INC_SPEED_TIMES)
  725. {
  726. #ifdef TUNER_DBG
  727. //printf("addn");
  728. #endif
  729. search(SEARCHADD);
  730. }else 
  731. {   
  732. // to avoid the noise when enter auto search mode
  733. tuner_mute_flag = 0;
  734. search_dir=1;
  735.               }
  736. }   
  737. break;
  738. }
  739. case  IRC_DOWN:  /* auto search down */
  740. #ifdef SUPPORT_RDS_FUNCTION//xyy 2003-12-4 16:18
  741.         rds_clear_var();
  742. #endif
  743. {
  744. tuner.Istuning[tuner.bandswitch]=1;
  745. if(search_dir&&(rep_ir_times<INC_SPEED_TIMES))
  746. {
  747. search_dir=0;
  748. //tuner_mute( 0 ); //demute when auto search
  749. tuner_mute_flag = 1; // auto demute after 500ms
  750. }else
  751. {
  752. if(rep_ir_times<INC_SPEED_TIMES)              
  753. {
  754. #ifdef TUNER_DBG
  755. //printf("decn");
  756. #endif
  757. search(SEARCHDEC);
  758. }else
  759. {   
  760. // to avoid the noise when enter auto search mode
  761. tuner_mute_flag = 0;
  762. search_dir=2;
  763.               }
  764.           }
  765. break;
  766. }
  767. case IRC_LEFT:
  768. //printf("leftn");
  769. #ifdef SUPPORT_RDS_FUNCTION//xyy 2003-12-4 16:18
  770.         rds_clear_var();
  771. #endif
  772. if(tuner.bandswitch)//am
  773. {
  774. if(tuner.am_ch>0)
  775. tuner.am_ch--;
  776. else
  777. tuner.am_ch = 0;
  778. set_station(tuner.am_ch);
  779. }
  780. else //fm
  781. {
  782. if(tuner.fm_ch>0)
  783. tuner.fm_ch--;
  784. else
  785. tuner.fm_ch = 0;
  786. set_station(tuner.fm_ch);
  787. }
  788. write2mem =1;
  789. disfreq();
  790. break;
  791. case IRC_RIGHT:
  792. #ifdef SUPPORT_RDS_FUNCTION//xyy 2003-12-4 16:18
  793.         rds_clear_var();
  794. #endif
  795. if(tuner.bandswitch) //am
  796. {
  797. if(tuner.am_ch<(MAX_MEM_BAND-1))
  798. tuner.am_ch++;
  799. else
  800. tuner.am_ch = (MAX_MEM_BAND-1);
  801. set_station(tuner.am_ch);
  802. }
  803. else  //fm
  804. {
  805. if(tuner.fm_ch<(MAX_MEM_BAND-1))
  806. tuner.fm_ch++;
  807. else
  808. tuner.fm_ch = (MAX_MEM_BAND-1);
  809. set_station(tuner.fm_ch);
  810. }
  811. write2mem =1;
  812. disfreq();
  813. break;
  814. case  IRC_FORMAT:
  815. tuner_st_mono();
  816. break;
  817. case  IRC_ZOOM:                             /* serach- */
  818. {
  819. search_dir=0;
  820. tuner.bandswitch=(!tuner.bandswitch);
  821. //printf("bandn");
  822. set_band(tuner.bandswitch);  
  823. write2mem=1;    
  824. break;
  825. }
  826. case IRC_PROGRAM:
  827. #ifndef NEW_AUTO_SEARCH_ALL
  828. auto_search_all();
  829. #else
  830. auto_search_all_am();
  831. auto_search_all_fm();
  832. tuner.fm_ch = 0;
  833. set_station(tuner.fm_ch);  //goto the 1st station
  834. #endif  //NEW_AUTO_SEARCH_ALL
  835. break;
  836. #ifdef SUPPORT_APOGEE_AMP
  837. case IRC_VOLUME_UP:
  838. //     ircmd_volume_up();
  839. // set_volume(1);
  840. break ;
  841. case IRC_VOLUME_DN:
  842. //     ircmd_volume_down();
  843. // set_volume(0);
  844. break ;
  845. #endif
  846. default:                                      
  847. break;
  848.       }       
  849. }
  850. #endif
  851. #include "sysmain2_inc.h" 
  852. #include "kernel.h"
  853. #include "tvif.h"
  854. //#include "radio_rds.h"//xyy 2003-12-1 13:28
  855. void   tuner_main(void)
  856. {
  857. osd_init();//xyy 2003-9-23 16:36
  858. #ifdef NEW_AUTO_SEARCH_ALL
  859. //change_system_clock(19);
  860. #endif
  861. #ifdef TUNER_DISABLE_VIDEO//xyy 2004-11-9
  862. /// disable_video();
  863. tv_dacoff(0x3f);
  864. #endif
  865.  
  866.     load_tuner_E2PROM();//marked by xyy 2003-9-23 9:01 
  867. tunerflag = 0;
  868. station_input_index = 0;
  869. tuner_oper_mode = NORMAL_TUNE;    
  870.     
  871. init_tuner();
  872.     
  873.     if(test_tuner())
  874.     {
  875. psprintf(RegionValStr[2],"TUNER NOT READY");
  876. PrintOsdMsg(STR_OS_SPACE,0x2,0,1);
  877. #ifdef XINGQIU_RECEIVER_PANNEL //xyy 2004-8-5
  878. vfd_set_str(0,0,0,"NOT READY");
  879. #endif
  880. while (system_state != SYSTEM_OPEN)
  881. {
  882. polling();
  883. }
  884.     }
  885.     erase_vfd_mem(); 
  886.     
  887.     while (system_state != SYSTEM_OPEN)
  888.     {
  889. #ifdef SUPPORT_RDS_FUNCTION  //xyy
  890. rds_collect_data();
  891.     disp_rds(rds_func_flag);
  892. #endif            
  893.     disfreq();
  894. polling();//i=keyscan()
  895. #if 0
  896. if(RDS_PS_RDY())
  897. {
  898. //printf("ps:%sn",rds_get_ps());
  899. psprintf(RegionValStr[REGION1],"PS : %s",rds_get_ps());
  900. PrintOsdMsg(0, REGION1, 1, 1);
  901. RDS_PS_CLR_RDY();
  902. }
  903. #endif
  904. #ifdef SUPPORT_STEREO_DETECT
  905. if(is_stereo())
  906.      {
  907.          printf("stereon");    
  908.      }
  909.      else
  910.      {
  911.          printf("monon");
  912.      }
  913. #endif //SUPPORT_STEREO_DETECT
  914. if(search_dir)
  915. {
  916. tuner_auto_search();
  917. }
  918. if(write2mem)
  919. {
  920. write2mem=0;
  921. tuner.memory_status=MEM_MODE;
  922. save_tuner_E2PROM();//xyy 2003-9-23 9:02
  923. //printf("writen");
  924. }
  925.     }
  926.     
  927. }
  928. void tuner_auto_search( void )
  929. {
  930.     if( search_dir == 1 )  //auto search up
  931.     {
  932.         if( tuner.bandswitch )//am
  933.         {//am auto search up
  934.             //Amautosearchup();
  935.             Amautosearch( AUTOSEARCHUP );
  936.         }else
  937.         { // fm auto search up
  938.             //Fmautosearchup();
  939.             Fmautosearch( AUTOSEARCHUP );
  940.         }
  941.     }else // search_dir == 2, auto search down    
  942.     {
  943.         if( tuner.bandswitch )//am
  944.         { //am auto search down
  945.             //Amautosearchdown();
  946.             Amautosearch( AUTOSEARCHDOWN );
  947.         }else
  948.         {// fm auto search down
  949.             //Fmautosearchdown();
  950.             Fmautosearch( AUTOSEARCHDOWN );
  951.         }
  952.     }    
  953.     
  954. }   
  955. void d_ms(BYTE ms)
  956. {
  957.     delay_1ms(ms);
  958. }
  959. void disfreq(void)
  960. {
  961. #if !defined(TUNER_DISABLE_VIDEO)//xyy 2004-11-9
  962.     if(tuner.bandswitch) 
  963.     {
  964. psprintf(RegionValStr[2],"AM CH:%d %03d KHZ",tuner.am_ch+1,(tuner.ambak>>4)*3-450); //ITEM number
  965.     }
  966.     else
  967.     {
  968. //int x=tuner.fmbak*5-1070;
  969. int x = tuner.fmfreq[tuner.fm_ch]*5-1070;
  970. psprintf(RegionValStr[2],"FM CH:%d %d.%02d MHZ",tuner.fm_ch+1,x/100,x%100); //ITEM number
  971.     }
  972.     PrintOsdMsg(STR_OS_SPACE,0x2,0,1);
  973. #endif
  974.     vfd_set_power_state(0);
  975. }
  976. void  search(BYTE search_status)
  977.     tuner_mute(1);
  978.     
  979.     if(tuner.bandswitch)
  980.     {
  981. if(search_status==SEARCHADD)
  982. {
  983. tuner.ambak=(tuner.ambak+0x30);
  984. if(tuner.ambak>AM_FREQ_MAX)  tuner.ambak=AM_FREQ_MIN;
  985. }
  986. else if(search_status==SEARCHDEC)
  987. {
  988. tuner.ambak=(tuner.ambak-0x30);
  989. if(tuner.ambak<AM_FREQ_MIN)   tuner.ambak=AM_FREQ_MAX;
  990. }
  991. tuner.amfreq[tuner.am_ch] = tuner.ambak;
  992. set_freq(tuner.ambak);
  993.     }
  994.     else
  995.     {
  996. if(search_status==SEARCHADD)
  997. {
  998. tuner.fmbak=(tuner.fmbak+1);
  999. if(tuner.fmbak>FM_FREQ_MAX) tuner.fmbak=FM_FREQ_MIN;
  1000. }
  1001. else if(search_status==SEARCHDEC)
  1002. {
  1003. tuner.fmbak=(tuner.fmbak-1);
  1004. if(tuner.fmbak<FM_FREQ_MIN) tuner.fmbak=FM_FREQ_MAX;
  1005. }
  1006. tuner.fmfreq[tuner.fm_ch] = tuner.fmbak;
  1007. set_freq(tuner.fmbak);
  1008.     }
  1009.     disfreq();    
  1010.     tuner_mute_flag = 1; // auto demute after 500ms
  1011.     output_vfd_msg();
  1012.     write2mem = 1;
  1013. }
  1014. void output_vfd_msg(void)
  1015. {
  1016. int i;
  1017. polling();
  1018. #ifdef NEW_AUTO_SEARCH_ALL
  1019. for(i=0;i<4;i++)
  1020. #endif
  1021. {
  1022. polling_vfdr();         
  1023. //polling_vfd();    
  1024. }
  1025. }
  1026. void Fmautosearch( BYTE autosearch_status )
  1027. {
  1028. #ifndef TUNER_DISABLE_VIDEO///xyy 2004-11-9
  1029. #ifdef NEW_AUTO_SEARCH_ALL
  1030. psprintf(RegionValStr[1],"AUTO SCAN"); 
  1031.      PrintOsdMsg(STR_OS_SPACE,0x1,1,1);
  1032. #endif
  1033. #endif
  1034. if(!tuner.bandswitch)
  1035. {
  1036. while(1)
  1037. {                    
  1038. if( autosearch_status == AUTOSEARCHUP )
  1039. {
  1040. if(search_dir!=1)    //up
  1041. return;
  1042. tuner.fmbak=(tuner.fmbak+1); // 100K STEP, ref clock: 25k
  1043. if(tuner.fmbak>FM_FREQ_MAX)  //fm max 107.8MHZ
  1044. {
  1045. tuner.fmbak=FM_FREQ_MIN;//87.8Mhz,ref= 25khz
  1046. tuner_mute_flag=1;  // auto demute after 500 ms
  1047. break;
  1048. }
  1049. }else if( autosearch_status == AUTOSEARCHDOWN )
  1050. {
  1051. if(search_dir!=2)    //down
  1052. return;
  1053. tuner.fmbak=(tuner.fmbak-1);   //gap = 2. 100K STEP
  1054. if(tuner.fmbak<FM_FREQ_MIN)//fm min
  1055. {
  1056. tuner.fmbak=FM_FREQ_MAX;
  1057. tuner_mute_flag = 1;
  1058. break;
  1059. }
  1060. }  
  1061. tuner.fmfreq[tuner.fm_ch] = tuner.fmbak;
  1062. disfreq();
  1063. output_vfd_msg();
  1064. if(is_station())
  1065. {
  1066. write2mem = 1;
  1067. search_station = 1;//xyy 2004-3-12
  1068. #if defined(SUPPORT_STATION_INPUT)//xyy 2004-5-26
  1069. tuner_oper_mode = RECALL_OR_STORE;
  1070. timeout_vfd = 10000;
  1071. #endif
  1072. break;
  1073.       }
  1074.       }
  1075.   
  1076.       disfreq();
  1077.   }
  1078.   search_dir=0;
  1079. }  
  1080. void Amautosearch( BYTE autosearch_status )
  1081. {
  1082. #ifndef TUNER_DISABLE_VIDEO//xyy 2004-11-9 
  1083. #ifdef NEW_AUTO_SEARCH_ALL
  1084. psprintf(RegionValStr[1],"AUTO SCAN"); 
  1085.      PrintOsdMsg(STR_OS_SPACE,0x1,1,1);
  1086. #endif
  1087. #endif
  1088. if(tuner.bandswitch)//am
  1089. {
  1090. while(1)
  1091. {                    
  1092. output_vfd_msg();  
  1093. if( autosearch_status == AUTOSEARCHUP )
  1094. {
  1095. if(search_dir!=1)    //up
  1096. return;
  1097. tuner.ambak = (tuner.ambak + 0x30); // 3*3k step
  1098.                  if(tuner.ambak>AM_FREQ_MAX)  //am max
  1099. {
  1100. tuner.ambak=AM_FREQ_MIN;
  1101. tuner_mute_flag=1;  // auto demute after 500 ms
  1102. break;
  1103. }
  1104. }else if( autosearch_status == AUTOSEARCHDOWN )
  1105. {
  1106. if(search_dir!=2)    //down
  1107. return;
  1108. tuner.ambak=(tuner.ambak-0x30);   //gap = 3; 3*3K step
  1109. if(tuner.ambak<AM_FREQ_MIN)//Am min
  1110. {
  1111. tuner.ambak=AM_FREQ_MAX;
  1112. tuner_mute_flag=1;  // auto demute after 500 ms
  1113. break;
  1114. }
  1115. }  
  1116. tuner.amfreq[tuner.am_ch] = tuner.ambak;
  1117. disfreq();
  1118. if(is_station())
  1119. {
  1120. write2mem = 1;
  1121. search_station = 1;
  1122. #if defined(SUPPORT_STATION_INPUT)//xyy 2004-8-5
  1123. tuner_oper_mode = RECALL_OR_STORE;
  1124. timeout_vfd = 10000;
  1125. #endif
  1126. break; 
  1127. }        
  1128.       }
  1129.       disfreq();
  1130.   }
  1131.   search_dir=0;    
  1132. }
  1133.   
  1134.  
  1135. void save_tuner_E2PROM(void)
  1136. int test;
  1137. BYTE    *p;
  1138. #ifdef TUNER_DBG
  1139.     //printf("!!!run save_tuner_setup ,size:%dn",sizeof(t_tuner));
  1140. #endif
  1141.     
  1142.     p=(BYTE *)&tuner;    
  1143.     tuner.checksum = check_sum(p, (sizeof(tuner)-2));
  1144.     test=WriteToI2c(0xa0, TUNER_START,p, sizeof(t_tuner));
  1145.     
  1146. #ifdef TUNER_DBG
  1147. printf("save checksum %xn",tuner.checksum);
  1148. #endif      
  1149. }
  1150. void load_tuner_E2PROM(void)
  1151.     int     iRts;   
  1152.     BYTE    *p;
  1153.     
  1154.     //printf("load tuner e2promn");
  1155.     p=(BYTE *)&tuner;    
  1156.     iRts = ReadFromI2c(0xa0, TUNER_START,p, sizeof(t_tuner)); 
  1157.     if(iRts<0)
  1158.     {
  1159.      init_tuner_var();
  1160.      return;
  1161.     }
  1162.     if(tuner.checksum != check_sum(p, (sizeof(t_tuner)-2)))    
  1163.     {
  1164. #ifdef TUNER_DBG
  1165. //printf("checksum err! load defaultn");
  1166. #endif
  1167. init_tuner_var();
  1168. save_tuner_E2PROM();
  1169.     }
  1170. }
  1171. /*****************
  1172. Changed by xyy 2004-5-26
  1173. ******************/
  1174. #if defined(SUPPORT_STATION_INPUT)//xyy 2004-8-5
  1175. void init_tuner_var(void)
  1176. {
  1177.     int i;
  1178. printf("init varn");
  1179. for(i=0;i<MAX_MEM_BAND;i++)
  1180. {
  1181. tuner.fmfreq[i]=0x7de;
  1182. tuner.amfreq[i]=0x1470;
  1183. }
  1184. //tuner.memory_band_id[0]=1;
  1185. //tuner.memory_band_id[1]=1;
  1186. tuner.memory_status=NO_MEM_MODE;
  1187. tuner.bandswitch=0;    //0:fm, 1:am
  1188. tuner.Istuning[0]=1;
  1189. tuner.Istuning[1]=1;
  1190. tuner.ambak=0x1440;
  1191.     tuner.fmbak=0x7b2;
  1192. //    tuner.in2_data1=0x00;
  1193. //p = (BYTE *)&tuner;
  1194. //tuner.checksum = check_sum(p,sizeof(tuner));
  1195.     
  1196. #ifdef TUNER_DBG    
  1197.     //report_tuner_info();
  1198. #endif
  1199. }
  1200. #else
  1201. void init_tuner_var(void)
  1202. {
  1203.     const UINT16 fmfreq[MAX_MEM_BAND]={0x7de,0x802,0x86c,0x87e,0x91e,0x922,0x922,0x922,0x922,0x922,0x922,0x922,0x922,0x922,0x922,0x922,0x922,0x922,0x922,0x922};// 90.0 91.8 97.1 98.0 106.0 106.2
  1204.     const UINT16 amfreq[MAX_MEM_BAND]={0x1470,0x15f0,0x1e30,0x26a0,0x2ac0,0x2b20,0x2b20,0x2b20,0x2b20,0x2b20,0x2b20,0x2b20,0x2b20,0x2b20,0x2b20,0x2b20,0x2b20,0x2b20,0x2b20,0x2b20};//531 603 999 1404 1602 1620
  1205.     int i;
  1206.     //BYTE *p;
  1207. printf("init varn");
  1208. for(i=0;i<MAX_MEM_BAND;i++)
  1209. {
  1210. tuner.fmfreq[i]=fmfreq[i];
  1211. tuner.amfreq[i]=amfreq[i];
  1212. }
  1213. //tuner.memory_band_id[0]=1;
  1214. //tuner.memory_band_id[1]=1;
  1215. tuner.memory_status=NO_MEM_MODE;
  1216. tuner.bandswitch=0;    //0:fm, 1:am
  1217. tuner.Istuning[0]=1;
  1218. tuner.Istuning[1]=1;
  1219. tuner.ambak=0x1440;
  1220.     tuner.fmbak=0x7b2;
  1221. //    tuner.in2_data1=0x00;
  1222. //p = (BYTE *)&tuner;
  1223. //tuner.checksum = check_sum(p,sizeof(tuner));
  1224.     
  1225. #ifdef TUNER_DBG    
  1226.     //report_tuner_info();
  1227. #endif
  1228. }
  1229. #endif
  1230. #if defined(SUPPORT_STATION_INPUT)
  1231. /**********************
  1232. Changed by xyy 2004-5-24
  1233. **********************/
  1234. void tuner_func_input(void)     //xyy 2003-11-3 11:20
  1235. {
  1236. // if(tuner.memory_status==MEM_MODE)
  1237. if(tuner_oper_mode == RECALL_OR_STORE)
  1238. {
  1239. vfd_set_stationNm();
  1240. }
  1241. #if defined(SUPPORT_FREQ_DIRECT_CALL) 
  1242. else if(tuner_oper_mode == FREQ_DIRECT_CALL)//xyy 2004-7-28
  1243. {
  1244. if(tuner.bandswitch) 
  1245. vfd_set_amFreq_input();
  1246. else
  1247. vfd_set_fmFreq_input();
  1248. }
  1249. #endif
  1250. }
  1251. #endif
  1252. void tuner_st_mono(void) 
  1253. {
  1254. if(tuner.st_mono == 1)
  1255. {
  1256. tuner.st_mono = 0;
  1257. psprintf(RegionValStr[1],"MONO");
  1258. }
  1259. else
  1260. {
  1261. tuner.st_mono = 1;
  1262. psprintf(RegionValStr[1],"ST");
  1263. }
  1264. PrintOsdMsg(STR_OS_SPACE,0x1,1,1);
  1265. set_mono_stereo(tuner.st_mono);
  1266. write2mem=1;    
  1267. }
  1268. #ifdef SUPPORT_RDS_FUNCTION
  1269. disp_rds_func(BYTE enter_flag)
  1270. {
  1271. printf("flag %dn",enter_flag);
  1272.     if(enter_flag == 0)
  1273.     {
  1274.              psprintf(RegionValStr[REGION1],"PS :");
  1275.   PrintOsdMsg(0, REGION1, 1, 1);
  1276.         }
  1277.    
  1278.     else if(enter_flag == 1)
  1279.     {
  1280.      psprintf(RegionValStr[REGION1],"PTY :");
  1281.   PrintOsdMsg(0, REGION1, 1, 1);
  1282.     }
  1283.     
  1284.     else if(enter_flag == 2)
  1285. {
  1286.              psprintf(RegionValStr[REGION1],"RT :");
  1287.   PrintOsdMsg(0, REGION1, 1, 1);
  1288.         }
  1289.       else if(enter_flag == 3)
  1290.         {
  1291.        psprintf(RegionValStr[REGION1],"CT :");
  1292.   PrintOsdMsg(0, REGION1, 1, 1);
  1293.     }
  1294.     else if(enter_flag == 4)
  1295.      {
  1296.              psprintf(RegionValStr[REGION1],"PTYN :");
  1297. PrintOsdMsg(0, REGION1, 1, 1);
  1298.     }
  1299. }
  1300. void disp_rds(BYTE enter_flag)
  1301. {
  1302. char rds_disp_buf[65];
  1303.     if(enter_flag == 0)
  1304.     {
  1305.             if(RDS_PS_RDY())
  1306.             {
  1307.              psprintf(RegionValStr[REGION1],"PS : %s",rds_get_ps());
  1308.   PrintOsdMsg(0, REGION1, 1, 1);
  1309.   RDS_PS_CLR_RDY();
  1310.          }
  1311.         }
  1312.    
  1313.     else if(enter_flag == 1)
  1314.     {
  1315.             if(RDS_PTY_RDY())
  1316.             {
  1317.      psprintf(RegionValStr[REGION1],"PTY : %s",rds_get_pty());
  1318.   PrintOsdMsg(0, REGION1, 1, 1);
  1319.   RDS_PTY_CLR_RDY();
  1320.             }
  1321.     }
  1322.     
  1323.     else if(enter_flag == 2)
  1324. {
  1325.             if(RDS_RTA_RDY()||RDS_RTB_RDY())
  1326.             {
  1327.             memcpy(rds_disp_buf,rds_get_rt(RDS_RT_TYPE()),64);
  1328.              capitalize(rds_disp_buf, 0, 64);
  1329.   str_filter(rds_disp_buf, 64);
  1330.              psprintf(RegionValStr[REGION1],"RT : %s",rds_disp_buf);
  1331.   PrintOsdMsg(0, REGION1, 1, 1);
  1332.   RDS_RTA_CLR_RDY();
  1333.   RDS_RTB_CLR_RDY();
  1334.             }
  1335.         }
  1336.       else if(enter_flag == 3)
  1337.         {
  1338.             if(RDS_CT_RDY())
  1339.             {
  1340.        psprintf(RegionValStr[REGION1],"%s",rds_get_ct());
  1341.   PrintOsdMsg(0, REGION1, 1, 1);
  1342.   RDS_CT_CLR_RDY();
  1343.             }
  1344.     }
  1345.     else if(enter_flag == 4)
  1346.      {
  1347.          if(RDS_PTYN_RDY())
  1348.             {
  1349.              psprintf(RegionValStr[REGION1],"PTYN:%s",rds_get_ptyn());
  1350. PrintOsdMsg(0, REGION1, 1, 1);
  1351. RDS_PTYN_CLR_RDY();
  1352.             }
  1353.     }
  1354.     
  1355. }
  1356. #endif /*rds func*/