[go: up one dir, main page]

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

Firmware 2main 8c-Source

This document contains source code for the main.c file of a firmware project. It defines macros for hardware I/O registers and pins, initializes the hardware ports and LEDs, and blinks the LEDs to indicate power-on. Key functions include initializing ports for the keyboard matrix columns and rows, configuring a timer for scanning, and setting up ports for USB, jumpers and status LEDs.

Uploaded by

antoyang77
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
25 views26 pages

Firmware 2main 8c-Source

This document contains source code for the main.c file of a firmware project. It defines macros for hardware I/O registers and pins, initializes the hardware ports and LEDs, and blinks the LEDs to indicate power-on. Key functions include initializing ports for the keyboard matrix columns and rows, configuring a timer for scanning, and setting up ports for USB, jumpers and status LEDs.

Uploaded by

antoyang77
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
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