summaryrefslogtreecommitdiffstats
path: root/Graphic_Equalizer/doc/html/display_8hcc-source.html
diff options
context:
space:
mode:
Diffstat (limited to 'Graphic_Equalizer/doc/html/display_8hcc-source.html')
-rw-r--r--Graphic_Equalizer/doc/html/display_8hcc-source.html319
1 files changed, 319 insertions, 0 deletions
diff --git a/Graphic_Equalizer/doc/html/display_8hcc-source.html b/Graphic_Equalizer/doc/html/display_8hcc-source.html
new file mode 100644
index 0000000..e360065
--- /dev/null
+++ b/Graphic_Equalizer/doc/html/display_8hcc-source.html
@@ -0,0 +1,319 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
+<title>Graphic Equalizer: C:/Project Marcel &amp; Oliver/Graphic_Equalizer/src/display.hcc Source File</title>
+<link href="doxygen.css" rel="stylesheet" type="text/css">
+</head><body>
+<!-- Generated by Doxygen 1.3.9.1 -->
+<div class="qindex"><a class="qindex" href="main.html">Main&nbsp;Page</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="globals.html">Globals</a></div>
+<div class="nav">
+<a class="el" href="dir_000000.html">C:</a>&nbsp;/&nbsp;<a class="el" href="dir_000001.html">Project Marcel &amp; Oliver</a>&nbsp;/&nbsp;<a class="el" href="dir_000002.html">Graphic_Equalizer</a>&nbsp;/&nbsp;<a class="el" href="dir_000004.html">src</a></div>
+<h1>display.hcc</h1><a href="display_8hcc.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001
+00019 <span class="comment">/*</span>
+00020 <span class="comment"> * Set the Clock rate for this domain. 25.175 Mhz is required for the Video output.</span>
+00021 <span class="comment"> */</span>
+00022 <span class="preprocessor">#define PAL_TARGET_CLOCK_RATE 25175000</span>
+00023 <span class="preprocessor"></span>
+00024 <span class="comment">/******** System Includes *************/</span>
+00025 <span class="preprocessor">#include &lt;stdlib.hch&gt;</span>
+00026
+00027 <span class="preprocessor">#include "pal_master.hch"</span>
+00028
+00029 <span class="comment">/******** Application Includes ********/</span>
+00030 <span class="preprocessor">#include "<a class="code" href="configuration_8hch.html">configuration.hch</a>"</span>
+00031 <span class="preprocessor">#include "<a class="code" href="audio_8hch.html">audio.hch</a>"</span>
+00032 <span class="preprocessor">#include "<a class="code" href="eventhandler__shared_8hch.html">eventhandler_shared.hch</a>"</span>
+00033 <span class="preprocessor">#include "<a class="code" href="mouse__shared_8hch.html">mouse_shared.hch</a>"</span>
+00034 <span class="preprocessor">#include "<a class="code" href="display__shared_8hch.html">display_shared.hch</a>"</span>
+00035 <span class="preprocessor">#include "<a class="code" href="display_8hch.html">display.hch</a>"</span>
+00036
+00037 <span class="preprocessor">#if HAVE_DEBUG</span>
+00038 <span class="preprocessor"></span><span class="preprocessor"> #include "debug.hch"</span>
+00039 <span class="preprocessor">#endif</span>
+00040 <span class="preprocessor"></span>
+00041
+00042
+00043 <span class="comment">/*</span>
+00044 <span class="comment"> * Channel to notify others when new mousedata is available. If so</span>
+00045 <span class="comment"> * Then mousedata struct is updated with shared data.</span>
+00046 <span class="comment"> */</span>
+00047 chan <span class="keywordtype">unsigned</span> 1 maskupdate_notification;
+00048
+00049
+00050
+<a name="l00064"></a><a class="code" href="display_8hcc.html#a3">00064</a> <span class="keywordtype">void</span> <a class="code" href="display_8hcc.html#a3">display_main</a>(skindata_t *skindata, audiodata_t *audiodata, events_t *events, mousedata_t *mousedata) {
+00065 <span class="comment">/*</span>
+00066 <span class="comment"> * Setup macro's RAM/Video handles and to coordinate pixel writing.</span>
+00067 <span class="comment"> */</span>
+00068 macro expr CLOCKRATE = PAL_ACTUAL_CLOCK_RATE;
+00069 macro expr VIDEOOUT = PalVideoOutOptimalCT(CLOCKRATE);
+00070 macro expr RAM_BANK0 = PalPL2RAMCT(0);
+00071 macro expr DW = PalPL2RAMGetMaxDataWidthCT();
+00072 macro expr AW = PalPL2RAMGetMaxAddressWidthCT();
+00073 macro expr VISIBLEX = PalVideoOutGetVisibleX(VIDEOOUT, CLOCKRATE);
+00074 macro expr TOTALX = PalVideoOutGetTotalX(VIDEOOUT, CLOCKRATE);
+00075 macro expr TOTALY = PalVideoOutGetTotalY(VIDEOOUT);
+00076 macro expr SCANX = PalVideoOutGetX(VIDEOOUT);
+00077 macro expr SCANY = PalVideoOutGetY(VIDEOOUT);
+00078
+00079 <span class="keywordtype">unsigned</span> DW pixeldata;
+00080 <span class="keywordtype">unsigned</span> 24 visual_graph_color;
+00081 <span class="keywordtype">unsigned</span> AW address, address_offset;
+00082
+00083 <span class="comment">/*</span>
+00084 <span class="comment"> * To draw something usefull when only drawing our mask, we simply draw the</span>
+00085 <span class="comment"> * mask itself. Thus creating a blueish image to help identify all interesting</span>
+00086 <span class="comment"> * area's on the screen. Otherwise we only use the last 24 bits, the RGB values</span>
+00087 <span class="comment"> * to draw on the screen.</span>
+00088 <span class="comment"> */</span>
+00089 <span class="preprocessor">#if (USE_MASK_ONLY &amp;&amp; HAVE_SMARTMEDIA)</span>
+00090 <span class="preprocessor"></span><span class="preprocessor">#define PIXEL (0 @ pixeldata[31:24])</span>
+00091 <span class="preprocessor"></span><span class="preprocessor">#else</span>
+00092 <span class="preprocessor"></span><span class="preprocessor">#define PIXEL (pixeldata &lt;- 24)</span>
+00093 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
+00094 <span class="preprocessor"></span>
+00095 <span class="comment">/*</span>
+00096 <span class="comment"> * If the passed button_state tells us the button is active, then we</span>
+00097 <span class="comment"> * the button is 'on' and we draw it inverted. Otherwise we draw the</span>
+00098 <span class="comment"> * area of the button normally.</span>
+00099 <span class="comment"> */</span>
+00100 macro proc draw_button(button_state) {
+00101 <span class="keywordflow">if</span> (button_state == pixeldata[31:24]) {
+00102 PalVideoOutWrite(VIDEOOUT, ~PIXEL);
+00103 } <span class="keywordflow">else</span> {
+00104 PalVideoOutWrite(VIDEOOUT, PIXEL);
+00105 }
+00106 }
+00107
+00108 <span class="comment">/*</span>
+00109 <span class="comment"> * Prime Rendering Pipeline to start where the skin starts.</span>
+00110 <span class="comment"> */</span>
+00111 PalPL2RAMSetReadAddress(RAM_BANK0, ADDRESS_SKIN_START);
+00112
+00113 <span class="comment">/*</span>
+00114 <span class="comment"> * Run the following tasks indefinatly and in parallel</span>
+00115 <span class="comment"> */</span>
+00116 <span class="keywordflow">while</span> (TRUE) {
+00117 par {
+00118 <span class="comment">/*</span>
+00119 <span class="comment"> * Before starting this loop we allready set the the</span>
+00120 <span class="comment"> * address. Therefor we can start reading the</span>
+00121 <span class="comment"> * previously set address and prepare the next address</span>
+00122 <span class="comment"> * for the next cycle.</span>
+00123 <span class="comment"> */</span>
+00124 PalPL2RAMRead(RAM_BANK0, &amp;pixeldata);
+00125 PalPL2RAMSetReadAddress(RAM_BANK0, address_offset +address);
+00126
+00127 <span class="comment">/*</span>
+00128 <span class="comment"> */</span>
+00129 <span class="keywordflow">switch</span> (events-&gt;mode) {
+00130 <span class="keywordflow">case</span> MODE_HELP:
+00131 address_offset = ADDRESS_HELP_START;
+00132 <span class="keywordflow">break</span>;
+00133 <span class="keywordflow">case</span> MODE_GRAPH:
+00134 address_offset = ADDRESS_GRAPHMASK_START;
+00135 <span class="keywordflow">break</span>;
+00136 <span class="keywordflow">default</span>:
+00137 address_offset = ADDRESS_SKIN_START;
+00138 <span class="keywordflow">break</span>;
+00139 }
+00140
+00141 <span class="keywordflow">if</span> (MODE_GRAPH == events-&gt;mode) {
+00142 par {
+00143 visual_graph_color = ((<span class="keywordtype">unsigned</span> 8)(0 @ audiodata-&gt;fft_info.read[pixeldata[31:24]]) &lt;&lt; 1) @ ((<span class="keywordtype">unsigned</span> 8)(0 @ audiodata-&gt;fft_info.read[pixeldata[31:24]]) &lt;&lt; -1) @ ((<span class="keywordtype">unsigned</span> 8)(0 @ audiodata-&gt;fft_info.read[pixeldata[31:24]]) &lt;&lt; 0);
+00144 PalVideoOutWrite(VIDEOOUT, 0 @ visual_graph_color);
+00145 }
+00146 } <span class="keywordflow">else</span> {
+00147 <span class="comment">/*</span>
+00148 <span class="comment"> * Determin what to draw where here. Every case has an</span>
+00149 <span class="comment"> * if else statement comparing wether to draw something</span>
+00150 <span class="comment"> * special or the background. Every specific drawing</span>
+00151 <span class="comment"> * obviously only happens in the masked area.</span>
+00152 <span class="comment"> */</span>
+00153 <span class="keywordflow">switch</span> (pixeldata[31:24]) {
+00154 <span class="comment">/*</span>
+00155 <span class="comment"> */</span>
+00156 <span class="keywordflow">case</span> AREA_WAVEFORM:
+00157 <span class="keywordflow">if</span> (SCANY == 0 @ skindata-&gt;area_waveform_bottom -(0 @ (audiodata-&gt;ifft_info.read[((SCANX -(0 @ skindata-&gt;area_waveform_left)) &lt;-8)]))) {
+00158 PalVideoOutWrite(VIDEOOUT, skindata-&gt;color_area_waveform);
+00159 } <span class="keywordflow">else</span> {
+00160 PalVideoOutWrite(VIDEOOUT, PIXEL);
+00161 }
+00162 <span class="keywordflow">break</span>;
+00163
+00164 <span class="comment">/*</span>
+00165 <span class="comment"> * Volume control over the Y-axis.</span>
+00166 <span class="comment"> */</span>
+00167 <span class="keywordflow">case</span> AREA_VOLUME_YAXIS:
+00168 <span class="comment">/*</span>
+00169 <span class="comment"> * The volume_position stores the</span>
+00170 <span class="comment"> * highest point of our bar. Every</span>
+00171 <span class="comment"> * pixel after this point is drawn.</span>
+00172 <span class="comment"> */</span>
+00173 <span class="keywordflow">if</span> (SCANY &gt;= 0 @ events-&gt;volume_position) {
+00174 PalVideoOutWrite(VIDEOOUT, skindata-&gt;color_area_volume);
+00175 } <span class="keywordflow">else</span> {
+00176 PalVideoOutWrite(VIDEOOUT, PIXEL);
+00177 }
+00178 <span class="keywordflow">break</span>;
+00179
+00180 <span class="comment">/*</span>
+00181 <span class="comment"> * Spectrum Analyzer</span>
+00182 <span class="comment"> */</span>
+00183 <span class="keywordflow">case</span> AREA_SPECTRUM_ANALYZER:
+00184 <span class="comment">/*</span>
+00185 <span class="comment"> * We draw every pixel that is smaller TODO</span>
+00186 <span class="comment"> */</span>
+00187 <span class="keywordflow">if</span> ((SCANY &gt;= (0 @ skindata-&gt;area_spectrum_bottom) -(0 @ audiodata-&gt;fft_info.read[(SCANX -(0 @ skindata-&gt;area_spectrum_left))[9:2]])) &amp;&amp; ((SCANX -(0 @ skindata-&gt;area_spectrum_left)) &lt;- 2)) {
+00188 PalVideoOutWrite(VIDEOOUT, PIXEL_SPECTRUM);
+00189 } <span class="keywordflow">else</span> {
+00190 PalVideoOutWrite(VIDEOOUT, PIXEL);
+00191 }
+00192 <span class="keywordflow">break</span>;
+00193
+00194 <span class="comment">/*</span>
+00195 <span class="comment"> * Since all buttons are drawn equally, either</span>
+00196 <span class="comment"> * we draw them normally or we inverse them, we</span>
+00197 <span class="comment"> * can handle them almost equally.</span>
+00198 <span class="comment"> */</span>
+00199 <span class="keywordflow">case</span> BUTTON_PRESET_1: <span class="comment">/* fall through */</span>
+00200 <span class="keywordflow">case</span> BUTTON_PRESET_2: <span class="comment">/* fall through */</span>
+00201 <span class="keywordflow">case</span> BUTTON_PRESET_3: <span class="comment">/* fall through */</span>
+00202 <span class="keywordflow">case</span> BUTTON_PRESET_4: <span class="comment">/* fall through */</span>
+00203 <span class="keywordflow">case</span> BUTTON_PRESET_5: <span class="comment">/* fall through */</span>
+00204 <span class="keywordflow">case</span> BUTTON_PRESET_6:
+00205 <span class="comment">/*</span>
+00206 <span class="comment"> * The active preset tells us what</span>
+00207 <span class="comment"> * button is currently enabled. We must</span>
+00208 <span class="comment"> * however not forget to add the preset</span>
+00209 <span class="comment"> * button offset to possibly match it</span>
+00210 <span class="comment"> * with the current mask.</span>
+00211 <span class="comment"> */</span>
+00212 draw_button((events-&gt;active_preset +BUTTON_PRESET_1) &lt;- 8);
+00213 <span class="keywordflow">break</span>;
+00214
+00215 <span class="keywordflow">case</span> BUTTON_CONVEX_FULL: <span class="comment">/* fall through */</span>
+00216 <span class="keywordflow">case</span> BUTTON_CONVEX_HALF: <span class="comment">/* fall through */</span>
+00217 <span class="keywordflow">case</span> BUTTON_PRECISE: <span class="comment">/* fall through */</span>
+00218 <span class="keywordflow">case</span> BUTTON_CONCAVE_HALF: <span class="comment">/* fall through */</span>
+00219 <span class="keywordflow">case</span> BUTTON_CONCAVE_FULL:
+00220 <span class="comment">/*</span>
+00221 <span class="comment"> * equalizer mode tells us what button</span>
+00222 <span class="comment"> * is currently enabled. By adding the</span>
+00223 <span class="comment"> * equalizer mode button offset we can</span>
+00224 <span class="comment"> * safley check wether it matches our</span>
+00225 <span class="comment"> * mask.</span>
+00226 <span class="comment"> */</span>
+00227 draw_button((0 @ events-&gt;equalizer_mode) +BUTTON_CONVEX_FULL);
+00228 <span class="keywordflow">break</span>;
+00229
+00230 <span class="keywordflow">case</span> BUTTON_LOG:
+00231 <span class="comment">/*</span>
+00232 <span class="comment"> * </span>
+00233 <span class="comment"> */</span>
+00234 draw_button((0 @ audiodata-&gt;display_log) +BUTTON_LOG);
+00235 <span class="keywordflow">break</span>;
+00236
+00237 <span class="comment">/*</span>
+00238 <span class="comment"> * The default case is split up into two parts</span>
+00239 <span class="comment"> * actually. This is because we have 128 bands</span>
+00240 <span class="comment"> * for the equalizer and thus as many mask</span>
+00241 <span class="comment"> * entries. Since we don't want 128 identical</span>
+00242 <span class="comment"> * cases we check wether the equalizer mask is</span>
+00243 <span class="comment"> * currently active and if so draw it. If this</span>
+00244 <span class="comment"> * is not the case we simply draw the</span>
+00245 <span class="comment"> * background.</span>
+00246 <span class="comment"> */</span>
+00247 <span class="keywordflow">default</span>:
+00248 <span class="comment">/* (pixeldata[31:24] &lt;= AREA_EQUALIZER_MAX) &amp;&amp; */</span>
+00249 <span class="keywordflow">if</span> (!events-&gt;locked_equalizer) {
+00250 <span class="keywordflow">if</span> ((AREA_EQUALIZER_MIN &lt;= pixeldata[31:24]) &amp;&amp; ((SCANY -(0 @ SCANY &lt;- 1)) == 0 @ events-&gt;equalizer_display[(pixeldata[31:24] -AREA_EQUALIZER_MIN) &lt;- 7])) {
+00251 PalVideoOutWrite(VIDEOOUT, skindata-&gt;color_equalizer);
+00252 } <span class="keywordflow">else</span> {
+00253 PalVideoOutWrite(VIDEOOUT, PIXEL);
+00254 }
+00255 } <span class="keywordflow">else</span> {
+00256 PalVideoOutWrite(VIDEOOUT, PIXEL);
+00257 }
+00258 <span class="keywordflow">break</span>;
+00259 }
+00260 }
+00261
+00262 <span class="comment">/*</span>
+00263 <span class="comment"> * We compare our current X and Y scan positions of the</span>
+00264 <span class="comment"> * output to the x and y data of the mouse. When those</span>
+00265 <span class="comment"> * are equal we set the current mask to the mask stored</span>
+00266 <span class="comment"> * in memory at that location. We then know what mask</span>
+00267 <span class="comment"> * is to be used for events.</span>
+00268 <span class="comment"> */</span>
+00269 <span class="keywordflow">if</span> (MOUSE_UPDATED == mousedata-&gt;status) {
+00270 <span class="keywordflow">if</span> ((SCANX == 0 @ mousedata-&gt;x) &amp;&amp; (SCANY == 0 @ mousedata-&gt;y)) {
+00271 par {
+00272 events-&gt;mask = pixeldata[31:24];
+00273 mousedata-&gt;status = MOUSE_NOT_UPDATED;
+00274 maskupdate_notification ! MOUSE_UPDATED;
+00275 }
+00276 } <span class="keywordflow">else</span> {
+00277 delay;
+00278 }
+00279 } <span class="keywordflow">else</span> {
+00280 delay;
+00281 }
+00282
+00283 <span class="comment">/*</span>
+00284 <span class="comment"> * The current position of the screen can lay in an</span>
+00285 <span class="comment"> * area called the blanking area. We don't have data</span>
+00286 <span class="comment"> * for this area as it is not drawn. We therefor have</span>
+00287 <span class="comment"> * to determin wether we are beyond the visible area of</span>
+00288 <span class="comment"> * the screen, but before the end of the total width of</span>
+00289 <span class="comment"> * the screen. Our pipeline consists of 4 total stages.</span>
+00290 <span class="comment"> * Therefor we have to substract 4 pixels.</span>
+00291 <span class="comment"> */</span>
+00292 <span class="keywordflow">if</span> ((SCANX &gt; (VISIBLEX - 4)) &amp;&amp; (SCANX &lt;= (TOTALX - 4))) {
+00293 <span class="comment">/*</span>
+00294 <span class="comment"> * We are in the blanking area of the screen.</span>
+00295 <span class="comment"> * If we are on the last line, and thus last</span>
+00296 <span class="comment"> * pixel we reset our address counter.</span>
+00297 <span class="comment"> */</span>
+00298 <span class="keywordflow">if</span> (SCANY == (TOTALY -1)) {
+00299 <span class="comment">/*</span>
+00300 <span class="comment"> * Reset our draw address counter to 0.</span>
+00301 <span class="comment"> */</span>
+00302 address = 0;
+00303 } <span class="keywordflow">else</span> {
+00304 <span class="comment">/*</span>
+00305 <span class="comment"> * We should not ever get inhere. To</span>
+00306 <span class="comment"> * keep everything consequent however,</span>
+00307 <span class="comment"> * we add a delay.</span>
+00308 <span class="comment"> */</span>
+00309 delay;
+00310 }
+00311 } <span class="keywordflow">else</span> {
+00312 <span class="comment">/*</span>
+00313 <span class="comment"> * Increase the memory counter for each pixel</span>
+00314 <span class="comment"> * drawn thus keeping the memory location in</span>
+00315 <span class="comment"> * sync with the current pixel position.</span>
+00316 <span class="comment"> */</span>
+00317 address++;
+00318 }
+00319 }
+00320 }
+00321 } <span class="comment">/* --- display_main() --- */</span>
+00322
+00323
+00324
+<a name="l00337"></a><a class="code" href="display_8hcc.html#a4">00337</a> <span class="keywordtype">void</span> <a class="code" href="display_8hcc.html#a4">reload_equalizer</a>(events_t *events, <span class="keywordtype">unsigned</span> 4 *equalizer_levels) {
+00338 <span class="keywordtype">unsigned</span> 7 equalizer_band;
+00339
+00340 events-&gt;locked_equalizer = TRUE;
+00341 delay;
+00342 <span class="keywordflow">do</span> {
+00343 events-&gt;equalizer_display[equalizer_band] = equalizer_table_inv[equalizer_levels[equalizer_band]];
+00344 equalizer_band++;
+00345 } <span class="keywordflow">while</span> (equalizer_band);
+00346 events-&gt;locked_equalizer = FALSE;
+00347 } <span class="comment">/* --- reload_equalizer() --- */</span>
+</pre></div><hr size="1"><address style="align: right;"><small>Generated on Mon Nov 29 12:04:47 2004 for Graphic Equalizer by&nbsp;
+<a href="http://www.doxygen.org/index.html">
+<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address>
+</body>
+</html>