source: svn/trunk/newcon3bcm2_21bu/dta/src/settop_api/xds_ctrl.c

Last change on this file was 2, checked in by phkim, 11 years ago

1.phkim

  1. revision copy newcon3sk r27
  • Property svn:executable set to *
File size: 4.8 KB
Line 
1/***************************************************************************
2 *     Copyright (c) 2003-2006, Broadcom Corporation
3 *     All Rights Reserved
4 *     Confidential Property of Broadcom Corporation
5 *
6 *  THIS SOFTWARE MAY ONLY BE USED SUBJECT TO AN EXECUTED SOFTWARE LICENSE
7 *  AGREEMENT  BETWEEN THE USER AND BROADCOM.  YOU HAVE NO RIGHT TO USE OR
8 *  EXPLOIT THIS MATERIAL EXCEPT SUBJECT TO THE TERMS OF SUCH AN AGREEMENT.
9 *
10 * $brcm_Workfile:  $
11 * $brcm_Revision:  $
12 * $brcm_Date: $
13 *
14 * Module Description:
15 *
16 * Revision History:
17 *
18 * $brcm_Log:  $
19 *
20 ***************************************************************************/
21#include "xds_ctrl.h"
22#include "ministd.h"
23
24#ifdef BCM_DEBUG
25#define XDS_DBG(x)      BDBG_WRN(x)
26//      #define XDS_DBG(x)      ((void)0)
27#else
28        #define XDS_DBG(x)      ((void)0)
29#endif
30
31BDBG_MODULE(xds_ctrl);
32/*
33Summary:
34        initialize XDS processing.
35Description:
36        Setup XDS processing state.
37*/
38
39
40void xds_ctrl_init(xds_ctrl_t * p_xds                   /* uninitialized, allocated XDS reference */ 
41                                   )
42{
43        memset(p_xds,0,sizeof(xds_ctrl_t));
44}
45/*
46Summary:
47        Install XDS callback.
48Description:
49        Install XDS callback.
50*/
51
52
53void xds_ctrl_set_cb(xds_ctrl_t * p_xds,                        /* uninitialized, allocated XDS reference */ 
54                                   xds_callback_t cb)                   /* XDS callback or NULL */
55{
56        uint32_t flags;
57        flags = bos_enter_critical();
58        p_xds->xds_callback = cb;
59        bos_exit_critical(flags);
60}
61
62/*
63Summary:
64        Feed XDS characters.
65Description:
66        Feed line all line 21 field 2 character pairs for XDS processing..
67*/
68
69void xds_ctrl_feed(xds_ctrl_t * p_xds, unsigned char xds_char_0,  unsigned char xds_char_1)
70{
71//      XDS_DBG(("XDS(%d, 0x%02x, 0x%02x)\n",p_xds->xds_state,xds_char_0,xds_char_1));
72        if (p_xds->xds_state == eXDS_IDLE)
73        {
74                switch (xds_char_0)
75                {
76                case 0x01: case 0x02: p_xds->xds_class = eXDS_CLASS_CURRENT; break;
77                case 0x03: case 0x04: p_xds->xds_class = eXDS_CLASS_FUTURE; break;
78                case 0x05: case 0x06: p_xds->xds_class = eXDS_CLASS_CHANNEL; break;
79                case 0x07: case 0x08: p_xds->xds_class = eXDS_CLASS_MISC; break;
80                case 0x09: case 0x0A: p_xds->xds_class = eXDS_CLASS_PUBLIC; break;
81                case 0x0B: case 0x0C: p_xds->xds_class = eXDS_CLASS_RESERVED; break;
82                case 0x0D: case 0x0E: p_xds->xds_class = eXDS_CLASS_PRIVATE; break;
83                default: /* do nothing */break;
84                }
85
86                switch (xds_char_0)
87                {
88                case 0x01: case 0x03: case 0x05: case 0x07:     
89                case 0x09: case 0x0B: case 0x0D:       
90                                        p_xds->xds_len = 0; p_xds->xds_checksum = xds_char_0 + xds_char_1;
91                                       
92                case 0x02: case 0x04: case 0x06: case 0x08:     
93                case 0x0a: case 0x0c: case 0x0e:
94                       
95                        /* continue start code should not allow type to change */
96                        if (p_xds->xds_type != xds_char_1)
97                                p_xds->xds_len = 0;
98
99                        p_xds->xds_type = xds_char_1;
100                        p_xds->xds_state = eXDS_ACTIVE;
101                        break;
102                }
103        }else
104        {
105                /* Not XDS control code */
106                if ((xds_char_0 > 0x0f) && (xds_char_0 < 0x20))
107                {
108                        p_xds->xds_state = eXDS_IDLE;
109                }
110                else
111                {
112                        p_xds->xds_checksum += xds_char_0;
113                        p_xds->xds_checksum += xds_char_1;
114                        /* check for end control code */
115                        if (xds_char_0 == 0x0f)
116                        {
117                                /* validate checksum and send */
118                                if ((p_xds->xds_checksum & 0x7F) == 0)
119                                {
120                                        if (p_xds->xds_callback)
121                                        {
122                                                p_xds->xds_callback(p_xds->xds_class,p_xds->xds_type,p_xds->xds_data,p_xds->xds_len);
123                                        }else
124                                        {
125#ifdef BCM_DEBUG
126                                                switch(p_xds->xds_class)
127                                                {
128                                                case eXDS_CLASS_CURRENT:
129                                                        if (p_xds->xds_type == eXDS_TYPE_PROG_CONT)
130                                                        {
131                                                                int i;
132                                                                static int adv[2] = { 0,0};
133                                                               
134                                                                if ((adv[0] != p_xds->xds_data[0]) && (adv[1] != p_xds->xds_data[1]))
135                                                                {
136                                                                        adv[0] =  p_xds->xds_data[0]; 
137                                                                        adv[1] =  p_xds->xds_data[1]; 
138
139                                                                        XDS_DBG(("Advisory:  "));
140                                                                        for (i = 0; i < p_xds->xds_len; ++i)
141                                                                        {
142                                                                                XDS_DBG(("0x%02x ",p_xds->xds_data[i]));
143                                                                        }
144                                                                        XDS_DBG(("\n"));
145                                                                }
146                                                        }
147                                                        break;
148                                                case eXDS_CLASS_CHANNEL:
149                                                        if (p_xds->xds_type == eXDS_CH_CALL_LETTERS)
150                                                        {
151                                                                p_xds->xds_data[p_xds->xds_len] = 0;
152                                                                XDS_DBG(("Channel:  %s\n",(char*)p_xds->xds_data));
153                                                                break;
154                                                        }
155                                                        else if (p_xds->xds_type == eXDS_CH_TSID)
156                                                        {
157                                                                p_xds->xds_data[p_xds->xds_len] = 0;
158                                                                XDS_DBG(("TSID:  %s\n",(char*)p_xds->xds_data));
159                                                                break;
160                                                        }
161
162                                                case eXDS_CLASS_FUTURE:
163                                                case eXDS_CLASS_MISC:
164                                                case eXDS_CLASS_PUBLIC:
165                                                case eXDS_CLASS_RESERVED:
166                                                case eXDS_CLASS_PRIVATE:
167                                                default:
168                                                        XDS_DBG(("XDS(T: %d, C: %d,0x%02x,0x%02x,%d)\n",p_xds->xds_type,p_xds->xds_class,p_xds->xds_data[0],p_xds->xds_data[1],p_xds->xds_len));
169                                                        break;
170                                                }
171#endif /* BCM_DEBUG */
172                                        }
173                                }
174                                p_xds->xds_state = eXDS_IDLE;
175                        }
176                        else
177                        {
178                                /* add data bytes */
179                                if (p_xds->xds_len + 2 < MAX_MSG_LEN)
180                                {
181                                        p_xds->xds_data[p_xds->xds_len++] = xds_char_0;
182                                        p_xds->xds_data[p_xds->xds_len++] = xds_char_1;
183                                }
184                        }
185                }
186        }
187}
188
189
Note: See TracBrowser for help on using the repository browser.