Subversion Repositories spk

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
79 cycrow 1
//************************************************************************
2
//
3
// LCDScrollingText.cpp
4
//
5
// The CLCDScrollingText class draws scrolling text onto the LCD.
6
// 
7
// Logitech LCD SDK
8
//
9
// Copyright 2005 Logitech Inc.
10
//************************************************************************
11
 
12
#include "LCDScrollingText.h"
13
 
14
 
15
//************************************************************************
16
//
17
// CLCDScrollingText::CLCDScrollingText
18
//
19
//************************************************************************
20
 
21
CLCDScrollingText::CLCDScrollingText()
22
{
23
    m_eState = STATE_START_DELAY;
24
    m_eScrollDir = SCROLL_HORZ;
25
    m_bRepeat = TRUE;
26
}
27
 
28
 
29
//************************************************************************
30
//
31
// CLCDScrollingText::~CLCDScrollingText
32
//
33
//************************************************************************
34
 
35
CLCDScrollingText::~CLCDScrollingText()
36
{
37
 
38
}
39
 
40
 
41
//************************************************************************
42
//
43
// CLCDScrollingText::Initialize
44
//
45
//************************************************************************
46
 
47
HRESULT CLCDScrollingText::Initialize(void)
48
{
49
    m_dwStartDelay  = 1000;
50
    m_dwSpeed       = 30;
51
    m_nScrollingDistance = -1;
52
    m_dwLastUpdate = 0;
53
    m_dwEllapsedTime = 0;
54
    m_dwLastUpdate = GetTickCount();
55
    m_fTotalDistance = 0;
56
    m_eScrollDir = SCROLL_HORZ;
57
    m_dwEndDelay = 1000;
58
    m_bRepeat = TRUE;
59
 
60
    return CLCDText::Initialize();
61
}
62
 
63
 
64
//************************************************************************
65
//
66
// CLCDScrollingText::ResetUpdate
67
//
68
//************************************************************************
69
 
70
void CLCDScrollingText::ResetUpdate(void)
71
{
72
    m_eState = STATE_START_DELAY;
73
    m_dwEllapsedTime = 0;
74
    m_dwLastUpdate = GetTickCount();
75
    m_nScrollingDistance = -1;
76
    m_fTotalDistance = 0;
77
    SetLeftMargin(0);
78
    SetLogicalOrigin(0, 0);
79
 
80
    CLCDText::ResetUpdate();
81
}
82
 
83
 
84
//************************************************************************
85
//
86
// CLCDScrollingText::SetStartDelay
87
//
88
//************************************************************************
89
 
90
void CLCDScrollingText::SetStartDelay(DWORD dwMilliseconds)
91
{
92
    m_dwStartDelay = dwMilliseconds;
93
}
94
 
95
 
96
//************************************************************************
97
//
98
// CLCDScrollingText::SetEndDelay
99
//
100
//************************************************************************
101
 
102
void CLCDScrollingText::SetEndDelay(DWORD dwMilliseconds)
103
{
104
    m_dwEndDelay = dwMilliseconds;
105
}
106
 
107
 
108
//************************************************************************
109
//
110
// CLCDScrollingText::SetSpeed
111
//
112
//************************************************************************
113
 
114
void CLCDScrollingText::SetSpeed(DWORD dwSpeed)
115
{
116
    m_dwSpeed = dwSpeed;
117
}
118
 
119
 
120
//************************************************************************
121
//
122
// CLCDScrollingText::SetScrollDirection
123
//
124
//************************************************************************
125
 
126
void CLCDScrollingText::SetScrollDirection(eSCROLL_DIR eScrollDir)
127
{
128
    m_eScrollDir = eScrollDir;
129
    SetWordWrap(eScrollDir == SCROLL_VERT);
130
    ResetUpdate();
131
}
132
 
133
 
134
//************************************************************************
135
//
136
// CLCDScrollingText::GetScrollDirection
137
//
138
//************************************************************************
139
 
140
CLCDScrollingText::eSCROLL_DIR CLCDScrollingText::GetScrollDirection()
141
{
142
    return m_eScrollDir;
143
}
144
 
145
 
146
//************************************************************************
147
//
148
// CLCDScrollingText::SetText
149
//
150
//************************************************************************
151
 
152
void CLCDScrollingText::SetText(LPCTSTR szText)
153
{
154
    if (_tcscmp(szText, m_sText.c_str()))
155
    {
156
        ResetUpdate();
157
    }
158
 
159
    CLCDText::SetText(szText);
160
}
161
 
162
 
163
//************************************************************************
164
//
165
// CLCDScrollingText::IsScrollingDone
166
//
167
//************************************************************************
168
 
169
BOOL CLCDScrollingText::IsScrollingDone()
170
{
171
    return (STATE_DONE == m_eState);
172
}
173
 
174
 
175
//************************************************************************
176
//
177
// CLCDScrollingText::EnableRepeat
178
//
179
//************************************************************************
180
 
181
void CLCDScrollingText::EnableRepeat(BOOL bEnable)
182
{
183
    m_bRepeat = bEnable;
184
}
185
 
186
 
187
//************************************************************************
188
//
189
// CLCDScrollingText::OnUpdate
190
//
191
//************************************************************************
192
 
193
void CLCDScrollingText::OnUpdate(DWORD dwTimestamp)
194
{
195
    m_dwEllapsedTime = (dwTimestamp - m_dwLastUpdate);
196
}
197
 
198
 
199
//************************************************************************
200
//
201
// CLCDScrollingText::OnDraw
202
//
203
//************************************************************************
204
 
205
void CLCDScrollingText::OnDraw(CLCDGfx &rGfx)
206
{
207
    if (!m_nTextLength)
208
        return;
209
 
210
    // calculate the scrolling distance
211
    if (-1 == m_nScrollingDistance)
212
    {
213
        CLCDText::OnDraw(rGfx);
214
 
215
        if (SCROLL_VERT == m_eScrollDir)
216
        { 
217
            // determine how far we have to travel until scrolling stops
218
            m_nScrollingDistance = ((GetHeight()) >= GetVExtent().cy) ?
219
 
220
            SetLogicalSize(GetVExtent().cx, GetVExtent().cy);
221
        }
222
        else
223
        {
224
            // determine how far we have to travel until scrolling stops
225
            m_nScrollingDistance = ((GetWidth()) >= GetHExtent().cx) ?
226
 
227
            SetLogicalSize(max(GetSize().cx, GetHExtent().cx), GetHExtent().cy);
228
        }
229
    }
230
 
231
    switch(m_eState)
232
    {
233
    case STATE_START_DELAY:
234
        if (m_dwEllapsedTime > m_dwStartDelay)
235
        {
236
            m_eState = STATE_SCROLL;
237
            m_dwEllapsedTime = 0;
238
            m_dwLastUpdate = GetTickCount();
239
        }
240
        break;
241
    case STATE_END_DELAY:
242
        if (m_dwEllapsedTime > m_dwEndDelay)
243
        {
244
            if (m_bRepeat)
245
            {
246
                ResetUpdate();
247
                break;
248
            }
249
            m_dwEllapsedTime = 0;
250
            m_dwLastUpdate = GetTickCount();
251
            m_eState = STATE_DONE;
252
        }
253
        break;
254
    case STATE_SCROLL:
255
        {
256
            // TODO: add some anti-aliasing on the movement
257
 
258
            // how much time has ellapsed?
259
            // given the speed, what is the total displacement?
260
            float fDistance = (float)(m_dwSpeed * m_dwEllapsedTime) / 1000.0f;
261
            m_fTotalDistance += fDistance;
262
 
263
            // we dont want the total distnace exceed our scrolling distance
264
            int nTotalOffset = min((int)m_fTotalDistance, m_nScrollingDistance);
265
 
266
            if (SCROLL_VERT == m_eScrollDir)
267
            {
268
                SetLogicalOrigin(GetLogicalOrigin().x, -1 * nTotalOffset);
269
            }
270
            else
271
            {
272
                SetLogicalOrigin(-1 * nTotalOffset, GetLogicalOrigin().y);
273
            }
274
 
275
            m_dwLastUpdate = GetTickCount();
276
 
277
            if (nTotalOffset == m_nScrollingDistance)
278
            {
279
                m_eState = STATE_END_DELAY;
280
            }
281
        }
282
        break;
283
    case STATE_DONE:
284
        break;
285
 
286
    default:
287
        break;
288
    }
289
 
290
    CLCDText::OnDraw(rGfx);
291
}
292
 
293
 
294
//** end of LCDScrollingText.cpp *****************************************