0% found this document useful (0 votes)
8 views26 pages

Firmware 2main 8c-Source

Download as txt, pdf, or txt
Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1/ 26

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.

01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>Dulcimer: firmware/main.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.5.4 -->
<div class="tabs">
<ul>
<li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
<li><a href="annotated.html"><span>Data&nbsp;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<h1>firmware/main.c</h1><a href="firmware_2main_8c.html">Go to the documentation of
this file.</a><div class="fragment"><pre class="fragment"><a
name="l00001"></a>00001
<a name="l00207"></a><a class="code"
href="firmware_2main_8c.html#43bafb28b29491ec7f871319b5a3b2f8">00207</a> <span
class="preprocessor">#define F_CPU 12000000L </span>
<a name="l00208"></a>00208 <span class="preprocessor"></span>
<a name="l00209"></a>00209 <span class="preprocessor"></span><span
class="preprocessor">#include &lt;avr/io.h&gt;</span>
<a name="l00210"></a>00210 <span class="preprocessor">#include
&lt;avr/interrupt.h&gt;</span>
<a name="l00211"></a>00211 <span class="preprocessor">#include
&lt;avr/pgmspace.h&gt;</span>
<a name="l00212"></a>00212 <span class="preprocessor">#include
&lt;avr/wdt.h&gt;</span>
<a name="l00213"></a>00213 <span class="preprocessor">#include
&lt;util/delay.h&gt;</span>
<a name="l00214"></a>00214 <span class="preprocessor">#include
&lt;string.h&gt;</span>
<a name="l00215"></a>00215 <span class="preprocessor">#include
&lt;stdio.h&gt;</span>
<a name="l00216"></a>00216
<a name="l00217"></a>00217 <span class="preprocessor">#include "usbdrv.h"</span>
<a name="l00218"></a>00218 <span class="preprocessor">#include "<a class="code"
href="keycodes_8h.html" title="This file contains modifier- and keycode definitions
according to the USB-specifications...">keycodes.h</a>"</span>
<a name="l00219"></a>00219
<a name="l00220"></a>00220 <span class="comment">/* -----------------------
hardware I/O abstraction ------------------------ */</span>
<a name="l00221"></a>00221
<a name="l00222"></a>00222
<a name="l00223"></a><a class="code"
href="firmware_2main_8c.html#cbd3f71ae519660472d571c6991b45a7">00223</a> <span
class="preprocessor">#define PORTCOLUMNS PORTB </span>
<a name="l00224"></a><a class="code"
href="firmware_2main_8c.html#82f68a695f5614aec3177e08d31ce7c4">00224</a> <span
class="preprocessor">#define PINCOLUMNS PINB </span>
<a name="l00225"></a><a class="code"
href="firmware_2main_8c.html#3d5944be3fc9f1c33a00fe64c7b5dfa8">00225</a> <span
class="preprocessor">#define DDRCOLUMNS DDRB </span>
<a name="l00226"></a><a class="code"
href="firmware_2main_8c.html#2fb9b8c5860d621137c96ef9dd7a3176">00226</a> <span
class="preprocessor">#define PORTROWS1 PORTA </span>
<a name="l00227"></a><a class="code"
href="firmware_2main_8c.html#f69ec60ca24d74cd54bb3072429179ff">00227</a> <span
class="preprocessor">#define PINROWS1 PINA </span>
<a name="l00228"></a><a class="code"
href="firmware_2main_8c.html#054b4efed1b9fe12d1c162ab6eb3e12c">00228</a> <span
class="preprocessor">#define DDRROWS1 DDRA </span>
<a name="l00229"></a><a class="code"
href="firmware_2main_8c.html#b930861e78c97023f7f919abab96d57b">00229</a> <span
class="preprocessor">#define PORTROWS2 PORTC </span>
<a name="l00230"></a><a class="code"
href="firmware_2main_8c.html#f3d4ffa580843706c4cb46193942ef05">00230</a> <span
class="preprocessor">#define PINROWS2 PINC </span>
<a name="l00231"></a><a class="code"
href="firmware_2main_8c.html#257249c4c5913255d7f78061c5c789ce">00231</a> <span
class="preprocessor">#define DDRROWS2 DDRC </span>
<a name="l00232"></a>00232 <span class="preprocessor"></span>
<a name="l00233"></a><a class="code"
href="firmware_2main_8c.html#1fc9fdc7dac7819e697429072f86d3de">00233</a> <span
class="preprocessor"></span><span class="preprocessor">#define PORTLEDS PORTD
</span>
<a name="l00234"></a><a class="code"
href="firmware_2main_8c.html#bbdadb5969e83f332dfb34029d143b98">00234</a> <span
class="preprocessor">#define PINLEDS PIND </span>
<a name="l00235"></a><a class="code"
href="firmware_2main_8c.html#5e47233d3a02fa30d2ce44d60c058926">00235</a> <span
class="preprocessor">#define DDRLEDS DDRD </span>
<a name="l00236"></a><a class="code"
href="firmware_2main_8c.html#87ad17ac607cd11c6852ee2687580ac8">00236</a> <span
class="preprocessor">#define LEDSCROLL PIND4 </span>
<a name="l00237"></a><a class="code"
href="firmware_2main_8c.html#a1ebb1ee7d6ccd52c5ce53def057e544">00237</a> <span
class="preprocessor">#define LEDCAPS PIND5 </span>
<a name="l00238"></a><a class="code"
href="firmware_2main_8c.html#070b1a39c765aebc0d4a8353731224e6">00238</a> <span
class="preprocessor">#define LEDNUM PIND6 </span>
<a name="l00239"></a>00239 <span class="preprocessor"></span>
<a name="l00240"></a><a class="code"
href="firmware_2main_8c.html#67297b400546c47d7a4d559747b55e9e">00240</a> <span
class="preprocessor"></span><span class="preprocessor">#define PORTJUMPERS PORTD
</span>
<a name="l00241"></a><a class="code"
href="firmware_2main_8c.html#84ff5b11aa05f0a8e7fdd7e96f5c4176">00241</a> <span
class="preprocessor">#define PINJUMPERS PIND </span>
<a name="l00242"></a><a class="code"
href="firmware_2main_8c.html#3fdbed5110af4df594238e28a387feb4">00242</a> <span
class="preprocessor">#define DDRJUMPERS DDRD </span>
<a name="l00243"></a><a class="code"
href="firmware_2main_8c.html#f70b2d39906342546418e16f30164bd5">00243</a> <span
class="preprocessor">#define JUMPER0 PD1 </span>
<a name="l00244"></a><a class="code"
href="firmware_2main_8c.html#6e6cf6eedfdcc5f2127642dcfda327b6">00244</a> <span
class="preprocessor">#define JUMPER1 PD3 </span>
<a name="l00245"></a><a class="code"
href="firmware_2main_8c.html#0ee74732a6d7f3c5fbe4df0b02d036b4">00245</a> <span
class="preprocessor">#define JUMPER2 PD7 </span>
<a name="l00246"></a>00246 <span class="preprocessor"></span>
<a name="l00247"></a>00247 <span class="preprocessor"></span>
<a name="l00251"></a>00251 <span class="keyword">static</span> <span
class="keywordtype">void</span> hardwareInit(<span class="keywordtype">void</span>)
{
<a name="l00252"></a>00252 <span class="comment">// column-port is input</span>
<a name="l00253"></a>00253 <a class="code"
href="firmware_2main_8c.html#cbd3f71ae519660472d571c6991b45a7" title="port on which
we read the state of the columns">PORTCOLUMNS</a> = 0xff;
<a name="l00254"></a>00254 <a class="code"
href="firmware_2main_8c.html#3d5944be3fc9f1c33a00fe64c7b5dfa8" title="port on which
we read the state of the columns">DDRCOLUMNS</a> = 0x00;
<a name="l00255"></a>00255
<a name="l00256"></a>00256 <span class="comment">// row-ports are output</span>
<a name="l00257"></a>00257 <a class="code"
href="firmware_2main_8c.html#2fb9b8c5860d621137c96ef9dd7a3176" title="first port
connected to the matrix rows">PORTROWS1</a> = 0xff;
<a name="l00258"></a>00258 <a class="code"
href="firmware_2main_8c.html#054b4efed1b9fe12d1c162ab6eb3e12c" title="first port
connected to the matrix rows">DDRROWS1</a> = 0x00;
<a name="l00259"></a>00259 <a class="code"
href="firmware_2main_8c.html#b930861e78c97023f7f919abab96d57b" title="second port
connected to the matrix rows">PORTROWS2</a> = 0xff;
<a name="l00260"></a>00260 <a class="code"
href="firmware_2main_8c.html#257249c4c5913255d7f78061c5c789ce" title="second port
connected to the matrix rows">DDRROWS2</a> = 0x00;
<a name="l00261"></a>00261
<a name="l00262"></a>00262 <span class="comment">// port D contains USB (D0,
D2),</span>
<a name="l00263"></a>00263 <span class="comment">// LEDs (D4,
D5, D6)</span>
<a name="l00264"></a>00264 <span class="comment">// and Jumpers
(D1, D3, D7),</span>
<a name="l00265"></a>00265 <span class="comment">// so we call it PORTD instead
of PORTJUMPERS or PORTLEDS</span>
<a name="l00266"></a>00266 PORTD = 0xfa; <span class="comment">// 1000
1010: activate pull-ups except on USB- and LED-lines</span>
<a name="l00267"></a>00267 DDRD = 0x75; <span class="comment">// 0111
0101: all pins input except USB (-&gt; USB reset) and LED-pins</span>
<a name="l00268"></a>00268 <span class="comment">// USB
Reset by device only required on Watchdog Reset</span>
<a name="l00269"></a>00269 _delay_us(11); <span class="comment">// delay
&gt;10ms for USB reset</span>
<a name="l00270"></a>00270 DDRD = 0x70; <span class="comment">// 0111
0000 bin: remove USB reset condition</span>
<a name="l00271"></a>00271
<a name="l00272"></a>00272 <span class="comment">// configure timer 0 for a
rate of 12M/(1024 * 256) = 45.78Hz (~22ms)</span>
<a name="l00273"></a>00273 TCCR0 = 5; <span class="comment">// timer 0
prescaler: 1024</span>
<a name="l00274"></a>00274
<a name="l00275"></a>00275 <span class="comment">// blink, to indicate power-
on</span>
<a name="l00276"></a>00276 <a class="code"
href="firmware_2main_8c.html#1fc9fdc7dac7819e697429072f86d3de" title="port on which
the LEDs are connected">PORTLEDS</a> &amp;= ~((1 &lt;&lt; <a class="code"
href="firmware_2main_8c.html#070b1a39c765aebc0d4a8353731224e6" title="address of
the num-lock LED">LEDNUM</a>) | (1 &lt;&lt; <a class="code"
href="firmware_2main_8c.html#a1ebb1ee7d6ccd52c5ce53def057e544" title="address of
the caps-lock LED">LEDCAPS</a>) | (1 &lt;&lt; <a class="code"
href="firmware_2main_8c.html#87ad17ac607cd11c6852ee2687580ac8" title="address of
the scroll-lock LED">LEDSCROLL</a>));
<a name="l00277"></a>00277 _delay_ms(50);
<a name="l00278"></a>00278 <a class="code"
href="firmware_2main_8c.html#1fc9fdc7dac7819e697429072f86d3de" title="port on which
the LEDs are connected">PORTLEDS</a> |= ((1 &lt;&lt; <a class="code"
href="firmware_2main_8c.html#070b1a39c765aebc0d4a8353731224e6" title="address of
the num-lock LED">LEDNUM</a>) | (1 &lt;&lt; <a class="code"
href="firmware_2main_8c.html#a1ebb1ee7d6ccd52c5ce53def057e544" title="address of
the caps-lock LED">LEDCAPS</a>) | (1 &lt;&lt; <a class="code"
href="firmware_2main_8c.html#87ad17ac607cd11c6852ee2687580ac8" title="address of
the scroll-lock LED">LEDSCROLL</a>));
<a name="l00279"></a>00279 }
<a name="l00280"></a>00280
<a name="l00281"></a>00281 <span class="comment">/*
------------------------------------------------------------------------- */</span>
<a name="l00282"></a>00282 <span class="comment">/* -----------------------------
USB interface ----------------------------- */</span>
<a name="l00283"></a>00283 <span class="comment">/*
------------------------------------------------------------------------- */</span>
<a name="l00284"></a>00284
<a name="l00285"></a>00285 <span class="keyword">static</span> uint8_t
reportBuffer[8];
<a name="l00286"></a>00286 <span class="keyword">static</span> uint8_t idleRate;
<a name="l00287"></a>00287 <span class="keyword">static</span> uint8_t protocolVer
= 1;
<a name="l00288"></a><a class="code"
href="firmware_2main_8c.html#f1cf86b4d81c490f25ab516aed0742f0">00288</a> uint8_t <a
class="code" href="firmware_2main_8c.html#f1cf86b4d81c490f25ab516aed0742f0"
title="flag to indicate if we expect an USB-report">expectReport</a> = 0;
<a name="l00289"></a>00289
<a name="l00290"></a><a class="code"
href="firmware_2main_8c.html#77440c4104ae0a7368936ff87a3d3260">00290</a> <span
class="preprocessor">#define LED_NUM 0x01 </span>
<a name="l00291"></a><a class="code"
href="firmware_2main_8c.html#54eff1be759cb6a0ec1f522f985c9c58">00291</a> <span
class="preprocessor">#define LED_CAPS 0x02 </span>
<a name="l00292"></a><a class="code"
href="firmware_2main_8c.html#4628cba683ac72e812db635372faf88a">00292</a> <span
class="preprocessor">#define LED_SCROLL 0x04 </span>
<a name="l00293"></a><a class="code"
href="firmware_2main_8c.html#52baca6b68f2f753638465c69e691d43">00293</a> <span
class="preprocessor">#define LED_COMPOSE 0x08 </span>
<a name="l00294"></a><a class="code"
href="firmware_2main_8c.html#12d4b576a70a2b7a3053adea8fd0a1f6">00294</a> <span
class="preprocessor">#define LED_KANA 0x10 </span>
<a name="l00295"></a><a class="code"
href="firmware_2main_8c.html#01788eba93b64b6aa561a3531b75053e">00295</a> <span
class="preprocessor">uint8_t LEDstate = 0; </span>
<a name="l00296"></a>00296 <span class="preprocessor"></span>
<a name="l00297"></a>00297 <span class="preprocessor"></span>
<a name="l00302"></a><a class="code"
href="firmware_2main_8c.html#4c2feb67f6c3add002577ff194ad11d3">00302</a> <span
class="keywordtype">char</span> PROGMEM <a class="code"
href="firmware_2main_8c.html#4c2feb67f6c3add002577ff194ad11d3" title="USB report
descriptor (length is defined in usbconfig.h).">usbHidReportDescriptor</a>[<a
class="code"
href="bootloader_2usbconfig_8h.html#47d9bef5c10a1b9ba917eca583d2abc9">USB_CFG_HID_R
EPORT_DESCRIPTOR_LENGTH</a>] = {
<a name="l00303"></a>00303 0x05, 0x01, <span class="comment">// USAGE_PAGE
(Generic Desktop)</span>
<a name="l00304"></a>00304 0x09, 0x06, <span class="comment">// USAGE
(Keyboard)</span>
<a name="l00305"></a>00305 0xa1, 0x01, <span class="comment">// COLLECTION
(Application)</span>
<a name="l00306"></a>00306 0x05, 0x07, <span class="comment">// USAGE_PAGE
(Keyboard)</span>
<a name="l00307"></a>00307 0x19, 0xe0, <span class="comment">//
USAGE_MINIMUM (Keyboard LeftControl)</span>
<a name="l00308"></a>00308 0x29, 0xe7, <span class="comment">//
USAGE_MAXIMUM (Keyboard Right GUI)</span>
<a name="l00309"></a>00309 0x15, 0x00, <span class="comment">//
LOGICAL_MINIMUM (0)</span>
<a name="l00310"></a>00310 0x25, 0x01, <span class="comment">//
LOGICAL_MAXIMUM (1)</span>
<a name="l00311"></a>00311 0x75, 0x01, <span class="comment">// REPORT_SIZE
(1)</span>
<a name="l00312"></a>00312 0x95, 0x08, <span class="comment">//
REPORT_COUNT (8)</span>
<a name="l00313"></a>00313 0x81, 0x02, <span class="comment">// INPUT
(Data,Var,Abs)</span>
<a name="l00314"></a>00314 0x95, 0x01, <span class="comment">//
REPORT_COUNT (1)</span>
<a name="l00315"></a>00315 0x75, 0x08, <span class="comment">// REPORT_SIZE
(8)</span>
<a name="l00316"></a>00316 0x81, 0x03, <span class="comment">// INPUT
(Cnst,Var,Abs)</span>
<a name="l00317"></a>00317 0x95, 0x05, <span class="comment">//
REPORT_COUNT (5)</span>
<a name="l00318"></a>00318 0x75, 0x01, <span class="comment">// REPORT_SIZE
(1)</span>
<a name="l00319"></a>00319 0x05, 0x08, <span class="comment">// USAGE_PAGE
(LEDs)</span>
<a name="l00320"></a>00320 0x19, 0x01, <span class="comment">//
USAGE_MINIMUM (Num Lock)</span>
<a name="l00321"></a>00321 0x29, 0x05, <span class="comment">//
USAGE_MAXIMUM (Kana)</span>
<a name="l00322"></a>00322 0x91, 0x02, <span class="comment">// OUTPUT
(Data,Var,Abs)</span>
<a name="l00323"></a>00323 0x95, 0x01, <span class="comment">//
REPORT_COUNT (1)</span>
<a name="l00324"></a>00324 0x75, 0x03, <span class="comment">// REPORT_SIZE
(3)</span>
<a name="l00325"></a>00325 0x91, 0x03, <span class="comment">// OUTPUT
(Cnst,Var,Abs)</span>
<a name="l00326"></a>00326 0x95, 0x06, <span class="comment">//
REPORT_COUNT (6)</span>
<a name="l00327"></a>00327 0x75, 0x08, <span class="comment">// REPORT_SIZE
(8)</span>
<a name="l00328"></a>00328 0x15, 0x00, <span class="comment">//
LOGICAL_MINIMUM (0)</span>
<a name="l00329"></a>00329 0x25, 0x65, <span class="comment">//
LOGICAL_MAXIMUM (101)</span>
<a name="l00330"></a>00330 0x05, 0x07, <span class="comment">// USAGE_PAGE
(Keyboard)</span>
<a name="l00331"></a>00331 0x19, 0x00, <span class="comment">//
USAGE_MINIMUM (Reserved (no event indicated))</span>
<a name="l00332"></a>00332 0x29, 0x65, <span class="comment">//
USAGE_MAXIMUM (Keyboard Application)</span>
<a name="l00333"></a>00333 0x81, 0x00, <span class="comment">// INPUT
(Data,Ary,Abs)</span>
<a name="l00334"></a>00334 0xc0 <span class="comment">//
END_COLLECTION</span>
<a name="l00335"></a>00335 };
<a name="l00336"></a>00336
<a name="l00343"></a><a class="code"
href="firmware_2main_8c.html#1a82bef73edf9d932a10315b0eaaa090">00343</a> uint8_t <a
class="code"
href="bootloader_2main_8c.html#e6f351eca7bf6fb1251f9a478cbae2b0">usbFunctionSetup</
a>(uint8_t data[8]) {
<a name="l00344"></a>00344 usbRequest_t *rq = (<span
class="keywordtype">void</span> *)data;
<a name="l00345"></a>00345 usbMsgPtr = reportBuffer;
<a name="l00346"></a>00346 <span class="keywordflow">if</span> ((rq-
&gt;bmRequestType &amp; USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS) {
<a name="l00347"></a>00347 <span class="comment">// class request
type</span>
<a name="l00348"></a>00348 <span class="keywordflow">if</span> (rq-
&gt;bRequest == USBRQ_HID_GET_REPORT) {
<a name="l00349"></a>00349 <span class="comment">// wValue: ReportType
(highbyte), ReportID (lowbyte)</span>
<a name="l00350"></a>00350 <span class="comment">// we only have one
report type, so don't look at wValue</span>
<a name="l00351"></a>00351 <span class="keywordflow">return</span>
<span class="keyword">sizeof</span>(reportBuffer);
<a name="l00352"></a>00352 } <span class="keywordflow">else</span> <span
class="keywordflow">if</span> (rq-&gt;bRequest == USBRQ_HID_SET_REPORT) {
<a name="l00353"></a>00353 <span class="keywordflow">if</span> (rq-
&gt;wLength.word == 1) {
<a name="l00354"></a>00354 <span class="comment">// We expect one
byte reports</span>
<a name="l00355"></a>00355 <a class="code"
href="firmware_2main_8c.html#f1cf86b4d81c490f25ab516aed0742f0" title="flag to
indicate if we expect an USB-report">expectReport</a> = 1;
<a name="l00356"></a>00356 <span class="keywordflow">return</span>
0xff; <span class="comment">// Call usbFunctionWrite with data</span>
<a name="l00357"></a>00357 }
<a name="l00358"></a>00358 } <span class="keywordflow">else</span> <span
class="keywordflow">if</span> (rq-&gt;bRequest == USBRQ_HID_GET_IDLE) {
<a name="l00359"></a>00359 usbMsgPtr = &amp;idleRate;
<a name="l00360"></a>00360 <span class="keywordflow">return</span> 1;
<a name="l00361"></a>00361 } <span class="keywordflow">else</span> <span
class="keywordflow">if</span> (rq-&gt;bRequest == USBRQ_HID_SET_IDLE) {
<a name="l00362"></a>00362 idleRate = rq-&gt;wValue.bytes[1];
<a name="l00363"></a>00363 } <span class="keywordflow">else</span> <span
class="keywordflow">if</span> (rq-&gt;bRequest == USBRQ_HID_GET_PROTOCOL) {
<a name="l00364"></a>00364 <span class="keywordflow">if</span> (rq-
&gt;wValue.bytes[1] &lt; 1) {
<a name="l00365"></a>00365 protocolVer = rq-&gt;wValue.bytes[1];
<a name="l00366"></a>00366 }
<a name="l00367"></a>00367 } <span class="keywordflow">else</span> <span
class="keywordflow">if</span>(rq-&gt;bRequest == USBRQ_HID_SET_PROTOCOL) {
<a name="l00368"></a>00368 usbMsgPtr = &amp;protocolVer;
<a name="l00369"></a>00369 <span class="keywordflow">return</span> 1;
<a name="l00370"></a>00370 }
<a name="l00371"></a>00371 } <span class="keywordflow">else</span> {
<a name="l00372"></a>00372 <span class="comment">// no vendor specific
requests implemented</span>
<a name="l00373"></a>00373 }
<a name="l00374"></a>00374 <span class="keywordflow">return</span> 0;
<a name="l00375"></a>00375 }
<a name="l00376"></a>00376
<a name="l00384"></a><a class="code"
href="firmware_2main_8c.html#149335bbad0138c9c707847dccd448d6">00384</a> uint8_t <a
class="code"
href="bootloader_2main_8c.html#92f69288e90801df366cde5a838a818f">usbFunctionWrite</
a>(uchar *data, uchar len) {
<a name="l00385"></a>00385 <span class="keywordflow">if</span> (<a class="code"
href="firmware_2main_8c.html#f1cf86b4d81c490f25ab516aed0742f0" title="flag to
indicate if we expect an USB-report">expectReport</a> &amp;&amp; (len == 1)) {
<a name="l00386"></a>00386 <a class="code"
href="firmware_2main_8c.html#01788eba93b64b6aa561a3531b75053e" title="current state
of the LEDs">LEDstate</a> = data[0]; <span class="comment">// Get the state of all
5 LEDs</span>
<a name="l00387"></a>00387 <span class="keywordflow">if</span> (<a
class="code" href="firmware_2main_8c.html#01788eba93b64b6aa561a3531b75053e"
title="current state of the LEDs">LEDstate</a> &amp; <a class="code"
href="firmware_2main_8c.html#77440c4104ae0a7368936ff87a3d3260" title="num LED on a
boot-protocol keyboard">LED_NUM</a>) { <span class="comment">// light up caps
lock</span>
<a name="l00388"></a>00388 <a class="code"
href="firmware_2main_8c.html#1fc9fdc7dac7819e697429072f86d3de" title="port on which
the LEDs are connected">PORTLEDS</a> &amp;= ~(1 &lt;&lt; <a class="code"
href="firmware_2main_8c.html#070b1a39c765aebc0d4a8353731224e6" title="address of
the num-lock LED">LEDNUM</a>);
<a name="l00389"></a>00389 } <span class="keywordflow">else</span> {
<a name="l00390"></a>00390 <a class="code"
href="firmware_2main_8c.html#1fc9fdc7dac7819e697429072f86d3de" title="port on which
the LEDs are connected">PORTLEDS</a> |= (1 &lt;&lt; <a class="code"
href="firmware_2main_8c.html#070b1a39c765aebc0d4a8353731224e6" title="address of
the num-lock LED">LEDNUM</a>);
<a name="l00391"></a>00391 }
<a name="l00392"></a>00392 <span class="keywordflow">if</span> (<a
class="code" href="firmware_2main_8c.html#01788eba93b64b6aa561a3531b75053e"
title="current state of the LEDs">LEDstate</a> &amp; <a class="code"
href="firmware_2main_8c.html#54eff1be759cb6a0ec1f522f985c9c58" title="caps LED on a
boot-protocol keyboard">LED_CAPS</a>) { <span class="comment">// light up caps
lock</span>
<a name="l00393"></a>00393 <a class="code"
href="firmware_2main_8c.html#1fc9fdc7dac7819e697429072f86d3de" title="port on which
the LEDs are connected">PORTLEDS</a> &amp;= ~(1 &lt;&lt; <a class="code"
href="firmware_2main_8c.html#a1ebb1ee7d6ccd52c5ce53def057e544" title="address of
the caps-lock LED">LEDCAPS</a>);
<a name="l00394"></a>00394 } <span class="keywordflow">else</span> {
<a name="l00395"></a>00395 <a class="code"
href="firmware_2main_8c.html#1fc9fdc7dac7819e697429072f86d3de" title="port on which
the LEDs are connected">PORTLEDS</a> |= (1 &lt;&lt; <a class="code"
href="firmware_2main_8c.html#a1ebb1ee7d6ccd52c5ce53def057e544" title="address of
the caps-lock LED">LEDCAPS</a>);
<a name="l00396"></a>00396 }
<a name="l00397"></a>00397 <span class="keywordflow">if</span> (<a
class="code" href="firmware_2main_8c.html#01788eba93b64b6aa561a3531b75053e"
title="current state of the LEDs">LEDstate</a> &amp; <a class="code"
href="firmware_2main_8c.html#4628cba683ac72e812db635372faf88a" title="scroll LED on
a boot-protocol keyboard">LED_SCROLL</a>) { <span class="comment">// light up caps
lock</span>
<a name="l00398"></a>00398 <a class="code"
href="firmware_2main_8c.html#1fc9fdc7dac7819e697429072f86d3de" title="port on which
the LEDs are connected">PORTLEDS</a> &amp;= ~(1 &lt;&lt; <a class="code"
href="firmware_2main_8c.html#87ad17ac607cd11c6852ee2687580ac8" title="address of
the scroll-lock LED">LEDSCROLL</a>);
<a name="l00399"></a>00399 } <span class="keywordflow">else</span> {
<a name="l00400"></a>00400 <a class="code"
href="firmware_2main_8c.html#1fc9fdc7dac7819e697429072f86d3de" title="port on which
the LEDs are connected">PORTLEDS</a> |= (1 &lt;&lt; <a class="code"
href="firmware_2main_8c.html#87ad17ac607cd11c6852ee2687580ac8" title="address of
the scroll-lock LED">LEDSCROLL</a>);
<a name="l00401"></a>00401 }
<a name="l00402"></a>00402 }
<a name="l00403"></a>00403 <a class="code"
href="firmware_2main_8c.html#f1cf86b4d81c490f25ab516aed0742f0" title="flag to
indicate if we expect an USB-report">expectReport</a> = 0;
<a name="l00404"></a>00404 <span class="keywordflow">return</span> 0x01;
<a name="l00405"></a>00405 }
<a name="l00406"></a>00406
<a name="l00413"></a><a class="code"
href="firmware_2main_8c.html#bffc3119fb17bda876cd9ab7001a0723">00413</a> <span
class="keywordtype">void</span> <a class="code"
href="firmware_2main_8c.html#bffc3119fb17bda876cd9ab7001a0723" title="Send a single
report to the computer.">usbSendReport</a>(uint8_t mode, uint8_t key) {
<a name="l00414"></a>00414 <span class="comment">// buffer for HID reports. we
use a private one, so nobody gets disturbed</span>
<a name="l00415"></a>00415 uint8_t repBuffer[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
<a name="l00416"></a>00416 repBuffer[0] = mode;
<a name="l00417"></a>00417 repBuffer[2] = key;
<a name="l00418"></a>00418 <span class="keywordflow">while</span> (!
usbInterruptIsReady()); <span class="comment">// wait</span>
<a name="l00419"></a>00419 usbSetInterrupt(repBuffer, <span
class="keyword">sizeof</span>(repBuffer)); <span class="comment">// send</span>
<a name="l00420"></a>00420 }
<a name="l00421"></a>00421
<a name="l00422"></a>00422 <span class="comment">/*
------------------------------------------------------------------------- */</span>
<a name="l00423"></a>00423
<a name="l00424"></a><a class="code"
href="firmware_2main_8c.html#4031bd527c85f293b4fca70e11dd337b">00424</a> uint8_t <a
class="code" href="firmware_2main_8c.html#4031bd527c85f293b4fca70e11dd337b"
title="contains current state of the keyboard">curmatrix</a>[16];
<a name="l00425"></a>00425
<a name="l00433"></a><a class="code"
href="firmware_2main_8c.html#aeada6842a93dfcdd895fbdfb22b35c0">00433</a> <span
class="keyword">const</span> uint8_t PROGMEM <a class="code"
href="firmware_2main_8c.html#aeada6842a93dfcdd895fbdfb22b35c0" title="The
keymatrix-array contains positions of keys in the matrix.">keymatrix</a>[16][8] = {
<a name="l00434"></a>00434 <span class="comment">// 0 1
2 3 4 5 6
7</span>
<a name="l00435"></a>00435 {<a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a>, KEY_Reserved, KEY_Reserved, KEY_Reserved,
KEY_Reserved, KEY_Reserved, KEY_Reserved }, <span class="comment">// 0</span>
<a name="l00436"></a>00436 {<a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a>, KEY_Reserved, KEY_Reserved, KEY_Reserved,
KEY_Reserved, KEY_Reserved, KEY_Reserved }, <span class="comment">// 1</span>
<a name="l00437"></a>00437 {<a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b3a471c8b61a5f730dcbdd50fe53f
3ab7">KEY_ESCAPE</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba8ce40600f1126563b446ae125d6
b978">KEY_Tab</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bf5b841aa798b3ecd6b9177489586
a865">KEY_grave</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b35bcc2bc85513df4f3897a9d64a9
c51c">KEY_1</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bc8234231b36474d3666ad56752fe
6f5e">KEY_Q</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba7b3a3d0503a46bec51c6e3da957
47cc">KEY_A</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213badc60d2de1d019604547c0df88f8
4cda">KEY_Z</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a> }, <span class="comment">// 2</span>
<a name="l00438"></a>00438 {<a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bc5b2ffe1e64f922888ff7905f16f
fb2c">KEY_Euro</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba65c9695b0e41f370d1ef944e672
e28c">KEY_capslock</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bfcf70bc39c0032de8a1c6452ac98
60a5">KEY_F1</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b2333d7c312aa98622c41e74c5d13
e8de">KEY_2</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b2e6a652ccd7afc5ce75ac4d902b6
a60a">KEY_W</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bbb2f0ce8efc3067757dbf091437f
89f5">KEY_S</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b480a807305121d41673b8c208898
f497">KEY_X</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a> }, <span class="comment">// 3</span>
<a name="l00439"></a>00439 {<a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b01bce78a73ad136a7b42941297af
f373">KEY_F4</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b965c99b1f4fc05cec09ef61b0af8
e74a">KEY_F3</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b87897fd25282941e1a9bf72b9f64
559a">KEY_F2</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bef054680a9be7da17d196e15aec8
94f8">KEY_3</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b2af9840d90c49239339bfd42f9f3
2868">KEY_E</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b2fd73a4d527efe137e8f259db209
2766">KEY_D</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b9cabc5fc0d1f7f6a78e78b8ff29d
bb61">KEY_C</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a> }, <span class="comment">// 4</span>
<a name="l00440"></a>00440 {<a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b4ec980867be1d5bded2bccdee2eb
d601">KEY_G</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b6167a8727e73df1eb96f19c24607
66c9">KEY_T</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bed864c0209ba46546ba112f6c36e
0cc4">KEY_5</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213be9f20352b4ef69ae68b9ff44abad
fd79">KEY_4</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba3ec8a2ffd5b0e200db5ebe7b655
15ff">KEY_R</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b3c069efeb1638c2ab0d2a50ff45b
529f">KEY_F</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bfa1c237398bdfc48e5c1a55ce4a9
77fe">KEY_V</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b10072b5ee7aa1faf316434ecc9e2
bb3a">KEY_B</a> }, <span class="comment">// 5</span>
<a name="l00441"></a>00441 {<a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b6a69ea34f5d1372692bf040637e5
7c8f">KEY_F5</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213be7a3a4540031b038014294aa6743
a7a4">KEY_DELETE</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b160e82eea885870bfa4924c27040
cd7f">KEY_F9</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b3b922025c26b38585ab140c7e40b
291c">KEY_F10</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a>, KEY_Reserved, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b8182d6dbf79f5e9ef1fe328d372a
27d8">KEY_Return</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b5b4172926f250f5a6321c03d3cd4
e540">KEY_Spacebar</a> }, <span class="comment">// 6</span>
<a name="l00442"></a>00442 {<a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b41d1aa573d29ca6a9eb429a680dc
53cd">KEY_H</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b5d44524b2a6090fa97aa9353d69f
67a3">KEY_Y</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b2fe7fe99bcb0fd90bf4234be9e4c
e5be">KEY_6</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213be78c88108d428cb8066e7a056195
f489">KEY_7</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bd4961a6c7ea9d008812aaaa8c4ea
9730">KEY_U</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bbb3108883bee68e265b554542484
c5d7">KEY_J</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b0d94112555886427204ad0c0711c
a327">KEY_M</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba606b8c6deaec8077387975d195c
d824">KEY_N</a> }, <span class="comment">// 7</span>
<a name="l00443"></a>00443 {<a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b247a20a9998f080827dd34004abc
2f9a">KEY_F6</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b6d7217ab6d79bf19af11b316c51a
d9a5">KEY_rbracket</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213becf765a0ba929e48c2d9bcef32da
6bed">KEY_equals</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bab8917d426f9be27c95c0d381000
6d7b">KEY_8</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b2c98fd67709a9fd5409498d4f717
5877">KEY_I</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b6b0799a9923c55f8a73550a371ea
69f6">KEY_K</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bae069bb853da6198faf7f8c6c566
ec22">KEY_comma</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a> }, <span class="comment">// 8</span>
<a name="l00444"></a>00444 {<a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b34a07203a0a4f3e996b44e9a4fcf
d1c6">KEY_F7</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b9eaf4e9e3d8451fd1332c013d12c
1375">KEY_F8</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b601382e2da6215882c129b43b338
4611">KEY_9</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213be7edd672641b587364ea4a0c8938
8290">KEY_O</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bece16de35a5ea11f9b228c9376be
bc62">KEY_L</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b4e8875697d37e50ab2b3405761f9
bd99">KEY_dot</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a> }, <span class="comment">// 9</span>
<a name="l00445"></a>00445 {<a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213be594104ae7fac91205a4f6442d94
541f">KEY_apostroph</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bc215b592df3fcfa09524a7731f9b
aa7c">KEY_lbracket</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bb29b19d351777f2a79e68320245d
0020">KEY_minus</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b6b30f8af6c880e1aca01b91aa13c
6ff9">KEY_0</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b0a4c7291c92b7fc84da27a363dc5
3fa6">KEY_P</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b1a96bfea47443371323d38fd7337
423e">KEY_semicolon</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b826e6106afa1dc35fc5cc507b13b
b685">KEY_hash</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b5704a5a3c1bddd6c1aa7405494ef
6739">KEY_slash</a> }, <span class="comment">// 10</span>
<a name="l00446"></a>00446 {<a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213be81b76194e0134be24fbddc17902
db67">KEY_KP4</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba0be6f468513f11fa341b4a77593
f815">KEY_DeleteForward</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bd54743bc4e7f9279abf671cc2a09
1ce1">KEY_F11</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bd0a2113ba357712bf9d878e45552
0bee">KEY_KP7</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b8722e6d09e3e6dcf572fd5add35b
b43c">KEY_KP1</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bb7a7385fb898a4107695701fc7d4
185c">KEY_NumLock</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b0bfe71755dd0d220a4b27a74e64e
01a2">KEY_DownArrow</a> }, <span class="comment">// 11</span>
<a name="l00447"></a>00447 {<a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213be00957bb77b4a481cc7a7bad292b
3fb8">KEY_KP0</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b4c98effab9ba6f8234202832a31c
dd9e">KEY_KP5</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b8077c04a6442085c81ba09b4cef4
a409">KEY_Insert</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b835f8397baa58fd73ff9c268d645
8add">KEY_F12</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b0cfe0de974f76f12db02944857f4
1d45">KEY_KP8</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b9d43270c809e5e3b19308feb5b27
df62">KEY_KP2</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b359d17f3787db848beb3be458e8b
5b29">KEY_KPslash</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bdbbefafd0e8f5b60c6af544f6db1
f89b">KEY_RightArrow</a> }, <span class="comment">// 12</span>
<a name="l00448"></a>00448 {<a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b98a211310dace4ef28b0860b5713
2dec">KEY_KPcomma</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213beafa6012e78346503106effe78f2
9284">KEY_KP6</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b02658341220d583f880c209fa431
80ec">KEY_PageUp</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b3c4718c24b57634aab0d088248b3
0326">KEY_PageDown</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b66d927bbf4ac4c6b025259a42664
efec">KEY_KP9</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b824ec486e8fad4215e6c518af31c
5255">KEY_KP3</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bc1d917976d7bda5255480dae6669
4ba6">KEY_KPasterisk</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b13560a16dc9444e510d4b8bfd482
3574">KEY_KPminus</a> }, <span class="comment">// 13</span>
<a name="l00449"></a>00449 {<a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b2884c5d5d4de5b716ac2203cdf2d
06ee">KEY_UpArrow</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bdda84c0a588c5183fb04c2f1398f
cdfc">KEY_Home</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba3c7406c22ee8fa8e649b0400e4a
43e3">KEY_End</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213baf922bcddd53cb5b2f92255c715c
002d">KEY_KPplus</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b0f04c9403facf3f75d23319d96b0
2470">KEY_KPenter</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b71f6852005ab561904a547dc717d
7a65">KEY_Pause</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b7aea3ca4c8f927255e90212853ba
cac3">KEY_LeftArrow</a> }, <span class="comment">// 14</span>
<a name="l00450"></a>00450 {<a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a>, KEY_Reserved, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b44c5ddea2cbfd857b3c90c185fd5
02b6">KEY_PrintScreen</a>, <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b8022e5ff7edc436af9555e08a365
925a">KEY_ScrollLock</a>, KEY_Reserved, KEY_Reserved, KEY_Reserved }, <span
class="comment">// 15</span>
<a name="l00451"></a>00451 };
<a name="l00452"></a>00452
<a name="l00458"></a><a class="code"
href="firmware_2main_8c.html#9551cf4b116323bed1c59c814ba339d9">00458</a> <span
class="keyword">const</span> uint8_t PROGMEM <a class="code"
href="firmware_2main_8c.html#9551cf4b116323bed1c59c814ba339d9" title="The
modmatrix-array contains positions of the modifier-keys in the
matrix.">modmatrix</a>[16][8] = { <span class="comment">// contains positions of
modifiers in the matrix</span>
<a name="l00459"></a>00459 <span class="comment">// 0 1
2 3 4 5 6 7</span>
<a name="l00460"></a>00460 {<a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53d27265b5549a662ed7263825d251
fb74">MOD_CONTROL_LEFT</a>, MOD_NONE, MOD_NONE, MOD_NONE, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f533a3c43335f325f4daba7f8d7f742
38fa">MOD_CONTROL_RIGHT</a>, MOD_NONE }, <span class="comment">// 0</span>
<a name="l00461"></a>00461 {<a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, MOD_NONE, MOD_NONE, MOD_NONE, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f5314c385bb2c900ef45c820146fa06
7052">MOD_SHIFT_RIGHT</a>, MOD_NONE }, <span class="comment">// 1</span>
<a name="l00462"></a>00462 {<a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE,
MOD_NONE }, <span class="comment">// 2</span>
<a name="l00463"></a>00463 {<a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE,
MOD_NONE }, <span class="comment">// 3</span>
<a name="l00464"></a>00464 {<a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE,
MOD_NONE }, <span class="comment">// 4</span>
<a name="l00465"></a>00465 {<a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE,
MOD_NONE }, <span class="comment">// 5</span>
<a name="l00466"></a>00466 {<a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE,
MOD_NONE }, <span class="comment">// 6</span>
<a name="l00467"></a>00467 {<a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE,
MOD_NONE }, <span class="comment">// 7</span>
<a name="l00468"></a>00468 {<a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE,
MOD_NONE }, <span class="comment">// 8</span>
<a name="l00469"></a>00469 {<a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE,
MOD_NONE }, <span class="comment">// 9</span>
<a name="l00470"></a>00470 {<a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE,
MOD_NONE }, <span class="comment">// 10</span>
<a name="l00471"></a>00471 {<a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE,
MOD_NONE }, <span class="comment">// 11</span>
<a name="l00472"></a>00472 {<a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE,
MOD_NONE }, <span class="comment">// 12</span>
<a name="l00473"></a>00473 {<a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE,
MOD_NONE }, <span class="comment">// 13</span>
<a name="l00474"></a>00474 {<a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE,
MOD_NONE }, <span class="comment">// 14</span>
<a name="l00475"></a>00475 {<a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53dd6fc5bb0b74b459d8299103406e
5a88">MOD_ALT_LEFT</a>, <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE, MOD_NONE,
<a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f534656c6d2d64b0e6be580762571c7
8d28">MOD_ALT_RIGHT</a>}, <span class="comment">// 15</span>
<a name="l00476"></a>00476 };
<a name="l00477"></a>00477
<a name="l00482"></a><a class="code" href="structKey.html">00482</a> <span
class="keyword">typedef</span> <span class="keyword">struct </span>{
<a name="l00483"></a><a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">00483</a> uint8_t mode;
<a name="l00484"></a><a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">00484</a> uint8_t key;
<a name="l00485"></a>00485 } <a class="code" href="structKey.html" title="This
structure can be used as a container for a single &amp;#39;key&amp;#39;.">Key</a>;
<a name="l00486"></a>00486
<a name="l00493"></a><a class="code"
href="firmware_2main_8c.html#ca503c29786de18a51830b94b9dfabb6">00493</a> <a
class="code" href="structKey.html" title="This structure can be used as a container
for a single &amp;#39;key&amp;#39;.">Key</a> <a class="code"
href="firmware_2main_8c.html#ca503c29786de18a51830b94b9dfabb6" title="Convert an
ASCII-character to the corresponding key-code and modifier-code
combination...">charToKey</a>(<span class="keywordtype">char</span> character) {
<a name="l00494"></a>00494 <a class="code" href="structKey.html" title="This
structure can be used as a container for a single &amp;#39;key&amp;#39;.">Key</a>
key;
<a name="l00495"></a>00495 <span class="comment">// initialize with reserved
values</span>
<a name="l00496"></a>00496 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>;
<a name="l00497"></a>00497 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a>;
<a name="l00498"></a>00498 <span class="keywordflow">if</span> ((character
&gt;= <span class="charliteral">'a'</span>) &amp;&amp; (character &lt;= <span
class="charliteral">'z'</span>)) {
<a name="l00499"></a>00499 <span class="comment">// a..z</span>
<a name="l00500"></a>00500 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = (character - <span
class="charliteral">'a'</span>) + 0x04;
<a name="l00501"></a>00501 } <span class="keywordflow">else</span> <span
class="keywordflow">if</span> ((character &gt;= <span
class="charliteral">'A'</span>) &amp;&amp; (character &lt;= <span
class="charliteral">'Z'</span>)) {
<a name="l00502"></a>00502 <span class="comment">// A..Z</span>
<a name="l00503"></a>00503 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00504"></a>00504 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = (character - <span
class="charliteral">'A'</span>) + 0x04;
<a name="l00505"></a>00505 } <span class="keywordflow">else</span> <span
class="keywordflow">if</span> ((character &gt;= <span
class="charliteral">'1'</span>) &amp;&amp; (character &lt;= <span
class="charliteral">'9'</span>)) {
<a name="l00506"></a>00506 <span class="comment">// 1..9</span>
<a name="l00507"></a>00507 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = (character - <span
class="charliteral">'1'</span>) + 0x1E;
<a name="l00508"></a>00508 }
<a name="l00509"></a>00509 <span class="comment">// we can't map the other
characters directly, so we switch...</span>
<a name="l00510"></a>00510 <span class="keywordflow">switch</span> (character)
{
<a name="l00511"></a>00511 <span class="keywordflow">case</span> <span
class="charliteral">'0'</span>:
<a name="l00512"></a>00512 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b6b30f8af6c880e1aca01b91aa13c
6ff9">KEY_0</a>; <span class="keywordflow">break</span>;
<a name="l00513"></a>00513 <span class="keywordflow">case</span> <span
class="charliteral">'!'</span>:
<a name="l00514"></a>00514 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00515"></a>00515 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b35bcc2bc85513df4f3897a9d64a9
c51c">KEY_1</a>; <span class="keywordflow">break</span>;
<a name="l00516"></a>00516 <span class="comment">/*</span>
<a name="l00517"></a>00517 <span class="comment"> case '@':</span>
<a name="l00518"></a>00518 <span class="comment"> key.mode =
MOD_SHIFT_LEFT;</span>
<a name="l00519"></a>00519 <span class="comment"> key.key = KEY_2;
break;</span>
<a name="l00520"></a>00520 <span class="comment"> case '#':</span>
<a name="l00521"></a>00521 <span class="comment"> key.mode =
MOD_SHIFT_LEFT;</span>
<a name="l00522"></a>00522 <span class="comment"> key.key = KEY_3;
break;</span>
<a name="l00523"></a>00523 <span class="comment"> */</span>
<a name="l00524"></a>00524 <span class="keywordflow">case</span> <span
class="charliteral">'$'</span>:
<a name="l00525"></a>00525 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00526"></a>00526 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213be9f20352b4ef69ae68b9ff44abad
fd79">KEY_4</a>; <span class="keywordflow">break</span>;
<a name="l00527"></a>00527 <span class="keywordflow">case</span> <span
class="charliteral">'%'</span>:
<a name="l00528"></a>00528 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00529"></a>00529 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bed864c0209ba46546ba112f6c36e
0cc4">KEY_5</a>; <span class="keywordflow">break</span>;
<a name="l00530"></a>00530 <span class="keywordflow">case</span> <span
class="charliteral">'^'</span>:
<a name="l00531"></a>00531 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00532"></a>00532 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b2fe7fe99bcb0fd90bf4234be9e4c
e5be">KEY_6</a>; <span class="keywordflow">break</span>;
<a name="l00533"></a>00533 <span class="keywordflow">case</span> <span
class="charliteral">'&amp;'</span>:
<a name="l00534"></a>00534 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00535"></a>00535 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213be78c88108d428cb8066e7a056195
f489">KEY_7</a>; <span class="keywordflow">break</span>;
<a name="l00536"></a>00536 <span class="keywordflow">case</span> <span
class="charliteral">'*'</span>:
<a name="l00537"></a>00537 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00538"></a>00538 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bab8917d426f9be27c95c0d381000
6d7b">KEY_8</a>; <span class="keywordflow">break</span>;
<a name="l00539"></a>00539 <span class="keywordflow">case</span> <span
class="charliteral">'('</span>:
<a name="l00540"></a>00540 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00541"></a>00541 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b601382e2da6215882c129b43b338
4611">KEY_9</a>; <span class="keywordflow">break</span>;
<a name="l00542"></a>00542 <span class="keywordflow">case</span> <span
class="charliteral">')'</span>:
<a name="l00543"></a>00543 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00544"></a>00544 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b6b30f8af6c880e1aca01b91aa13c
6ff9">KEY_0</a>; <span class="keywordflow">break</span>;
<a name="l00545"></a>00545 <span class="keywordflow">case</span> <span
class="charliteral">' '</span>:
<a name="l00546"></a>00546 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b5b4172926f250f5a6321c03d3cd4
e540">KEY_Spacebar</a>; <span class="keywordflow">break</span>;
<a name="l00547"></a>00547 <span class="keywordflow">case</span> <span
class="charliteral">'-'</span>:
<a name="l00548"></a>00548 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bb29b19d351777f2a79e68320245d
0020">KEY_minus</a>; <span class="keywordflow">break</span>;
<a name="l00549"></a>00549 <span class="keywordflow">case</span> <span
class="charliteral">'_'</span>:
<a name="l00550"></a>00550 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00551"></a>00551 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bb29b19d351777f2a79e68320245d
0020">KEY_minus</a>; <span class="keywordflow">break</span>;
<a name="l00552"></a>00552 <span class="keywordflow">case</span> <span
class="charliteral">'='</span>:
<a name="l00553"></a>00553 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213becf765a0ba929e48c2d9bcef32da
6bed">KEY_equals</a>; <span class="keywordflow">break</span>;
<a name="l00554"></a>00554 <span class="keywordflow">case</span> <span
class="charliteral">'+'</span>:
<a name="l00555"></a>00555 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00556"></a>00556 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213becf765a0ba929e48c2d9bcef32da
6bed">KEY_equals</a>; <span class="keywordflow">break</span>;
<a name="l00557"></a>00557 <span class="keywordflow">case</span> <span
class="charliteral">'['</span>:
<a name="l00558"></a>00558 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bc215b592df3fcfa09524a7731f9b
aa7c">KEY_lbracket</a>; <span class="keywordflow">break</span>;
<a name="l00559"></a>00559 <span class="keywordflow">case</span> <span
class="charliteral">'{'</span>:
<a name="l00560"></a>00560 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00561"></a>00561 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bc215b592df3fcfa09524a7731f9b
aa7c">KEY_lbracket</a>; <span class="keywordflow">break</span>;
<a name="l00562"></a>00562 <span class="keywordflow">case</span> <span
class="charliteral">']'</span>:
<a name="l00563"></a>00563 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b6d7217ab6d79bf19af11b316c51a
d9a5">KEY_rbracket</a>; <span class="keywordflow">break</span>;
<a name="l00564"></a>00564 <span class="keywordflow">case</span> <span
class="charliteral">'}'</span>:
<a name="l00565"></a>00565 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00566"></a>00566 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b6d7217ab6d79bf19af11b316c51a
d9a5">KEY_rbracket</a>; <span class="keywordflow">break</span>;
<a name="l00567"></a>00567 <span class="keywordflow">case</span> <span
class="charliteral">'\\'</span>:
<a name="l00568"></a>00568 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bc5a33fc7117578c9d3f060f90c02
828d">KEY_backslash</a>; <span class="keywordflow">break</span>;
<a name="l00569"></a>00569 <span class="keywordflow">case</span> <span
class="charliteral">'|'</span>:
<a name="l00570"></a>00570 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00571"></a>00571 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bc5a33fc7117578c9d3f060f90c02
828d">KEY_backslash</a>; <span class="keywordflow">break</span>;
<a name="l00572"></a>00572 <span class="keywordflow">case</span> <span
class="charliteral">'#'</span>:
<a name="l00573"></a>00573 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b826e6106afa1dc35fc5cc507b13b
b685">KEY_hash</a>; <span class="keywordflow">break</span>;
<a name="l00574"></a>00574 <span class="keywordflow">case</span> <span
class="charliteral">'@'</span>:
<a name="l00575"></a>00575 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00576"></a>00576 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b826e6106afa1dc35fc5cc507b13b
b685">KEY_hash</a>; <span class="keywordflow">break</span>;
<a name="l00577"></a>00577 <span class="keywordflow">case</span> <span
class="charliteral">';'</span>:
<a name="l00578"></a>00578 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b1a96bfea47443371323d38fd7337
423e">KEY_semicolon</a>; <span class="keywordflow">break</span>;
<a name="l00579"></a>00579 <span class="keywordflow">case</span> <span
class="charliteral">':'</span>:
<a name="l00580"></a>00580 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00581"></a>00581 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b1a96bfea47443371323d38fd7337
423e">KEY_semicolon</a>; <span class="keywordflow">break</span>;
<a name="l00582"></a>00582 <span class="keywordflow">case</span> <span
class="charliteral">'\''</span>:
<a name="l00583"></a>00583 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213be594104ae7fac91205a4f6442d94
541f">KEY_apostroph</a>; <span class="keywordflow">break</span>;
<a name="l00584"></a>00584 <span class="keywordflow">case</span> <span
class="charliteral">'"'</span>:
<a name="l00585"></a>00585 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00586"></a>00586 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213be594104ae7fac91205a4f6442d94
541f">KEY_apostroph</a>; <span class="keywordflow">break</span>;
<a name="l00587"></a>00587 <span class="keywordflow">case</span> <span
class="charliteral">'`'</span>:
<a name="l00588"></a>00588 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bf5b841aa798b3ecd6b9177489586
a865">KEY_grave</a>; <span class="keywordflow">break</span>;
<a name="l00589"></a>00589 <span class="keywordflow">case</span> <span
class="charliteral">'~'</span>:
<a name="l00590"></a>00590 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00591"></a>00591 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bf5b841aa798b3ecd6b9177489586
a865">KEY_grave</a>; <span class="keywordflow">break</span>;
<a name="l00592"></a>00592 <span class="keywordflow">case</span> <span
class="charliteral">','</span>:
<a name="l00593"></a>00593 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bae069bb853da6198faf7f8c6c566
ec22">KEY_comma</a>; <span class="keywordflow">break</span>;
<a name="l00594"></a>00594 <span class="keywordflow">case</span> <span
class="charliteral">'&lt;'</span>:
<a name="l00595"></a>00595 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00596"></a>00596 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213bae069bb853da6198faf7f8c6c566
ec22">KEY_comma</a>; <span class="keywordflow">break</span>;
<a name="l00597"></a>00597 <span class="keywordflow">case</span> <span
class="charliteral">'.'</span>:
<a name="l00598"></a>00598 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b4e8875697d37e50ab2b3405761f9
bd99">KEY_dot</a>; <span class="keywordflow">break</span>;
<a name="l00599"></a>00599 <span class="keywordflow">case</span> <span
class="charliteral">'&gt;'</span>:
<a name="l00600"></a>00600 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00601"></a>00601 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b4e8875697d37e50ab2b3405761f9
bd99">KEY_dot</a>; <span class="keywordflow">break</span>;
<a name="l00602"></a>00602 <span class="keywordflow">case</span> <span
class="charliteral">'/'</span>:
<a name="l00603"></a>00603 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b5704a5a3c1bddd6c1aa7405494ef
6739">KEY_slash</a>; <span class="keywordflow">break</span>;
<a name="l00604"></a>00604 <span class="keywordflow">case</span> <span
class="charliteral">'?'</span>:
<a name="l00605"></a>00605 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00606"></a>00606 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b5704a5a3c1bddd6c1aa7405494ef
6739">KEY_slash</a>; <span class="keywordflow">break</span>;
<a name="l00607"></a>00607 }
<a name="l00608"></a>00608 <span class="keywordflow">if</span> (key.<a
class="code" href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> == <a
class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a>) {
<a name="l00609"></a>00609 <span class="comment">// still reserved? WTF?
return question mark...</span>
<a name="l00610"></a>00610 key.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a> = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53e6d6db5c56ff582aed6cf2107fa4
f8f1">MOD_SHIFT_LEFT</a>;
<a name="l00611"></a>00611 key.<a class="code"
href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a> = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b5704a5a3c1bddd6c1aa7405494ef
6739">KEY_slash</a>;
<a name="l00612"></a>00612 }
<a name="l00613"></a>00613 <span class="keywordflow">return</span> key;
<a name="l00614"></a>00614 }
<a name="l00615"></a>00615
<a name="l00621"></a><a class="code"
href="firmware_2main_8c.html#543b8f51828d27738be1d4a9cb636dc5">00621</a> <span
class="keywordtype">void</span> <a class="code"
href="firmware_2main_8c.html#543b8f51828d27738be1d4a9cb636dc5" title="Send a key to
the computer, followed by the release of all keys.">sendKey</a>(<a class="code"
href="structKey.html" title="This structure can be used as a container for a single
&amp;#39;key&amp;#39;.">Key</a> keytosend) {
<a name="l00622"></a>00622 <a class="code"
href="firmware_2main_8c.html#bffc3119fb17bda876cd9ab7001a0723" title="Send a single
report to the computer.">usbSendReport</a>(keytosend.<a class="code"
href="structKey.html#997ecb48ca1191df0be432e1fc267d50">mode</a>, keytosend.<a
class="code" href="structKey.html#32f04bf6b621ff119c184fb85bde522d">key</a>);
<a name="l00623"></a>00623 <a class="code"
href="firmware_2main_8c.html#bffc3119fb17bda876cd9ab7001a0723" title="Send a single
report to the computer.">usbSendReport</a>(0, 0);
<a name="l00624"></a>00624 }
<a name="l00625"></a>00625
<a name="l00631"></a><a class="code"
href="firmware_2main_8c.html#53e32b8c00eb3077d56eb67e69f0f55f">00631</a> <span
class="keywordtype">void</span> <a class="code"
href="firmware_2main_8c.html#53e32b8c00eb3077d56eb67e69f0f55f" title="Send a string
to the computer.">sendString</a>(<span class="keywordtype">char</span>* <span
class="keywordtype">string</span>) {
<a name="l00632"></a>00632 <span class="keywordflow">for</span> (uint8_t i = 0;
i &lt; strlen(<span class="keywordtype">string</span>); i++) {
<a name="l00633"></a>00633 <a class="code" href="structKey.html"
title="This structure can be used as a container for a single
&amp;#39;key&amp;#39;.">Key</a> key = <a class="code"
href="firmware_2main_8c.html#ca503c29786de18a51830b94b9dfabb6" title="Convert an
ASCII-character to the corresponding key-code and modifier-code
combination...">charToKey</a>(<span class="keywordtype">string</span>[i]);
<a name="l00634"></a>00634 <a class="code"
href="firmware_2main_8c.html#543b8f51828d27738be1d4a9cb636dc5" title="Send a key to
the computer, followed by the release of all keys.">sendKey</a>(key);
<a name="l00635"></a>00635 }
<a name="l00636"></a>00636 }
<a name="l00637"></a>00637
<a name="l00642"></a><a class="code"
href="firmware_2main_8c.html#573bbc8f1597b70f671b7849e39dc1f6">00642</a> <span
class="keywordtype">void</span> <a class="code"
href="firmware_2main_8c.html#573bbc8f1597b70f671b7849e39dc1f6" title="Print the
current state of the keyboard in a readable form.">printMatrix</a>(<span
class="keywordtype">void</span>) {
<a name="l00643"></a>00643 <span class="keywordflow">for</span> (uint8_t i = 0;
i &lt;= 15; i++) {
<a name="l00644"></a>00644 <span class="keywordtype">char</span>
buffer[10];
<a name="l00645"></a>00645 <span class="comment">/*</span>
<a name="l00646"></a>00646 <span class="comment"> sprintf(buffer, "%d%d%d%d
%d%d%d%d.",</span>
<a name="l00647"></a>00647 <span class="comment"> (curmatrix[i]
&amp; (1 &lt;&lt; 0) ? 1 : 0),</span>
<a name="l00648"></a>00648 <span class="comment"> (curmatrix[i]
&amp; (1 &lt;&lt; 1) ? 1 : 0),</span>
<a name="l00649"></a>00649 <span class="comment"> (curmatrix[i]
&amp; (1 &lt;&lt; 2) ? 1 : 0),</span>
<a name="l00650"></a>00650 <span class="comment"> (curmatrix[i]
&amp; (1 &lt;&lt; 3) ? 1 : 0),</span>
<a name="l00651"></a>00651 <span class="comment"> (curmatrix[i]
&amp; (1 &lt;&lt; 4) ? 1 : 0),</span>
<a name="l00652"></a>00652 <span class="comment"> (curmatrix[i]
&amp; (1 &lt;&lt; 5) ? 1 : 0),</span>
<a name="l00653"></a>00653 <span class="comment"> (curmatrix[i]
&amp; (1 &lt;&lt; 6) ? 1 : 0),</span>
<a name="l00654"></a>00654 <span class="comment"> (curmatrix[i]
&amp; (1 &lt;&lt; 7) ? 1 : 0));</span>
<a name="l00655"></a>00655 <span class="comment"> */</span>
<a name="l00656"></a>00656 sprintf(buffer, <span
class="stringliteral">"%2x"</span>, <a class="code"
href="firmware_2main_8c.html#4031bd527c85f293b4fca70e11dd337b" title="contains
current state of the keyboard">curmatrix</a>[i]);
<a name="l00657"></a>00657 <a class="code"
href="firmware_2main_8c.html#53e32b8c00eb3077d56eb67e69f0f55f" title="Send a string
to the computer.">sendString</a>(buffer);
<a name="l00658"></a>00658 <span class="keywordflow">if</span> (i == 7) {
<a name="l00659"></a>00659 <a class="code"
href="firmware_2main_8c.html#53e32b8c00eb3077d56eb67e69f0f55f" title="Send a string
to the computer.">sendString</a>(<span class="stringliteral">":"</span>);
<a name="l00660"></a>00660 } <span class="keywordflow">else</span> {
<a name="l00661"></a>00661 <a class="code"
href="firmware_2main_8c.html#53e32b8c00eb3077d56eb67e69f0f55f" title="Send a string
to the computer.">sendString</a>(<span class="stringliteral">"."</span>);
<a name="l00662"></a>00662 }
<a name="l00663"></a>00663 }
<a name="l00664"></a>00664 <a class="code"
href="firmware_2main_8c.html#53e32b8c00eb3077d56eb67e69f0f55f" title="Send a string
to the computer.">sendString</a>(<span class="stringliteral">"---"</span>);
<a name="l00665"></a>00665 }
<a name="l00666"></a>00666
<a name="l00679"></a><a class="code"
href="firmware_2main_8c.html#e57ab769295229435955aec63fe90a16">00679</a> uint8_t <a
class="code" href="firmware_2main_8c.html#e57ab769295229435955aec63fe90a16"
title="Scan and debounce keypresses.">scankeys</a>(<span
class="keywordtype">void</span>) {
<a name="l00680"></a>00680 <span class="keyword">static</span> uint8_t debounce
= 5;
<a name="l00681"></a>00681 uint8_t retval = 0;
<a name="l00682"></a>00682 <span class="keywordflow">for</span> (uint8_t row =
0; row &lt;= 15; row++) {
<a name="l00683"></a>00683 <span class="keywordflow">if</span> (row &lt;=
7) {
<a name="l00684"></a>00684 <a class="code"
href="firmware_2main_8c.html#054b4efed1b9fe12d1c162ab6eb3e12c" title="first port
connected to the matrix rows">DDRROWS1</a> = (1 &lt;&lt; row);
<a name="l00685"></a>00685 <a class="code"
href="firmware_2main_8c.html#2fb9b8c5860d621137c96ef9dd7a3176" title="first port
connected to the matrix rows">PORTROWS1</a> = ~(1 &lt;&lt; row);
<a name="l00686"></a>00686 <a class="code"
href="firmware_2main_8c.html#257249c4c5913255d7f78061c5c789ce" title="second port
connected to the matrix rows">DDRROWS2</a> = 0x00;
<a name="l00687"></a>00687 <a class="code"
href="firmware_2main_8c.html#b930861e78c97023f7f919abab96d57b" title="second port
connected to the matrix rows">PORTROWS2</a> = 0xff;
<a name="l00688"></a>00688 } <span class="keywordflow">else</span> {
<a name="l00689"></a>00689 <a class="code"
href="firmware_2main_8c.html#054b4efed1b9fe12d1c162ab6eb3e12c" title="first port
connected to the matrix rows">DDRROWS1</a> = 0x00;
<a name="l00690"></a>00690 <a class="code"
href="firmware_2main_8c.html#2fb9b8c5860d621137c96ef9dd7a3176" title="first port
connected to the matrix rows">PORTROWS1</a> = 0xff;
<a name="l00691"></a>00691 <span class="comment">// (15 - row) looks a
bit weird, you would expect (row - 8) here.</span>
<a name="l00692"></a>00692 <span class="comment">// This is because
pins on PORTC are ordered in the other direction</span>
<a name="l00693"></a>00693 <span class="comment">// than on PORTA. With
(15 - row), we have the bytes in the</span>
<a name="l00694"></a>00694 <span class="comment">// resulting matrix
matching the pins of the keyboard connector.</span>
<a name="l00695"></a>00695 <a class="code"
href="firmware_2main_8c.html#257249c4c5913255d7f78061c5c789ce" title="second port
connected to the matrix rows">DDRROWS2</a> = (1 &lt;&lt; (15 - row));
<a name="l00696"></a>00696 <a class="code"
href="firmware_2main_8c.html#b930861e78c97023f7f919abab96d57b" title="second port
connected to the matrix rows">PORTROWS2</a> = ~(1 &lt;&lt; (15 - row));
<a name="l00697"></a>00697 }
<a name="l00698"></a>00698 _delay_us(30);
<a name="l00699"></a>00699 uint8_t data = ~<a class="code"
href="firmware_2main_8c.html#82f68a695f5614aec3177e08d31ce7c4" title="port on which
we read the state of the columns">PINCOLUMNS</a>;
<a name="l00700"></a>00700 <span class="keywordflow">if</span> (data != <a
class="code" href="firmware_2main_8c.html#4031bd527c85f293b4fca70e11dd337b"
title="contains current state of the keyboard">curmatrix</a>[row]) {
<a name="l00701"></a>00701 <span class="comment">// if a change was
detected</span>
<a name="l00702"></a>00702 debounce = 10; <span class="comment">//
activate debounce counter</span>
<a name="l00703"></a>00703 <a class="code"
href="firmware_2main_8c.html#4031bd527c85f293b4fca70e11dd337b" title="contains
current state of the keyboard">curmatrix</a>[row] = data; <span class="comment">//
and store the result</span>
<a name="l00704"></a>00704 }
<a name="l00705"></a>00705 }
<a name="l00706"></a>00706 <span class="keywordflow">if</span> (debounce) {
<a name="l00707"></a>00707 <span class="comment">// Count down, but avoid
underflow</span>
<a name="l00708"></a>00708 debounce--;
<a name="l00709"></a>00709 }
<a name="l00710"></a>00710 <span class="keywordflow">if</span> (debounce == 1)
{
<a name="l00711"></a>00711 <span class="comment">// debounce counter
expired, create report</span>
<a name="l00712"></a>00712 uint8_t reportIndex = 2; <span
class="comment">// reportBuffer[0] contains modifiers</span>
<a name="l00713"></a>00713 memset(reportBuffer, 0, <span
class="keyword">sizeof</span>(reportBuffer)); <span class="comment">// clear report
buffer</span>
<a name="l00714"></a>00714 <span class="keywordflow">for</span> (uint8_t
row = 0; row &lt;= 15; row++) { <span class="comment">// process all rows for key-
codes</span>
<a name="l00715"></a>00715 uint8_t data = <a class="code"
href="firmware_2main_8c.html#4031bd527c85f293b4fca70e11dd337b" title="contains
current state of the keyboard">curmatrix</a>[row]; <span class="comment">// restore
buffer</span>
<a name="l00716"></a>00716 <span class="keywordflow">if</span> (data !=
0xff) { <span class="comment">// anything on this row? - optimization</span>
<a name="l00717"></a>00717 <span class="keywordflow">for</span>
(uint8_t col = 0; col &lt;= 7; col++) { <span class="comment">// check every bit on
this row</span>
<a name="l00718"></a>00718 uint8_t key, modifier;
<a name="l00719"></a>00719 <span class="keywordflow">if</span>
(data &amp; (1 &lt;&lt; col)) {
<a name="l00720"></a>00720 key = pgm_read_byte(&amp;<a
class="code" href="firmware_2main_8c.html#aeada6842a93dfcdd895fbdfb22b35c0"
title="The keymatrix-array contains positions of keys in the
matrix.">keymatrix</a>[row][col]);
<a name="l00721"></a>00721 modifier = pgm_read_byte(&amp;<a
class="code" href="firmware_2main_8c.html#9551cf4b116323bed1c59c814ba339d9"
title="The modmatrix-array contains positions of the modifier-keys in the
matrix.">modmatrix</a>[row][col]);
<a name="l00722"></a>00722 } <span
class="keywordflow">else</span> {
<a name="l00723"></a>00723 key = <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a>;
<a name="l00724"></a>00724 modifier = <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>;
<a name="l00725"></a>00725 }
<a name="l00726"></a>00726 <span class="keywordflow">if</span>
(key != <a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213ba445101e4a53cb60973ae8ddd7ca
3c44">KEY_Reserved</a>) { <span class="comment">// keycode should be added to
report</span>
<a name="l00727"></a>00727 <span
class="keywordflow">if</span> (reportIndex &gt;= <span
class="keyword">sizeof</span>(reportBuffer)) { <span class="comment">// too many
keycodes</span>
<a name="l00728"></a>00728 <span
class="keywordflow">if</span> (!retval &amp; 0x02) { <span class="comment">// Only
fill buffer once</span>
<a name="l00729"></a>00729 memset(reportBuffer+2,
<a class="code"
href="keycodes_8h.html#69877ab2ad01f176a4e2f2095fd3213b6024227ff712f243230317a0a5e2
56c3">KEY_ErrorRollOver</a>, <span class="keyword">sizeof</span>(reportBuffer)-2);
<a name="l00730"></a>00730 retval |= 0x02; <span
class="comment">// continue decoding to get modifiers</span>
<a name="l00731"></a>00731 }
<a name="l00732"></a>00732 } <span
class="keywordflow">else</span> {
<a name="l00733"></a>00733 reportBuffer[reportIndex] =
key; <span class="comment">// set next available entry</span>
<a name="l00734"></a>00734 reportIndex++;
<a name="l00735"></a>00735 }
<a name="l00736"></a>00736 }
<a name="l00737"></a>00737 <span class="keywordflow">if</span>
(modifier != <a class="code"
href="keycodes_8h.html#d40e52e166700bbc1292f040353f1f53a8f2a864daf0fc895eb702ab057b
34c7">MOD_NONE</a>) { <span class="comment">// modifier should be added to
report</span>
<a name="l00738"></a>00738 reportBuffer[0] |= modifier;
<a name="l00739"></a>00739 }
<a name="l00740"></a>00740 }
<a name="l00741"></a>00741 }
<a name="l00742"></a>00742 }
<a name="l00743"></a>00743 retval |= 0x01; <span class="comment">// must
have been a change at some point, since debounce is done</span>
<a name="l00744"></a>00744 }
<a name="l00745"></a>00745 <span class="keywordflow">return</span> retval;
<a name="l00746"></a>00746 }
<a name="l00747"></a>00747
<a name="l00748"></a>00748 <span class="comment">/*
------------------------------------------------------------------------- */</span>
<a name="l00749"></a>00749
<a name="l00755"></a><a class="code"
href="firmware_2main_8c.html#840291bc02cba5474a4cb46a9b9566fe">00755</a> <span
class="keywordtype">int</span> <a class="code"
href="bootloader_2main_8c.html#840291bc02cba5474a4cb46a9b9566fe">main</a>(<span
class="keywordtype">void</span>) {
<a name="l00756"></a>00756 uint8_t updateNeeded = 0;
<a name="l00757"></a>00757 uint8_t idleCounter = 0;
<a name="l00758"></a>00758 wdt_enable(WDTO_2S);
<a name="l00759"></a>00759 hardwareInit();
<a name="l00760"></a>00760 usbInit();
<a name="l00761"></a>00761 sei();
<a name="l00762"></a>00762
<a name="l00763"></a>00763 <a class="code"
href="firmware_2main_8c.html#e57ab769295229435955aec63fe90a16" title="Scan and
debounce keypresses.">scankeys</a>();
<a name="l00764"></a>00764 <span class="keywordflow">while</span> (1) {
<a name="l00765"></a>00765 <span class="comment">// main event loop</span>
<a name="l00766"></a>00766 wdt_reset();
<a name="l00767"></a>00767 usbPoll();
<a name="l00768"></a>00768
<a name="l00769"></a>00769 updateNeeded = <a class="code"
href="firmware_2main_8c.html#e57ab769295229435955aec63fe90a16" title="Scan and
debounce keypresses.">scankeys</a>(); <span class="comment">// changes?</span>
<a name="l00770"></a>00770
<a name="l00771"></a>00771 <span class="comment">// check timer if we need
periodic reports</span>
<a name="l00772"></a>00772 <span class="keywordflow">if</span> (TIFR &amp;
(1 &lt;&lt; TOV0)) {
<a name="l00773"></a>00773 TIFR = (1 &lt;&lt; TOV0); <span
class="comment">// reset flag</span>
<a name="l00774"></a>00774 <span class="keywordflow">if</span>
(idleRate != 0) { <span class="comment">// do we need periodic reports?</span>
<a name="l00775"></a>00775 <span
class="keywordflow">if</span>(idleCounter &gt; 4){ <span class="comment">// yes,
but not yet</span>
<a name="l00776"></a>00776 idleCounter -= 5; <span
class="comment">// 22ms in units of 4ms</span>
<a name="l00777"></a>00777 } <span class="keywordflow">else</span>
{ <span class="comment">// yes, it is time now</span>
<a name="l00778"></a>00778 updateNeeded = 1;
<a name="l00779"></a>00779 idleCounter = idleRate;
<a name="l00780"></a>00780 }
<a name="l00781"></a>00781 }
<a name="l00782"></a>00782 }
<a name="l00783"></a>00783 <span class="comment">// if an update is needed,
send the report</span>
<a name="l00784"></a>00784 <span class="keywordflow">if</span>
(updateNeeded &amp;&amp; usbInterruptIsReady()) {
<a name="l00785"></a>00785 updateNeeded = 0;
<a name="l00786"></a>00786 usbSetInterrupt(reportBuffer, <span
class="keyword">sizeof</span>(reportBuffer));
<a name="l00787"></a>00787 }
<a name="l00788"></a>00788 }
<a name="l00789"></a>00789 <span class="keywordflow">return</span> 0;
<a name="l00790"></a>00790 }
<a name="l00791"></a>00791
<a name="l00792"></a>00792 <span class="comment">/*
------------------------------------------------------------------------- */</span>
</pre></div><hr size="1"><address style="text-align: right;"><small>Generated on
Sat Jul 12 22:27:15 2008 for Dulcimer by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.4
</small></address>
</body>
</html>

You might also like