📄 gpstracerappwmce5.aspx.htm
字号:
<pre lang="cs"> <span class="code-keyword">public</span> Form1()
{
InitializeComponent();
m_graphics = <span class="code-keyword">this</span>.CreateGraphics();
m_mapper = <span class="code-keyword">new</span> Mapper(m_graphics, <span class="code-digit">0</span>, <span class="code-digit">30</span>, <span class="code-digit">240</span>, <span class="code-digit">300</span>);
m_rTh = <span class="code-keyword">new</span> reader(m_port);
m_rTh.dataReceived += <span class="code-keyword">new</span> reader.DataReceivedEventHandler(parse);
}
</pre>
<p>The event registered method is called on the <code>DataReceived</code> event. With <code>m_isDemoMode==True</code>, the application will generate a randoom coordinate. </p>
<pre lang="cs"> <span class="code-keyword">public</span> <span class="code-keyword">void</span> parse(<span class="code-SDKkeyword">String</span> readed)
{
<span class="code-keyword">if</span> (!m_isDemoMode)
{
m_mapper.parseAndDraw(readed);
}
<span class="code-keyword">else</span>
{
Random r = <span class="code-keyword">new</span> Random();
<span class="code-SDKkeyword">String</span> rSecond1 = (<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">10</span> - <span class="code-digit">1</span>) + <span class="code-string">"</span><span class="code-string">"</span> +
(<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">10</span> - <span class="code-digit">1</span>) + <span class="code-string">"</span><span class="code-string">"</span> +
(<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">10</span> - <span class="code-digit">1</span>) + <span class="code-string">"</span><span class="code-string">"</span> +
(<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">10</span> - <span class="code-digit">1</span>);
<span class="code-SDKkeyword">String</span> rSecond2 = (<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">10</span> - <span class="code-digit">1</span>) + <span class="code-string">"</span><span class="code-string">"</span> +
(<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">10</span> - <span class="code-digit">1</span>) + <span class="code-string">"</span><span class="code-string">"</span> +
(<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">10</span> - <span class="code-digit">1</span>) + <span class="code-string">"</span><span class="code-string">"</span> +
(<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">10</span> - <span class="code-digit">1</span>);
<span class="code-SDKkeyword">String</span> rPrime1 = (<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">1</span> - <span class="code-digit">1</span>) + <span class="code-string">"</span><span class="code-string">"</span>;
<span class="code-SDKkeyword">String</span> rPrime2 = (<span class="code-keyword">int</span>)(r.NextDouble() * <span class="code-digit">1</span> - <span class="code-digit">1</span>) + <span class="code-string">"</span><span class="code-string">"</span>;
m_mapper.drawLatLong(<span class="code-string">"</span><span class="code-string">434"</span> + rPrime1 + <span class="code-string">"</span><span class="code-string">."</span> + rSecond1,
<span class="code-string">"</span><span class="code-string">0111"</span> + rPrime2 + <span class="code-string">"</span><span class="code-string">."</span> + rSecond2);
}
}</pre>
<p>This is the method that starts and stops the <code>Readed</code> thread. </p>
<pre lang="cs"> <span class="code-keyword">private</span> <span class="code-keyword">void</span> menuItemRunStop_Click(<span class="code-keyword">object</span> sender, EventArgs e)
{
<span class="code-keyword">if</span> (m_isRunning)
{
m_rTh.stop();
}
<span class="code-keyword">else</span>
{
m_rTh.start();
}
menuItemRunStop.Checked = !menuItemRunStop.Checked;
m_isRunning = !m_isRunning;
}</pre>
<p>This is the region that solves problem of panning the map on your touchscreen device. You can enable <code>m_mapper.clearAndDraw()</code> and it will clear the screen before it redraws the moved map. </p>
<div class="SmallText" id="premain3" style="width: 100%;"><img preid="3" src="GpsTracerAppWMCE5.aspx_files/minus.gif" id="preimg3" height="9" width="9"><span preid="3" style="margin-bottom: 0pt;" id="precollapse3"> Collapse</span></div><pre style="margin-top: 0pt;" id="pre3" lang="cs"> <span class="code-preprocessor">#region</span> Panning
<span class="code-keyword">private</span> Point touch;
<span class="code-keyword">private</span> <span class="code-keyword">void</span> Form1_MouseMove(<span class="code-keyword">object</span> sender, MouseEventArgs e)
{
<span class="code-keyword">if</span> (m_mapper != <span class="code-keyword">null</span>)
{
m_mapper.moveCenter(touch.X - e.X, touch.Y - e.Y);
m_mapper.draw();<span class="code-comment">//</span><span class="code-comment">m_mapper.clearAndDraw();
</span>
}
touch.X = e.X;
touch.Y = e.Y;
}
<span class="code-keyword">private</span> <span class="code-keyword">void</span> Form1_MouseDown(<span class="code-keyword">object</span> sender, MouseEventArgs e)
{
touch.X = e.X;
touch.Y = e.Y;
}
<span class="code-keyword">private</span> <span class="code-keyword">void</span> Form1_MouseUp(<span class="code-keyword">object</span> sender, MouseEventArgs e)
{
Form1_MouseMove(sender, e);
m_mapper.clearAndDraw();
}
<span class="code-preprocessor">#endregion</span></pre>
<h3>Reader</h3>
<p>Event exposed to <code>Form</code> on data received: </p>
<pre lang="cs"> <span class="code-keyword">public</span> <span class="code-keyword">delegate</span> <span class="code-keyword">void</span> DataReceivedEventHandler(<span class="code-keyword">string</span> data);
<span class="code-keyword">public</span> <span class="code-keyword">event</span> DataReceivedEventHandler dataReceived;
</pre>
<p>The thread method that reads on serial port: </p>
<pre lang="cs"> <span class="code-keyword">private</span> <span class="code-keyword">void</span> methodTh()
{
m_serialPort1.Open();
<span class="code-keyword">byte</span>[] buffer= <span class="code-keyword">new</span> <span class="code-keyword">byte</span>[<span class="code-digit">100</span>];
<span class="code-keyword">while</span> (m_run)
{
Thread.Sleep(<span class="code-digit">500</span>);
m_readed = m_serialPort1.ReadLine();
<span class="code-keyword">if</span> (m_readed.Length > <span class="code-digit">0</span>)
{
dataReceived(m_readed);
}
}
}</pre>
<p>These methods allow the <code>Form</code> to start and stop the reader thread: </p>
<pre lang="cs"> <span class="code-keyword">public</span> <span class="code-keyword">void</span> start()
{
<span class="code-keyword">if</span> (m_th == <span class="code-keyword">null</span>)
{
m_th = <span class="code-keyword">new</span> Thread(methodTh);
}
m_run = <span class="code-keyword">true</span>;
m_th.Start();
}
<span class="code-keyword">public</span> <span class="code-keyword">void</span> stop()
{
m_run = <span class="code-keyword">false</span>;
Thread.Sleep(<span class="code-digit">500</span>);
m_serialPort1.Close();
<span class="code-keyword">if</span> (m_th != <span class="code-keyword">null</span>)
{
m_th.Abort();
m_th = <span class="code-keyword">null</span>;
}
}</pre>
<h3>Mapper</h3>
<p>Now follow me through the <code>Mapper</code> section. This is a simple method that parses the data read from the <code>Reader</code>. It's called by the <code>Form</code> on a <code>DataReceivedEvent</code>.</p>
<div class="SmallText" id="premain7" style="width: 100%;"><img preid="7" src="GpsTracerAppWMCE5.aspx_files/minus.gif" id="preimg7" height="9" width="9"><span preid="7" style="margin-bottom: 0pt;" id="precollapse7"> Collapse</span></div><pre style="margin-top: 0pt;" id="pre7" lang="cs"> <span class="code-keyword">public</span> <span class="code-keyword">void</span> parseAndDraw(<span class="code-keyword">string</span> s)
{
<span class="code-keyword">string</span>[] Words = s.Split(<span class="code-string">'</span><span class="code-string">,'</span>);
m_g.FillRectangle(m_bgBrush, <span class="code-keyword">new</span> Rectangle(m_clip.X,
m_clip.Y + <span class="code-digit">5</span>, m_clip.Width, <span class="code-digit">15</span>));
m_g.DrawString(s, m_font,m_fontBrush, <span class="code-keyword">new</span> RectangleF(m_clip.X ,
m_clip.Y + <span class="code-digit">5</span>, m_clip.Width, <span class="code-digit">15</span>));
<span class="code-keyword">switch</span> (Words[<span class="code-digit">0</span>])
{
<span class="code-keyword">case</span> <span class="code-string">"</span><span class="code-string">$GPRMC"</span>:
<span class="code-comment">//</span><span class="code-comment"> $GPRMC,170111,A,4338.5810,N,07015.1010,W,000.0,
</span>
<span class="code-comment">//</span><span class="code-comment"> 360.0,060199,017.5,W*73
</span>
<span class="code-comment">//</span><span class="code-comment"> RMC - Recommended minimum specific GPS/Transit data
</span>
<span class="code-keyword">if</span> (Words[<span class="code-digit">3</span>].Length > <span class="code-digit">0</span> && Words[<span class="code-digit">5</span>].Length > <span class="code-digit">0</span>)
{
drawLatLong(Words[<span class="code-digit">3</span>], Words[<span class="code-digit">5</span>]);
}
<span class="code-keyword">break</span>;
<span class="code-keyword">case</span> <span class="code-string">"</span><span class="code-string">$GPGSV"</span>:
<span class="code-comment">//</span><span class="code-comment"> $GPGSV,2,1,08,03,17,171,42,06,21,047,44,14,
</span>
<span class="code-comment">//</span><span class="code-comment"> 28,251,45,16,25,292,44*71
</span>
<span class="code-comment">//</span><span class="code-comment"> GSV - Satellites in view
</span>
<span class="code-keyword">break</span>;
<span class="code-keyword">case</span> <span class="code-string">"</span><span class="code-string">$GPGSA"</span>:
<span class="code-comment">//</span><span class="code-comment"> $GPGGA,170111,4338.581,N,07015.101,W,1,
</span>
<span class="code-digit">00</span>,<span class="code-digit">2</span>.<span class="code-digit">0</span>,<span class="code-digit">1</span>.<span class="code-digit">1</span>,M,-31.<span class="code-digit">8</span>,M,,*71
<span class="code-comment">//</span><span class="code-comment">GSA - GPS dilution of precision and active satellites
</span>
<span class="code-keyword">break</span>;
<span class="code-keyword">default</span>:
<span class="code-keyword">break</span>;
}
}</pre>
<p>The <code>drawLatLong()</code> method allows conversion of the latitude and longitude data. In the example, <code>latitude:<span class="code-digit">43</span> <span class="code-digit">38</span>.<span class="code-digit">5810</span></code> will be converted to <code><span class="code-digit">162710</span></code> using the formula <code><span class="code-digit">43</span>*360+34*60+5810</code>. At the end of parsing and conversion, it will add the data to the <code><span class="code-keyword">private</span> List<span class="code-keyword"><</span>POINT<span class="code-keyword">></span> m_points;</code> and later it will call the method <code>draw()</code>.
This method will draw all of the lines that were not drawn before.
Obviously, on pan or application start this method will draw all
points. </p>
<div class="SmallText" id="premain8" style="width: 100%;"><img preid="8" src="GpsTracerAppWMCE5.aspx_files/minus.gif" id="preimg8" height="9" width="9"><span preid="8" style="margin-bottom: 0pt;" id="precollapse8"> Collapse</span></div><pre style="margin-top: 0pt;" id="pre8" lang="cs"><span class="code-keyword">public</span> <span class="code-keyword">void</span> drawLatLong(<span class="code-keyword">string</span> latitude, <span class="code-keyword">string</span> longitude)
{
Point aPoint = <span class="code-keyword">new</span> Point();
aPoint.X =
(Convert.ToInt32(latitude.Substring(latitude.Length - <span class="code-digit">4</span>, <span class="code-digit">4</span>)));
aPoint.Y =
(Convert.ToInt32(longitude.Substring(longitude.Length - <span class="code-digit">4</span>, <span class="code-digit">4</span>)));
aPoint.X +=
(Convert.ToInt32(latitude.Substring(latitude.Length - <span class="code-digit">7</span>, <span class="code-digit">2</span>))) * <span class="code-digit">60</span>;
aPoint.Y +=
(Convert.ToInt32(longitude.Substring(longitude.Length - <span class="code-digit">7</span>, <span class="code-digit">2</span>))) * <span class="code-digit">60</span>;
aPoint.X +=
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -