Rev 182 | Rev 410 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download
GAS LISTING /tmp/ccQRbLT3.s page 1
1 .file "FrameMgr.c"
2 .arch atmega8
3 __SREG__ = 0x3f
4 __SP_H__ = 0x3e
5 __SP_L__ = 0x3d
6 __tmp_reg__ = 0
7 __zero_reg__ = 1
8 .global __do_copy_data
9 .global __do_clear_bss
10 .stabs "/home/kaklik/projects/programy/Atmel_C/AVRcam/",100,0,2,.Ltext0
11 .stabs "FrameMgr.c",100,0,2,.Ltext0
12 .text
13 .Ltext0:
14 .stabs "gcc2_compiled.",60,0,0,0
15 .stabs "int:t(0,1)=r(0,1);-32768;32767;",128,0,0,0
16 .stabs "char:t(0,2)=@s8;r(0,2);0;255;",128,0,0,0
17 .stabs "long int:t(0,3)=@s32;r(0,3);020000000000;017777777777;",128,0,0,0
18 .stabs "unsigned int:t(0,4)=r(0,4);0;0177777;",128,0,0,0
19 .stabs "long unsigned int:t(0,5)=@s32;r(0,5);0;037777777777;",128,0,0,0
20 .stabs "long long int:t(0,6)=@s64;r(0,6);01000000000000000000000;0777777777777777777777;",128,0,0,
21 .stabs "long long unsigned int:t(0,7)=@s64;r(0,7);0;01777777777777777777777;",128,0,0,0
22 .stabs "short int:t(0,8)=r(0,8);-32768;32767;",128,0,0,0
23 .stabs "short unsigned int:t(0,9)=r(0,9);0;0177777;",128,0,0,0
24 .stabs "signed char:t(0,10)=@s8;r(0,10);-128;127;",128,0,0,0
25 .stabs "unsigned char:t(0,11)=@s8;r(0,11);0;255;",128,0,0,0
26 .stabs "float:t(0,12)=r(0,1);4;0;",128,0,0,0
27 .stabs "double:t(0,13)=r(0,1);4;0;",128,0,0,0
28 .stabs "long double:t(0,14)=r(0,1);4;0;",128,0,0,0
29 .stabs "void:t(0,15)=(0,15)",128,0,0,0
30 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/stdlib.h",130,0,0,0
31 .stabs "/usr/lib/gcc/avr/4.1.0/include/stddef.h",130,0,0,0
32 .stabs "size_t:t(2,1)=(0,4)",128,0,214,0
33 .stabs "wchar_t:t(2,2)=(0,1)",128,0,326,0
34 .stabn 162,0,0,0
35 .stabs "div_t:t(1,1)=(1,2)=s4quot:(0,1),0,16;rem:(0,1),16,16;;",128,0,69,0
36 .stabs "ldiv_t:t(1,3)=(1,4)=s8quot:(0,3),0,32;rem:(0,3),32,32;;",128,0,75,0
37 .stabs "__compar_fn_t:t(1,5)=(1,6)=*(1,7)=f(0,1)",128,0,78,0
38 .stabn 162,0,0,0
39 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/io.h",130,0,0,0
40 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/avr/sfr_defs.h",130,0,0,0
41 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/inttypes.h",130,0,0,0
42 .stabs "/usr/lib/gcc/avr/4.1.0/../../../../avr/include/stdint.h",130,0,0,0
43 .stabs "int8_t:t(6,1)=(0,10)",128,0,116,0
44 .stabs "uint8_t:t(6,2)=(0,11)",128,0,117,0
45 .stabs "int16_t:t(6,3)=(0,1)",128,0,118,0
46 .stabs "uint16_t:t(6,4)=(0,4)",128,0,119,0
47 .stabs "int32_t:t(6,5)=(0,3)",128,0,120,0
48 .stabs "uint32_t:t(6,6)=(0,5)",128,0,121,0
49 .stabs "int64_t:t(6,7)=(0,6)",128,0,122,0
50 .stabs "uint64_t:t(6,8)=(0,7)",128,0,123,0
51 .stabs "intptr_t:t(6,9)=(6,3)",128,0,135,0
52 .stabs "uintptr_t:t(6,10)=(6,4)",128,0,140,0
53 .stabs "int_least8_t:t(6,11)=(6,1)",128,0,152,0
54 .stabs "uint_least8_t:t(6,12)=(6,2)",128,0,157,0
55 .stabs "int_least16_t:t(6,13)=(6,3)",128,0,162,0
56 .stabs "uint_least16_t:t(6,14)=(6,4)",128,0,167,0
57 .stabs "int_least32_t:t(6,15)=(6,5)",128,0,172,0
GAS LISTING /tmp/ccQRbLT3.s page 2
58 .stabs "uint_least32_t:t(6,16)=(6,6)",128,0,177,0
59 .stabs "int_least64_t:t(6,17)=(6,7)",128,0,182,0
60 .stabs "uint_least64_t:t(6,18)=(6,8)",128,0,187,0
61 .stabs "int_fast8_t:t(6,19)=(6,1)",128,0,200,0
62 .stabs "uint_fast8_t:t(6,20)=(6,2)",128,0,205,0
63 .stabs "int_fast16_t:t(6,21)=(6,3)",128,0,210,0
64 .stabs "uint_fast16_t:t(6,22)=(6,4)",128,0,215,0
65 .stabs "int_fast32_t:t(6,23)=(6,5)",128,0,220,0
66 .stabs "uint_fast32_t:t(6,24)=(6,6)",128,0,225,0
67 .stabs "int_fast64_t:t(6,25)=(6,7)",128,0,230,0
68 .stabs "uint_fast64_t:t(6,26)=(6,8)",128,0,235,0
69 .stabs "intmax_t:t(6,27)=(6,7)",128,0,249,0
70 .stabs "uintmax_t:t(6,28)=(6,8)",128,0,254,0
71 .stabn 162,0,0,0
72 .stabs "int_farptr_t:t(5,1)=(6,5)",128,0,76,0
73 .stabs "uint_farptr_t:t(5,2)=(6,6)",128,0,80,0
74 .stabn 162,0,0,0
75 .stabn 162,0,0,0
76 .stabn 162,0,0,0
77 .stabs "I2CInterface.h",130,0,0,0
78 .stabs "CommonDefs.h",130,0,0,0
79 .stabs "bool_t:t(8,1)=(0,11)",128,0,56,0
80 .stabn 162,0,0,0
81 .stabs "i2cCmd_t:t(7,1)=(7,2)=s2configReg:(0,11),0,8;data:(0,11),8,8;;",128,0,53,0
82 .stabn 162,0,0,0
83 .stabs " :T(0,16)=@s8;eST_FrameMgr_idle:0,ST_FrameMgr_TrackingFrame:1,ST_FrameMgr_DumpingFrame:2,;
84 .stabs "FrameMgr_State_t:t(0,17)=(0,11)",128,0,72,0
85 .stabs " :T(0,18)=@s8;enotTracked:0,color1:1,color2:2,color3:3,color4:4,color5:5,color6:6,color7:7
86 .stabs "trackedColor_t:t(0,19)=(0,11)",128,0,127,0
87 .stabs "trackedObject_t:t(0,20)=(0,21)=s8color:(0,19),0,8;lastLineXStart:(0,11),8,8;lastLineXFinis
88 .stabs "FrameMgr_processFrame:F(0,15)",36,0,517,FrameMgr_processFrame
89 .global FrameMgr_processFrame
90 .type FrameMgr_processFrame, @function
91 FrameMgr_processFrame:
92 .stabd 46,0,0
1:FrameMgr.c **** /*
2:FrameMgr.c **** Copyright (C) 2004 John Orlando
3:FrameMgr.c ****
4:FrameMgr.c **** AVRcam: a small real-time image processing engine.
5:FrameMgr.c ****
6:FrameMgr.c **** This program is free software; you can redistribute it and/or
7:FrameMgr.c **** modify it under the terms of the GNU General Public
8:FrameMgr.c **** License as published by the Free Software Foundation; either
9:FrameMgr.c **** version 2 of the License, or (at your option) any later version.
10:FrameMgr.c ****
11:FrameMgr.c **** This program is distributed in the hope that it will be useful,
12:FrameMgr.c **** but WITHOUT ANY WARRANTY; without even the implied warranty of
13:FrameMgr.c **** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14:FrameMgr.c **** General Public License for more details.
15:FrameMgr.c ****
16:FrameMgr.c **** You should have received a copy of the GNU General Public
17:FrameMgr.c **** License along with this program; if not, write to the Free Software
18:FrameMgr.c **** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19:FrameMgr.c ****
20:FrameMgr.c **** For more information on the AVRcam, please contact:
21:FrameMgr.c ****
22:FrameMgr.c **** john@jrobot.net
GAS LISTING /tmp/ccQRbLT3.s page 3
23:FrameMgr.c ****
24:FrameMgr.c **** or go to www.jrobot.net for more details regarding the system.
25:FrameMgr.c **** */
26:FrameMgr.c **** /*********************************************************
27:FrameMgr.c **** Module Name: FrameMgr.c
28:FrameMgr.c **** Module Date: 04/10/2004
29:FrameMgr.c **** Module Auth: John Orlando
30:FrameMgr.c ****
31:FrameMgr.c **** Description: This modules is responsible for performing
32:FrameMgr.c **** both medium and high level processing on image data.
33:FrameMgr.c **** This is performed at both the line level as well as
34:FrameMgr.c **** the frame level. It controls the main flow of the
35:FrameMgr.c **** system, adhering to all the critical timing
36:FrameMgr.c **** requirements (such as when serial data can be transferred,
37:FrameMgr.c **** etc).
38:FrameMgr.c ****
39:FrameMgr.c **** Revision History:
40:FrameMgr.c **** Date Rel Ver. Notes
41:FrameMgr.c **** 4/10/2004 0.1 Module created
42:FrameMgr.c **** 6/30/2004 1.0 Initial release for Circuit Cellar
43:FrameMgr.c **** contest.
44:FrameMgr.c **** 11/15/2004 1.2 Updated processLine() function so
45:FrameMgr.c **** it will remove objects less than
46:FrameMgr.c **** a specified length/width (reduces
47:FrameMgr.c **** shot noise)
48:FrameMgr.c **** *********************************************************/
49:FrameMgr.c ****
50:FrameMgr.c **** /* Includes */
51:FrameMgr.c **** #include <stdlib.h>
52:FrameMgr.c **** #include <string.h>
53:FrameMgr.c **** #include <avr/io.h>
54:FrameMgr.c **** #include "Executive.h"
55:FrameMgr.c **** #include "UIMgr.h"
56:FrameMgr.c **** #include "FrameMgr.h"
57:FrameMgr.c **** #include "CamInterface.h"
58:FrameMgr.c **** #include "UartInterface.h"
59:FrameMgr.c **** #include "Utility.h"
60:FrameMgr.c **** #include "I2CInterface.h"
61:FrameMgr.c **** #include "CamConfig.h"
62:FrameMgr.c **** #include "CommonDefs.h"
63:FrameMgr.c ****
64:FrameMgr.c **** /* Local Structures and Typedefs */
65:FrameMgr.c **** enum
66:FrameMgr.c **** {
67:FrameMgr.c **** ST_FrameMgr_idle,
68:FrameMgr.c **** ST_FrameMgr_TrackingFrame,
69:FrameMgr.c **** ST_FrameMgr_DumpingFrame
70:FrameMgr.c **** };
71:FrameMgr.c ****
72:FrameMgr.c **** typedef unsigned char FrameMgr_State_t;
73:FrameMgr.c ****
74:FrameMgr.c **** /* Definitions */
75:FrameMgr.c **** /* The most objects that can be tracked at any one time is 8.
76:FrameMgr.c **** This number is determined by the number of bytes that can be
77:FrameMgr.c **** sent out during a frame (one byte per line, 144 lines per frame)
78:FrameMgr.c **** with the number of bytes in a tracked object (7) + some wiggle
79:FrameMgr.c **** room :-) ... I guess this could be increased to around 20 if
GAS LISTING /tmp/ccQRbLT3.s page 4
80:FrameMgr.c **** we had enough room and cycles to process objects between lines */
81:FrameMgr.c **** #define MAX_TRACKED_OBJECTS 8
82:FrameMgr.c ****
83:FrameMgr.c **** /* This defines the number of bytes that make up a trackedObject_t
84:FrameMgr.c **** structure... */
85:FrameMgr.c **** #define SIZE_OF_TRACKED_OBJECT 8
86:FrameMgr.c ****
87:FrameMgr.c **** /* This define is used to turn off the timer overflow interrupt
88:FrameMgr.c **** that is generated when the PCLK overflows TIMER1 */
89:FrameMgr.c **** #define DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK 0xFB
90:FrameMgr.c ****
91:FrameMgr.c **** /* This define is used to determine if a run length is too small
92:FrameMgr.c **** to be concerned with. This helps to reduce the number of false
93:FrameMgr.c **** positives. */
94:FrameMgr.c **** #define MIN_OBJECT_TRACKING_WIDTH 3
95:FrameMgr.c ****
96:FrameMgr.c **** /* This define is used to determine if an object has enough
97:FrameMgr.c **** height to be considered worth tracking...it is used to reduce
98:FrameMgr.c **** shot noise */
99:FrameMgr.c **** #define MIN_OBJECT_TRACKING_HEIGHT 3
100:FrameMgr.c ****
101:FrameMgr.c **** /* This define is used to indicate how often the filter routine
102:FrameMgr.c **** that removes objects less than MIN_OBJECT_TRACKING_HEIGHT should
103:FrameMgr.c **** be executed. It is measured in a number of lines (7 nominally). */
104:FrameMgr.c **** #define RUN_OBJECT_FILTER_MASK 0x07
105:FrameMgr.c ****
106:FrameMgr.c **** /* This enum describes the possible colors that can
107:FrameMgr.c **** be tracked by the system. This can't be represented as
108:FrameMgr.c **** simple color names (red, brown, etc) due to the fact that
109:FrameMgr.c **** the user sets which colors will be associated with which
110:FrameMgr.c **** bits. Remember...after the AND operation of the indexed
111:FrameMgr.c **** color map values executes, either a single bit indicating
112:FrameMgr.c **** the color should be set, or no bits indicating that the
113:FrameMgr.c **** color isn't represented in the color map (notTracked). */
114:FrameMgr.c **** enum
115:FrameMgr.c **** {
116:FrameMgr.c **** notTracked,
117:FrameMgr.c **** color1, /* bit 1 color */
118:FrameMgr.c **** color2, /* bit 2 color */
119:FrameMgr.c **** color3, /* bit 3 color */
120:FrameMgr.c **** color4, /* bit 4 color */
121:FrameMgr.c **** color5, /* bit 5 color */
122:FrameMgr.c **** color6, /* bit 6 color */
123:FrameMgr.c **** color7, /* bit 7 color */
124:FrameMgr.c **** color8 /* bit 8 color */
125:FrameMgr.c **** };
126:FrameMgr.c ****
127:FrameMgr.c **** typedef unsigned char trackedColor_t;
128:FrameMgr.c ****
129:FrameMgr.c **** /* This structure defines the info that needs to be
130:FrameMgr.c **** maintained for each trackedObject in the trackingTable */
131:FrameMgr.c **** typedef struct
132:FrameMgr.c **** {
133:FrameMgr.c **** trackedColor_t color;
134:FrameMgr.c **** unsigned char lastLineXStart;
135:FrameMgr.c **** unsigned char lastLineXFinish;
136:FrameMgr.c **** unsigned char x_upperLeft;
GAS LISTING /tmp/ccQRbLT3.s page 5
137:FrameMgr.c **** unsigned char y_upperLeft;
138:FrameMgr.c **** unsigned char x_lowerRight;
139:FrameMgr.c **** unsigned char y_lowerRight;
140:FrameMgr.c **** unsigned char objectValid; /* used to be a fill byte...now it is
141:FrameMgr.c **** used to determine if the object is valid
142:FrameMgr.c **** or not...it gets invalidated if it is
143:FrameMgr.c **** determined that it is too small, or
144:FrameMgr.c **** that the object is within another object */
145:FrameMgr.c **** } trackedObject_t;
146:FrameMgr.c ****
147:FrameMgr.c **** /* These defines are used to index into each individual element in the
148:FrameMgr.c **** trackedObject_t structure. This seems to be MUCH more efficient than
149:FrameMgr.c **** accessing the elements in GCC. */
150:FrameMgr.c **** #define COLOR_OFFSET 0
151:FrameMgr.c **** #define LAST_LINE_X_START_OFFSET 1
152:FrameMgr.c **** #define LAST_LINE_X_FINISH_OFFSET 2
153:FrameMgr.c **** #define X_UPPER_LEFT_OFFSET 3
154:FrameMgr.c **** #define Y_UPPER_LEFT_OFFSET 4
155:FrameMgr.c **** #define X_LOWER_RIGHT_OFFSET 5
156:FrameMgr.c **** #define Y_LOWER_RIGHT_OFFSET 6
157:FrameMgr.c **** #define VALID_OBJECT_OFFSET 7
158:FrameMgr.c ****
159:FrameMgr.c **** /* Local Variables */
160:FrameMgr.c **** /* The trackedObjectTable is used to hold up to eight tracked objects
161:FrameMgr.c **** while they are being acquired. */
162:FrameMgr.c **** static trackedObject_t trackedObjectTable[MAX_TRACKED_OBJECTS];
163:FrameMgr.c **** static trackedObject_t *pCurrentTrackedObjectTable = trackedObjectTable;
164:FrameMgr.c **** static unsigned char lineCount = 0;
165:FrameMgr.c **** static FrameMgr_State_t currentState = ST_FrameMgr_idle;
166:FrameMgr.c **** static unsigned char numCurrTrackedObjects = 0;
167:FrameMgr.c **** static unsigned char numPrevTrackedObjects = 0;
168:FrameMgr.c **** static unsigned char trackedLineCount = 0;
169:FrameMgr.c ****
170:FrameMgr.c **** /* Local Functions */
171:FrameMgr.c **** static void FrameMgr_findConnectedness(void);
172:FrameMgr.c ****
173:FrameMgr.c **** /* Extern Functions */
174:FrameMgr.c **** /* These functions are located in assembly files, and thus
175:FrameMgr.c **** must be externed here so they can be referenced in the source below. */
176:FrameMgr.c **** extern void CamIntAsm_waitForNewTrackingFrame(unsigned char *pBuffer, unsigned char *pMemLookup);
177:FrameMgr.c **** extern void CamIntAsm_waitForNewDumpFrame(unsigned char *pCurrBuffer, unsigned char *pPrevBuffer);
178:FrameMgr.c **** extern void CamIntAsm_acquireTrackingLine(unsigned char *pBuffer, unsigned char *pMemLookup);
179:FrameMgr.c **** extern void CamIntAsm_acquireDumpLine(unsigned char *pCurrBuffer, unsigned char *pPrevBuffer);
180:FrameMgr.c ****
181:FrameMgr.c **** /***********************************************************
182:FrameMgr.c **** Function Name: FrameMgr_init
183:FrameMgr.c **** Function Description: This function is responsible
184:FrameMgr.c **** for initializing the FrameMgr. This includes
185:FrameMgr.c **** setting up the various buffers and data needed to
186:FrameMgr.c **** process each frame of image data.
187:FrameMgr.c **** Inputs: none
188:FrameMgr.c **** Outputs: none
189:FrameMgr.c **** ***********************************************************/
190:FrameMgr.c **** void FrameMgr_init(void)
191:FrameMgr.c **** {
192:FrameMgr.c **** memset(trackedObjectTable,0x00,sizeof(trackedObjectTable));
193:FrameMgr.c **** }
GAS LISTING /tmp/ccQRbLT3.s page 6
194:FrameMgr.c ****
195:FrameMgr.c ****
196:FrameMgr.c **** /***********************************************************
197:FrameMgr.c **** Function Name: FrameMgr_dispatchEvent
198:FrameMgr.c **** Function Description: This function is responsible for
199:FrameMgr.c **** taking an incoming event and performing the needed
200:FrameMgr.c **** actions with it as pertains to the FrameMgr.
201:FrameMgr.c **** Inputs: event - the generated event
202:FrameMgr.c **** Outputs: none
203:FrameMgr.c **** ***********************************************************/
204:FrameMgr.c **** void FrameMgr_dispatchEvent(unsigned char event)
205:FrameMgr.c **** {
206:FrameMgr.c **** switch(event)
207:FrameMgr.c **** {
208:FrameMgr.c **** case EV_DUMP_FRAME:
209:FrameMgr.c **** /* try re-initializing the camera before we start dumping */
210:FrameMgr.c ****
211:FrameMgr.c **** CamConfig_setCamReg(0x11,0x01); /* reduce the frame rate for dumping*/
212:FrameMgr.c **** CamConfig_sendFifoCmds();
213:FrameMgr.c **** Utility_delay(1000); /* allow the new frame rate to settle */
214:FrameMgr.c **** lineCount = 0;
215:FrameMgr.c **** currentState = ST_FrameMgr_DumpingFrame;
216:FrameMgr.c **** //CamIntAsm_waitForNewDumpFrame(currentLineBuffer,previousLineBuffer);
217:FrameMgr.c **** FrameMgr_acquireLine();
218:FrameMgr.c **** break;
219:FrameMgr.c ****
220:FrameMgr.c **** case EV_ENABLE_TRACKING:
221:FrameMgr.c **** currentState = ST_FrameMgr_TrackingFrame;
222:FrameMgr.c **** FrameMgr_acquireFrame();
223:FrameMgr.c **** break;
224:FrameMgr.c ****
225:FrameMgr.c **** case EV_ACQUIRE_FRAME_COMPLETE:
226:FrameMgr.c **** FrameMgr_processFrame();
227:FrameMgr.c **** break;
228:FrameMgr.c ****
229:FrameMgr.c **** case EV_PROCESS_FRAME_COMPLETE:
230:FrameMgr.c **** FrameMgr_acquireFrame();
231:FrameMgr.c **** break;
232:FrameMgr.c ****
233:FrameMgr.c **** case EV_SERIAL_DATA_RECEIVED:
234:FrameMgr.c **** if (currentState != ST_FrameMgr_idle)
235:FrameMgr.c **** {
236:FrameMgr.c **** /* we need to go back to processing line data, since
237:FrameMgr.c **** serial data reception interrupted us....just trash the
238:FrameMgr.c **** frame and act like the frame has been processed, which
239:FrameMgr.c **** will kick off the system to wait for the next line */
240:FrameMgr.c **** PUBLISH_EVENT(EV_PROCESS_FRAME_COMPLETE);
241:FrameMgr.c **** }
242:FrameMgr.c **** break;
243:FrameMgr.c ****
244:FrameMgr.c **** case EV_DISABLE_TRACKING:
245:FrameMgr.c **** /* tracking needs to be turned off */
246:FrameMgr.c **** currentState = ST_FrameMgr_idle;
247:FrameMgr.c **** break;
248:FrameMgr.c **** }
249:FrameMgr.c **** }
250:FrameMgr.c ****
GAS LISTING /tmp/ccQRbLT3.s page 7
251:FrameMgr.c **** /***********************************************************
252:FrameMgr.c **** Function Name: FrameMgr_acquireFrame
253:FrameMgr.c **** Function Description: This function is responsible for
254:FrameMgr.c **** beginning of the acquisition of a new frame of data
255:FrameMgr.c **** from the camera interface. The acquisition of this line
256:FrameMgr.c **** depends on the current state of the FrameMgr.
257:FrameMgr.c **** Inputs: none
258:FrameMgr.c **** Outputs: none
259:FrameMgr.c **** ***********************************************************/
260:FrameMgr.c **** void FrameMgr_acquireFrame(void)
261:FrameMgr.c **** {
262:FrameMgr.c **** if (currentState == ST_FrameMgr_TrackingFrame)
263:FrameMgr.c **** {
264:FrameMgr.c **** trackedLineCount = 0;
265:FrameMgr.c **** numPrevTrackedObjects = numCurrTrackedObjects;
266:FrameMgr.c **** numCurrTrackedObjects = 0;
267:FrameMgr.c ****
268:FrameMgr.c **** /* clear out the tracking table, and wait for the new frame
269:FrameMgr.c **** to start */
270:FrameMgr.c **** memset(trackedObjectTable,0x00,sizeof(trackedObjectTable));
271:FrameMgr.c **** //CamIntAsm_waitForNewTrackingFrame(currentLineBuffer,colorMap);
272:FrameMgr.c **** WAIT_FOR_VSYNC_HIGH();
273:FrameMgr.c **** CamIntAsm_acquireTrackingLine(currentLineBuffer,colorMap);
274:FrameMgr.c **** }
275:FrameMgr.c **** }
276:FrameMgr.c ****
277:FrameMgr.c **** /***********************************************************
278:FrameMgr.c **** Function Name: FrameMgr_acquireLine
279:FrameMgr.c **** Function Description: This function is responsible for
280:FrameMgr.c **** acquiring a line of data from the camera interface.
281:FrameMgr.c **** The acquisition of this line depends on the current
282:FrameMgr.c **** state of the FrameMgr.
283:FrameMgr.c **** Inputs: none
284:FrameMgr.c **** Outputs: none
285:FrameMgr.c **** ***********************************************************/
286:FrameMgr.c **** void FrameMgr_acquireLine(void)
287:FrameMgr.c **** {
288:FrameMgr.c **** unsigned char tmpLineCount;
289:FrameMgr.c ****
290:FrameMgr.c **** /* clearing out the buffers takes too long...we should
291:FrameMgr.c **** just overwrite the data here without a problem when
292:FrameMgr.c **** we start acquiring...at no point do we check for
293:FrameMgr.c **** a 0x00 value in the current or previous lineBuffers,
294:FrameMgr.c **** so it was a bit excessive :-) */
295:FrameMgr.c ****
296:FrameMgr.c **** /* check which state we are in and proceed as needed */
297:FrameMgr.c **** if (currentState == ST_FrameMgr_DumpingFrame)
298:FrameMgr.c **** {
299:FrameMgr.c **** tmpLineCount = lineCount*2;
300:FrameMgr.c ****
301:FrameMgr.c **** /* clearing out the line data in dump mode is ok, and actually
302:FrameMgr.c **** is needed, since it is possible for the first dump line in
303:FrameMgr.c **** a frame to come back with the last line captured of the
304:FrameMgr.c **** last capture session...*/
305:FrameMgr.c **** memset(currentLineBuffer,0x00,LENGTH_OF_LINE_BUFFER);
306:FrameMgr.c **** memset(previousLineBuffer,0x00,LENGTH_OF_LINE_BUFFER);
307:FrameMgr.c **** /* wait for another VSYNC so we know which frame to use
GAS LISTING /tmp/ccQRbLT3.s page 8
308:FrameMgr.c **** to start looking for a line to receive */
309:FrameMgr.c **** WAIT_FOR_VSYNC_HIGH();
310:FrameMgr.c **** WAIT_FOR_VSYNC_LOW();
311:FrameMgr.c ****
312:FrameMgr.c **** /* look at lineCount to determine how many HREFs we should
313:FrameMgr.c **** wait before we start sampling */
314:FrameMgr.c **** while(tmpLineCount != 0)
315:FrameMgr.c **** {
316:FrameMgr.c **** WAIT_FOR_HREF_HIGH();
317:FrameMgr.c **** tmpLineCount--;
318:FrameMgr.c **** WAIT_FOR_HREF_LOW();
319:FrameMgr.c **** }
320:FrameMgr.c ****
321:FrameMgr.c **** /* we should now be ready to sample our line...*/
322:FrameMgr.c **** CamIntAsm_acquireDumpLine(currentLineBuffer,previousLineBuffer);
323:FrameMgr.c **** }
324:FrameMgr.c **** else if (currentState == ST_FrameMgr_TrackingFrame)
325:FrameMgr.c **** {
326:FrameMgr.c **** WAIT_FOR_HREF_LOW();
327:FrameMgr.c **** CamIntAsm_acquireTrackingLine(currentLineBuffer,colorMap);
328:FrameMgr.c **** }
329:FrameMgr.c **** }
330:FrameMgr.c ****
331:FrameMgr.c **** /***********************************************************
332:FrameMgr.c **** Function Name: FrameMgr_processLine
333:FrameMgr.c **** Function Description: This function is responsible for
334:FrameMgr.c **** parsing the received image line and performing either
335:FrameMgr.c **** connected region mapping (if in the Tracking state) or
336:FrameMgr.c **** sending out the raw sampled data (if in the Dumping
337:FrameMgr.c **** state).
338:FrameMgr.c **** Inputs: none
339:FrameMgr.c **** Outputs: none
340:FrameMgr.c **** ***********************************************************/
341:FrameMgr.c **** void FrameMgr_processLine(void)
342:FrameMgr.c **** {
343:FrameMgr.c **** unsigned char i;
344:FrameMgr.c **** volatile unsigned char dataToSend;
345:FrameMgr.c **** unsigned char *pTrackedObjectData = (unsigned char *)pCurrentTrackedObjectTable;
346:FrameMgr.c **** #ifdef DEBUG_TRACKED_LINE
347:FrameMgr.c **** unsigned char *pSendData;
348:FrameMgr.c **** unsigned char asciiBuffer[5];
349:FrameMgr.c **** unsigned char pixelCount = 0;
350:FrameMgr.c **** #endif
351:FrameMgr.c ****
352:FrameMgr.c **** if (currentState == ST_FrameMgr_DumpingFrame)
353:FrameMgr.c **** {
354:FrameMgr.c **** /* we want to sit in a tight loop and send the acquired data
355:FrameMgr.c **** sitting in current and previous line buffers out the serial
356:FrameMgr.c **** port...it is sent out the serial port immediately instead
357:FrameMgr.c **** of going into the UIMgr tx fifo because we can't do anything
358:FrameMgr.c **** until its sent out anyway...may as well just get it out now */
359:FrameMgr.c ****
360:FrameMgr.c **** /* currentLineBuffer is getting "g" previousLineBuffer is getting "b-r" */
361:FrameMgr.c **** UartInt_txByte(0x0B); /* send the header byte */
362:FrameMgr.c **** UartInt_txByte(lineCount); /* send the line count */
363:FrameMgr.c **** for (i=0; i<NUM_PIXELS_IN_A_DUMP_LINE; i+=2)
364:FrameMgr.c **** {
GAS LISTING /tmp/ccQRbLT3.s page 9
365:FrameMgr.c **** /* when a dump line is sampled, the upper byte can potentially
366:FrameMgr.c **** have garbage in it...we don't have time to mask it off as we're
367:FrameMgr.c **** sampling, so it is done here before we send it out...we also
368:FrameMgr.c **** combine the samples together so we really are sending up a
369:FrameMgr.c **** sample for line N as well as line N+1 */
370:FrameMgr.c **** dataToSend = currentLineBuffer[i];
371:FrameMgr.c **** dataToSend &= 0x0F;
372:FrameMgr.c **** dataToSend <<= 4;
373:FrameMgr.c **** dataToSend |= (previousLineBuffer[i] & 0x0F);
374:FrameMgr.c ****
375:FrameMgr.c **** /* dataToSend should be packed now */
376:FrameMgr.c **** UartInt_txByte(dataToSend);
377:FrameMgr.c ****
378:FrameMgr.c **** /* flip the colors around since we are doing all G on Y and BR on UV */
379:FrameMgr.c **** dataToSend = previousLineBuffer[i+1];
380:FrameMgr.c **** dataToSend &= 0x0F;
381:FrameMgr.c **** dataToSend <<= 4;
382:FrameMgr.c **** dataToSend |= (currentLineBuffer[i+1] & 0x0F);
383:FrameMgr.c ****
384:FrameMgr.c **** /* dataToSend should be packed now */
385:FrameMgr.c **** UartInt_txByte(dataToSend);
386:FrameMgr.c **** }
387:FrameMgr.c **** UartInt_txByte(0x0F); /* send line end */
388:FrameMgr.c **** /* once all the data is sent, increment out line count by 2 since
389:FrameMgr.c **** we really get 2 lines worth of pixels on each pass */
390:FrameMgr.c **** /* Update...increment only by 1, but only send 72 double-lines */
391:FrameMgr.c **** lineCount++;
392:FrameMgr.c ****
393:FrameMgr.c **** /* check to see if we have retrieved all of the needed lines */
394:FrameMgr.c **** if (lineCount >= 72) /* half 144, since we send two lines at a time */
395:FrameMgr.c **** {
396:FrameMgr.c **** /* we're done, so send the dump complete?...nope, just change
397:FrameMgr.c **** states and we should be fine */
398:FrameMgr.c **** lineCount = 0;
399:FrameMgr.c **** currentState = ST_FrameMgr_idle;
400:FrameMgr.c ****
401:FrameMgr.c **** /* disable the PCLK counting overflow interrupt */
402:FrameMgr.c **** TIMSK &= DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK;
403:FrameMgr.c ****
404:FrameMgr.c **** CamConfig_setCamReg(0x11,0x00); /* reset the frame rate to normal*/
405:FrameMgr.c **** CamConfig_sendFifoCmds();
406:FrameMgr.c **** }
407:FrameMgr.c **** else
408:FrameMgr.c **** {
409:FrameMgr.c **** /* we have more lines to acquire in this frame, so keep on truckin...*/
410:FrameMgr.c **** PUBLISH_FAST_EVENT(FEV_PROCESS_LINE_COMPLETE);
411:FrameMgr.c **** }
412:FrameMgr.c **** }
413:FrameMgr.c **** else if (currentState == ST_FrameMgr_TrackingFrame)
414:FrameMgr.c **** {
415:FrameMgr.c **** #ifdef DEBUG_TRACKED_LINE
416:FrameMgr.c **** /* send the received line over serial...this should only send
417:FrameMgr.c **** until a pixelCount == 176 */
418:FrameMgr.c **** pSendData = currentLineBuffer;
419:FrameMgr.c **** itoa(trackedLineCount,asciiBuffer,10);
420:FrameMgr.c **** UIMgr_txBuffer(asciiBuffer,3);
421:FrameMgr.c **** UIMgr_txBuffer(" ",1);
GAS LISTING /tmp/ccQRbLT3.s page 10
422:FrameMgr.c **** while(pixelCount < ACTUAL_NUM_PIXELS_IN_A_LINE)
423:FrameMgr.c **** {
424:FrameMgr.c **** memset(asciiBuffer,0x00,5);
425:FrameMgr.c **** itoa(*pSendData++,asciiBuffer,10); /* color is first byte */
426:FrameMgr.c **** UIMgr_txBuffer(asciiBuffer,3); /* 3 ascii bytes for data */
427:FrameMgr.c **** UIMgr_txBuffer(" ",1);
428:FrameMgr.c ****
429:FrameMgr.c **** pixelCount += *pSendData; /* run-length is second byte */
430:FrameMgr.c **** memset(asciiBuffer,0x00,5);
431:FrameMgr.c **** itoa(*pSendData++,asciiBuffer,10);
432:FrameMgr.c **** UIMgr_txBuffer(asciiBuffer,3);
433:FrameMgr.c **** UIMgr_txBuffer(" ",1);
434:FrameMgr.c **** }
435:FrameMgr.c **** UIMgr_txBuffer("\n\r",2);
436:FrameMgr.c ****
437:FrameMgr.c **** trackedLineCount++;
438:FrameMgr.c **** if (trackedLineCount == 144)
439:FrameMgr.c **** {
440:FrameMgr.c **** UIMgr_txBuffer(" FC \n\r",8);
441:FrameMgr.c **** trackedLineCount = 0;
442:FrameMgr.c **** PUBLISH_EVENT(EV_PROCESS_FRAME_COMPLETE);
443:FrameMgr.c **** }
444:FrameMgr.c **** else
445:FrameMgr.c **** {
446:FrameMgr.c **** PUBLISH_EVENT(EV_PROCESS_LINE_COMPLETE);
447:FrameMgr.c **** }
448:FrameMgr.c **** #else
449:FrameMgr.c **** /* determine if any of the RLE blocks overlap */
450:FrameMgr.c **** FrameMgr_findConnectedness();
451:FrameMgr.c ****
452:FrameMgr.c **** /* we also want to remove any objects that are less than
453:FrameMgr.c **** a minimum height...we already removed portions of the
454:FrameMgr.c **** run-length that are less than MIN_PIXEL_WIDTH in the
455:FrameMgr.c **** findConnectedness() routine...doing it here instead of
456:FrameMgr.c **** a function to speed things up...this may end up slowing down the
457:FrameMgr.c **** frame rate slightly, and can be removed if this isn't needed */
458:FrameMgr.c ****
459:FrameMgr.c **** /* run this routine once every 8 lines */
460:FrameMgr.c **** if ( (trackedLineCount & RUN_OBJECT_FILTER_MASK) == RUN_OBJECT_FILTER_MASK)
461:FrameMgr.c **** {
462:FrameMgr.c **** for (i=0; i<MAX_TRACKED_OBJECTS; i++)
463:FrameMgr.c **** {
464:FrameMgr.c **** if ( *(pTrackedObjectData + VALID_OBJECT_OFFSET) == TRUE)
465:FrameMgr.c **** {
466:FrameMgr.c **** /* check to see if the object is already in
467:FrameMgr.c **** our past...i.e., its last */
468:FrameMgr.c **** if ( (*(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) -
469:FrameMgr.c **** *(pTrackedObjectData + Y_UPPER_LEFT_OFFSET)) < MIN_OBJECT_TRACKING_HEIGHT
470:FrameMgr.c **** {
471:FrameMgr.c **** /* the object is less than the minimum height...see if it is adjacent
472:FrameMgr.c **** to the current line we just processed...if so, leave it here...otherwise,
473:FrameMgr.c **** it needs to be invalidated since its too small */
474:FrameMgr.c **** if ( trackedLineCount - *(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) > 2)
475:FrameMgr.c **** {
476:FrameMgr.c **** /* invalidate the object */
477:FrameMgr.c **** *(pTrackedObjectData + VALID_OBJECT_OFFSET) = FALSE;
478:FrameMgr.c **** numCurrTrackedObjects--;
GAS LISTING /tmp/ccQRbLT3.s page 11
479:FrameMgr.c **** }
480:FrameMgr.c **** }
481:FrameMgr.c **** }
482:FrameMgr.c **** pTrackedObjectData += SIZE_OF_TRACKED_OBJECT;
483:FrameMgr.c **** }
484:FrameMgr.c **** }
485:FrameMgr.c ****
486:FrameMgr.c **** trackedLineCount++;
487:FrameMgr.c **** if (trackedLineCount == ACTUAL_NUM_LINES_IN_A_FRAME)
488:FrameMgr.c **** {
489:FrameMgr.c **** /* an entire frame of tracking data has been acquired, so
490:FrameMgr.c **** publish an event letting the system know this fact */
491:FrameMgr.c **** PUBLISH_EVENT(EV_ACQUIRE_FRAME_COMPLETE);
492:FrameMgr.c **** /* disable the PCLK counting overflow interrupt */
493:FrameMgr.c **** TIMSK &= DISABLE_PCLK_TIMER1_OVERFLOW_BITMASK;
494:FrameMgr.c **** trackedLineCount = 0;
495:FrameMgr.c **** }
496:FrameMgr.c **** else
497:FrameMgr.c **** {
498:FrameMgr.c **** PUBLISH_FAST_EVENT(FEV_PROCESS_LINE_COMPLETE);
499:FrameMgr.c **** }
500:FrameMgr.c **** #endif
501:FrameMgr.c **** }
502:FrameMgr.c **** else
503:FrameMgr.c **** {
504:FrameMgr.c **** /* ...and here? */
505:FrameMgr.c **** }
506:FrameMgr.c **** }
507:FrameMgr.c ****
508:FrameMgr.c **** /***********************************************************
509:FrameMgr.c **** Function Name: FrameMgr_processFrame
510:FrameMgr.c **** Function Description: This function is responsible for
511:FrameMgr.c **** parsing the completed frame and performing all actions
512:FrameMgr.c **** needed at this level.
513:FrameMgr.c **** Inputs: none
514:FrameMgr.c **** Outputs: none
515:FrameMgr.c **** ***********************************************************/
516:FrameMgr.c **** void FrameMgr_processFrame(void)
517:FrameMgr.c **** {
93 .stabn 68,0,517,.LM0-FrameMgr_processFrame
94 .LM0:
95 /* prologue: frame size=0 */
96 0000 DF92 push r13
97 0002 EF92 push r14
98 0004 FF92 push r15
99 0006 0F93 push r16
100 0008 1F93 push r17
101 000a CF93 push r28
102 000c DF93 push r29
103 /* prologue end (size=7) */
518:FrameMgr.c **** unsigned char i,k,color;
519:FrameMgr.c **** #if DEBUG_FRAME_DATA
520:FrameMgr.c **** unsigned char asciiBuffer[5];
521:FrameMgr.c **** unsigned char j;
522:FrameMgr.c **** #endif
523:FrameMgr.c **** unsigned char *pTableData = (unsigned char *)pCurrentTrackedObjectTable;
104 .stabn 68,0,523,.LM1-FrameMgr_processFrame
GAS LISTING /tmp/ccQRbLT3.s page 12
105 .LM1:
106 000e 2091 0000 lds r18,pCurrentTrackedObjectTable
107 0012 3091 0000 lds r19,(pCurrentTrackedObjectTable)+1
524:FrameMgr.c **** unsigned char tmpUpperLeftX,tmpUpperLeftY,tmpLowerRightX,tmpLowerRightY;
525:FrameMgr.c ****
526:FrameMgr.c **** #if DEBUG_FRAME_DATA
527:FrameMgr.c **** /* we want to send all of the currently tracked table out
528:FrameMgr.c **** the serial port for debugging */
529:FrameMgr.c **** for (i=0; i<numCurrTrackedObjects; i++)
530:FrameMgr.c **** {
531:FrameMgr.c **** UIMgr_txBuffer("----------\r\n",12);
532:FrameMgr.c **** for (j=0; j<SIZE_OF_TRACKED_OBJECT; j++)
533:FrameMgr.c **** {
534:FrameMgr.c **** memset(asciiBuffer,0x00,5);
535:FrameMgr.c **** itoa(*pTableData++,asciiBuffer,10);
536:FrameMgr.c **** UIMgr_txBuffer(asciiBuffer,3); /* 3 ascii bytes for data
537:FrameMgr.c **** + 1 space */
538:FrameMgr.c **** UIMgr_txBuffer("\r\n",2);
539:FrameMgr.c **** }
540:FrameMgr.c **** }
541:FrameMgr.c ****
542:FrameMgr.c **** /* finally, send a new line */
543:FrameMgr.c **** UIMgr_txBuffer("\r\n",2);
544:FrameMgr.c ****
545:FrameMgr.c **** memset(asciiBuffer,0x00,5);
546:FrameMgr.c **** itoa(numCurrTrackedObjects,asciiBuffer,10);
547:FrameMgr.c **** UIMgr_txBuffer(asciiBuffer,3);
548:FrameMgr.c **** UIMgr_txBuffer(" PFC\r\n",5);
549:FrameMgr.c ****
550:FrameMgr.c **** #else
551:FrameMgr.c **** /* we only send tracking packets if there are tracked objects */
552:FrameMgr.c ****
553:FrameMgr.c **** if (numCurrTrackedObjects > 0)
108 .stabn 68,0,553,.LM2-FrameMgr_processFrame
109 .LM2:
110 0016 8091 0000 lds r24,numCurrTrackedObjects
111 001a 8823 tst r24
112 001c 09F4 brne .+2
113 001e 3FC0 rjmp .L2
114 .stabn 68,0,523,.LM3-FrameMgr_processFrame
115 .LM3:
116 0020 E901 movw r28,r18
554:FrameMgr.c **** {
555:FrameMgr.c **** UIMgr_writeTxFifo(0x0A); /* header byte for a tracking packet */
117 .stabn 68,0,555,.LM4-FrameMgr_processFrame
118 .LM4:
119 0022 8AE0 ldi r24,lo8(10)
120 0024 00D0 rcall UIMgr_writeTxFifo
556:FrameMgr.c **** /* reset the pointer */
557:FrameMgr.c **** pTableData = (unsigned char *)pCurrentTrackedObjectTable;
558:FrameMgr.c ****
559:FrameMgr.c **** UIMgr_writeTxFifo(numCurrTrackedObjects); /* num of objects tracked */
121 .stabn 68,0,559,.LM5-FrameMgr_processFrame
122 .LM5:
123 0026 8091 0000 lds r24,numCurrTrackedObjects
124 002a 00D0 rcall UIMgr_writeTxFifo
125 002c DD24 clr r13
GAS LISTING /tmp/ccQRbLT3.s page 13
126 .L4:
560:FrameMgr.c **** for (i=0; i<MAX_TRACKED_OBJECTS; i++)
561:FrameMgr.c **** {
562:FrameMgr.c **** /* we only want to process objects that have their objectValid flag
563:FrameMgr.c **** set to TRUE */
564:FrameMgr.c **** if ( *(pTableData + VALID_OBJECT_OFFSET) == TRUE)
127 .stabn 68,0,564,.LM6-FrameMgr_processFrame
128 .LM6:
129 002e 8F81 ldd r24,Y+7
130 0030 8130 cpi r24,lo8(1)
131 0032 69F5 brne .L5
565:FrameMgr.c **** {
566:FrameMgr.c **** /* the object is valid...convert the color from bit position to value...remember,
567:FrameMgr.c **** each bit in the "color" byte corresponds to a color */
568:FrameMgr.c **** k=0;
569:FrameMgr.c **** color = *(pTableData + COLOR_OFFSET);
132 .stabn 68,0,569,.LM7-FrameMgr_processFrame
133 .LM7:
134 0034 8881 ld r24,Y
570:FrameMgr.c **** if (color == 128) k=0;
135 .stabn 68,0,570,.LM8-FrameMgr_processFrame
136 .LM8:
137 0036 8038 cpi r24,lo8(-128)
138 0038 E1F0 breq .L7
571:FrameMgr.c **** else if (color == 64) k=1;
139 .stabn 68,0,571,.LM9-FrameMgr_processFrame
140 .LM9:
141 003a 8034 cpi r24,lo8(64)
142 003c 11F4 brne .L9
143 003e 81E0 ldi r24,lo8(1)
144 0040 19C0 rjmp .L11
145 .L9:
572:FrameMgr.c **** else if (color == 32) k=2;
146 .stabn 68,0,572,.LM10-FrameMgr_processFrame
147 .LM10:
148 0042 8032 cpi r24,lo8(32)
149 0044 11F4 brne .L12
150 0046 82E0 ldi r24,lo8(2)
151 0048 15C0 rjmp .L11
152 .L12:
573:FrameMgr.c **** else if (color == 16) k=3;
153 .stabn 68,0,573,.LM11-FrameMgr_processFrame
154 .LM11:
155 004a 8031 cpi r24,lo8(16)
156 004c 11F4 brne .L14
157 004e 83E0 ldi r24,lo8(3)
158 0050 11C0 rjmp .L11
159 .L14:
574:FrameMgr.c **** else if (color == 8) k=4;
160 .stabn 68,0,574,.LM12-FrameMgr_processFrame
161 .LM12:
162 0052 8830 cpi r24,lo8(8)
163 0054 11F4 brne .L16
164 0056 84E0 ldi r24,lo8(4)
165 0058 0DC0 rjmp .L11
166 .L16:
575:FrameMgr.c **** else if (color == 4) k=5;
GAS LISTING /tmp/ccQRbLT3.s page 14
167 .stabn 68,0,575,.LM13-FrameMgr_processFrame
168 .LM13:
169 005a 8430 cpi r24,lo8(4)
170 005c 11F4 brne .L18
171 005e 85E0 ldi r24,lo8(5)
172 0060 09C0 rjmp .L11
173 .L18:
576:FrameMgr.c **** else if (color == 2) k=6;
174 .stabn 68,0,576,.LM14-FrameMgr_processFrame
175 .LM14:
176 0062 8230 cpi r24,lo8(2)
177 0064 11F4 brne .L20
178 0066 86E0 ldi r24,lo8(6)
179 0068 05C0 rjmp .L11
180 .L20:
577:FrameMgr.c **** else if (color == 1) k=7;
181 .stabn 68,0,577,.LM15-FrameMgr_processFrame
182 .LM15:
183 006a 8130 cpi r24,lo8(1)
184 006c 11F4 brne .L7
185 006e 87E0 ldi r24,lo8(7)
186 0070 01C0 rjmp .L11
187 .L7:
188 0072 80E0 ldi r24,lo8(0)
189 .L11:
578:FrameMgr.c ****
579:FrameMgr.c **** tmpUpperLeftX = *(pTableData + X_UPPER_LEFT_OFFSET); /* get the upper left X */
190 .stabn 68,0,579,.LM16-FrameMgr_processFrame
191 .LM16:
192 0074 1B81 ldd r17,Y+3
580:FrameMgr.c **** tmpUpperLeftY = *(pTableData + Y_UPPER_LEFT_OFFSET); /* get the upper left Y */
193 .stabn 68,0,580,.LM17-FrameMgr_processFrame
194 .LM17:
195 0076 0C81 ldd r16,Y+4
581:FrameMgr.c **** tmpLowerRightX = *(pTableData + X_LOWER_RIGHT_OFFSET); /* get the lower right X */
196 .stabn 68,0,581,.LM18-FrameMgr_processFrame
197 .LM18:
198 0078 FD80 ldd r15,Y+5
582:FrameMgr.c **** tmpLowerRightY = *(pTableData + Y_LOWER_RIGHT_OFFSET); /* get the lower right Y */
199 .stabn 68,0,582,.LM19-FrameMgr_processFrame
200 .LM19:
201 007a EE80 ldd r14,Y+6
583:FrameMgr.c ****
584:FrameMgr.c **** UIMgr_writeTxFifo(k); /* send the color first */
202 .stabn 68,0,584,.LM20-FrameMgr_processFrame
203 .LM20:
204 007c 00D0 rcall UIMgr_writeTxFifo
585:FrameMgr.c **** UIMgr_writeTxFifo(tmpUpperLeftX);
205 .stabn 68,0,585,.LM21-FrameMgr_processFrame
206 .LM21:
207 007e 812F mov r24,r17
208 0080 00D0 rcall UIMgr_writeTxFifo
586:FrameMgr.c **** UIMgr_writeTxFifo(tmpUpperLeftY);
209 .stabn 68,0,586,.LM22-FrameMgr_processFrame
210 .LM22:
211 0082 802F mov r24,r16
212 0084 00D0 rcall UIMgr_writeTxFifo
GAS LISTING /tmp/ccQRbLT3.s page 15
587:FrameMgr.c **** UIMgr_writeTxFifo(tmpLowerRightX);
213 .stabn 68,0,587,.LM23-FrameMgr_processFrame
214 .LM23:
215 0086 8F2D mov r24,r15
216 0088 00D0 rcall UIMgr_writeTxFifo
588:FrameMgr.c **** UIMgr_writeTxFifo(tmpLowerRightY);
217 .stabn 68,0,588,.LM24-FrameMgr_processFrame
218 .LM24:
219 008a 8E2D mov r24,r14
220 008c 00D0 rcall UIMgr_writeTxFifo
221 .L5:
222 .stabn 68,0,560,.LM25-FrameMgr_processFrame
223 .LM25:
224 008e D394 inc r13
225 0090 88E0 ldi r24,lo8(8)
226 0092 D816 cp r13,r24
227 0094 11F0 breq .L23
589:FrameMgr.c **** }
590:FrameMgr.c ****
591:FrameMgr.c **** /* move our pointer up to the beginning of the next object */
592:FrameMgr.c **** pTableData += SIZE_OF_TRACKED_OBJECT;
228 .stabn 68,0,592,.LM26-FrameMgr_processFrame
229 .LM26:
230 0096 2896 adiw r28,8
231 0098 CACF rjmp .L4
232 .L23:
593:FrameMgr.c **** }
594:FrameMgr.c ****
595:FrameMgr.c **** /* all done...send the end of tracking packets char */
596:FrameMgr.c **** UIMgr_writeTxFifo(0xFF);
233 .stabn 68,0,596,.LM27-FrameMgr_processFrame
234 .LM27:
235 009a 8FEF ldi r24,lo8(-1)
236 009c 00D0 rcall UIMgr_writeTxFifo
237 .L2:
597:FrameMgr.c **** }
598:FrameMgr.c **** #endif
599:FrameMgr.c ****
600:FrameMgr.c **** /* the tracked object table will be cleared out right before we start
601:FrameMgr.c **** to wait for VSYNC to indicate a new frame...so it doesn't need to be
602:FrameMgr.c **** done now */
603:FrameMgr.c ****
604:FrameMgr.c **** /* schedule the next action to acquire a new frame */
605:FrameMgr.c **** PUBLISH_EVENT(EV_PROCESS_FRAME_COMPLETE);
238 .stabn 68,0,605,.LM28-FrameMgr_processFrame
239 .LM28:
240 009e 84E0 ldi r24,lo8(4)
241 00a0 00D0 rcall Exec_writeEventFifo
242 /* epilogue: frame size=0 */
243 00a2 DF91 pop r29
244 00a4 CF91 pop r28
245 00a6 1F91 pop r17
246 00a8 0F91 pop r16
247 00aa FF90 pop r15
248 00ac EF90 pop r14
249 00ae DF90 pop r13
250 00b0 0895 ret
GAS LISTING /tmp/ccQRbLT3.s page 16
251 /* epilogue end (size=8) */
252 /* function FrameMgr_processFrame size 88 (73) */
253 .size FrameMgr_processFrame, .-FrameMgr_processFrame
254 .stabs "i:r(0,11)",64,0,518,13
255 .stabs "k:r(0,11)",64,0,518,24
256 .stabs "color:r(0,11)",64,0,518,24
257 .stabs "pTableData:r(0,22)=*(0,11)",64,0,523,28
258 .stabs "tmpUpperLeftX:r(0,11)",64,0,524,17
259 .stabs "tmpUpperLeftY:r(0,11)",64,0,524,16
260 .stabs "tmpLowerRightX:r(0,11)",64,0,524,15
261 .stabs "tmpLowerRightY:r(0,11)",64,0,524,14
262 .stabn 192,0,0,FrameMgr_processFrame-FrameMgr_processFrame
263 .stabn 224,0,0,.Lscope0-FrameMgr_processFrame
264 .Lscope0:
265 .stabs "",36,0,0,.Lscope0-FrameMgr_processFrame
266 .stabd 78,0,0
267 .stabs "FrameMgr_processLine:F(0,15)",36,0,342,FrameMgr_processLine
268 .global FrameMgr_processLine
269 .type FrameMgr_processLine, @function
270 FrameMgr_processLine:
271 .stabd 46,0,0
272 .stabn 68,0,342,.LM29-FrameMgr_processLine
273 .LM29:
274 /* prologue: frame size=1 */
275 00b2 2F92 push r2
276 00b4 3F92 push r3
277 00b6 4F92 push r4
278 00b8 5F92 push r5
279 00ba 6F92 push r6
280 00bc 7F92 push r7
281 00be 8F92 push r8
282 00c0 9F92 push r9
283 00c2 AF92 push r10
284 00c4 BF92 push r11
285 00c6 CF92 push r12
286 00c8 DF92 push r13
287 00ca EF92 push r14
288 00cc FF92 push r15
289 00ce 0F93 push r16
290 00d0 1F93 push r17
291 00d2 CF93 push r28
292 00d4 DF93 push r29
293 00d6 CDB7 in r28,__SP_L__
294 00d8 DEB7 in r29,__SP_H__
295 00da 2197 sbiw r28,1
296 00dc 0FB6 in __tmp_reg__,__SREG__
297 00de F894 cli
298 00e0 DEBF out __SP_H__,r29
299 00e2 0FBE out __SREG__,__tmp_reg__
300 00e4 CDBF out __SP_L__,r28
301 /* prologue end (size=26) */
302 .stabn 68,0,345,.LM30-FrameMgr_processLine
303 .LM30:
304 00e6 0091 0000 lds r16,pCurrentTrackedObjectTable
305 00ea 1091 0000 lds r17,(pCurrentTrackedObjectTable)+1
306 .stabn 68,0,352,.LM31-FrameMgr_processLine
307 .LM31:
GAS LISTING /tmp/ccQRbLT3.s page 17
308 00ee 8091 0000 lds r24,currentState
309 00f2 8230 cpi r24,lo8(2)
310 00f4 09F0 breq .+2
311 00f6 6AC0 rjmp .L27
312 .stabn 68,0,361,.LM32-FrameMgr_processLine
313 .LM32:
314 00f8 8BE0 ldi r24,lo8(11)
315 00fa 00D0 rcall UartInt_txByte
316 .stabn 68,0,362,.LM33-FrameMgr_processLine
317 .LM33:
318 00fc 8091 0000 lds r24,lineCount
319 0100 00D0 rcall UartInt_txByte
320 0102 0F2E mov __tmp_reg__,r31
321 0104 F0E0 ldi r31,lo8(currentLineBuffer)
322 0106 CF2E mov r12,r31
323 0108 F0E0 ldi r31,hi8(currentLineBuffer)
324 010a DF2E mov r13,r31
325 010c F02D mov r31,__tmp_reg__
326 010e 00E0 ldi r16,lo8(0)
327 0110 10E0 ldi r17,hi8(0)
328 0112 0F2E mov __tmp_reg__,r31
329 0114 F0E0 ldi r31,lo8(previousLineBuffer)
330 0116 EF2E mov r14,r31
331 0118 F0E0 ldi r31,hi8(previousLineBuffer)
332 011a FF2E mov r15,r31
333 011c F02D mov r31,__tmp_reg__
334 .L29:
335 .stabn 68,0,370,.LM34-FrameMgr_processLine
336 .LM34:
337 011e F601 movw r30,r12
338 0120 8081 ld r24,Z
339 0122 8983 std Y+1,r24
340 .stabn 68,0,371,.LM35-FrameMgr_processLine
341 .LM35:
342 0124 8981 ldd r24,Y+1
343 0126 8F70 andi r24,lo8(15)
344 0128 8983 std Y+1,r24
345 .stabn 68,0,372,.LM36-FrameMgr_processLine
346 .LM36:
347 012a 8981 ldd r24,Y+1
348 012c 8295 swap r24
349 012e 807F andi r24,0xf0
350 0130 8983 std Y+1,r24
351 .stabn 68,0,373,.LM37-FrameMgr_processLine
352 .LM37:
353 0132 9981 ldd r25,Y+1
354 0134 F701 movw r30,r14
355 0136 8081 ld r24,Z
356 0138 8F70 andi r24,lo8(15)
357 013a 892B or r24,r25
358 013c 8983 std Y+1,r24
359 .stabn 68,0,376,.LM38-FrameMgr_processLine
360 .LM38:
361 013e 8981 ldd r24,Y+1
362 0140 00D0 rcall UartInt_txByte
363 .stabn 68,0,379,.LM39-FrameMgr_processLine
364 .LM39:
GAS LISTING /tmp/ccQRbLT3.s page 18
365 0142 D801 movw r26,r16
366 0144 1196 adiw r26,1
367 0146 FD01 movw r30,r26
368 0148 E050 subi r30,lo8(-(previousLineBuffer))
369 014a F040 sbci r31,hi8(-(previousLineBuffer))
370 014c 8081 ld r24,Z
371 014e 8983 std Y+1,r24
372 .stabn 68,0,380,.LM40-FrameMgr_processLine
373 .LM40:
374 0150 8981 ldd r24,Y+1
375 0152 8F70 andi r24,lo8(15)
376 0154 8983 std Y+1,r24
377 .stabn 68,0,381,.LM41-FrameMgr_processLine
378 .LM41:
379 0156 8981 ldd r24,Y+1
380 0158 8295 swap r24
381 015a 807F andi r24,0xf0
382 015c 8983 std Y+1,r24
383 .stabn 68,0,382,.LM42-FrameMgr_processLine
384 .LM42:
385 015e 9981 ldd r25,Y+1
386 0160 A050 subi r26,lo8(-(currentLineBuffer))
387 0162 B040 sbci r27,hi8(-(currentLineBuffer))
388 0164 8C91 ld r24,X
389 0166 8F70 andi r24,lo8(15)
390 0168 892B or r24,r25
391 016a 8983 std Y+1,r24
392 .stabn 68,0,385,.LM43-FrameMgr_processLine
393 .LM43:
394 016c 8981 ldd r24,Y+1
395 016e 00D0 rcall UartInt_txByte
396 0170 82E0 ldi r24,lo8(2)
397 0172 90E0 ldi r25,hi8(2)
398 0174 C80E add r12,r24
399 0176 D91E adc r13,r25
400 0178 0E5F subi r16,lo8(-(2))
401 017a 1F4F sbci r17,hi8(-(2))
402 017c E80E add r14,r24
403 017e F91E adc r15,r25
404 .stabn 68,0,363,.LM44-FrameMgr_processLine
405 .LM44:
406 0180 003B cpi r16,176
407 0182 1105 cpc r17,__zero_reg__
408 0184 61F6 brne .L29
409 .stabn 68,0,387,.LM45-FrameMgr_processLine
410 .LM45:
411 0186 8FE0 ldi r24,lo8(15)
412 0188 00D0 rcall UartInt_txByte
413 .stabn 68,0,391,.LM46-FrameMgr_processLine
414 .LM46:
415 018a 8091 0000 lds r24,lineCount
416 018e 8F5F subi r24,lo8(-(1))
417 0190 8093 0000 sts lineCount,r24
418 .stabn 68,0,394,.LM47-FrameMgr_processLine
419 .LM47:
420 0194 8834 cpi r24,lo8(72)
421 0196 60F0 brlo .L31
GAS LISTING /tmp/ccQRbLT3.s page 19
422 .stabn 68,0,398,.LM48-FrameMgr_processLine
423 .LM48:
424 0198 1092 0000 sts lineCount,__zero_reg__
425 .stabn 68,0,399,.LM49-FrameMgr_processLine
426 .LM49:
427 019c 1092 0000 sts currentState,__zero_reg__
428 .stabn 68,0,402,.LM50-FrameMgr_processLine
429 .LM50:
430 01a0 89B7 in r24,89-0x20
431 01a2 8B7F andi r24,lo8(-5)
432 01a4 89BF out 89-0x20,r24
433 .stabn 68,0,404,.LM51-FrameMgr_processLine
434 .LM51:
435 01a6 60E0 ldi r22,lo8(0)
436 01a8 81E1 ldi r24,lo8(17)
437 01aa 00D0 rcall CamConfig_setCamReg
438 .stabn 68,0,405,.LM52-FrameMgr_processLine
439 .LM52:
440 01ac 00D0 rcall CamConfig_sendFifoCmds
441 01ae C8C0 rjmp .L71
442 .L31:
443 .stabn 68,0,410,.LM53-FrameMgr_processLine
444 .LM53:
445 01b0 8091 0000 lds r24,fastEventBitmask
446 01b4 8260 ori r24,lo8(2)
447 01b6 8093 0000 sts fastEventBitmask,r24
448 01ba C2C0 rjmp .L71
449 .L72:
450 .stabn 68,0,491,.LM54-FrameMgr_processLine
451 .LM54:
452 01bc 80E2 ldi r24,lo8(32)
453 01be 00D0 rcall Exec_writeEventFifo
454 .stabn 68,0,493,.LM55-FrameMgr_processLine
455 .LM55:
456 01c0 89B7 in r24,89-0x20
457 01c2 8B7F andi r24,lo8(-5)
458 01c4 89BF out 89-0x20,r24
459 .stabn 68,0,494,.LM56-FrameMgr_processLine
460 .LM56:
461 01c6 1092 0000 sts trackedLineCount,__zero_reg__
462 01ca BAC0 rjmp .L71
463 .L27:
464 .stabn 68,0,413,.LM57-FrameMgr_processLine
465 .LM57:
466 01cc 8130 cpi r24,lo8(1)
467 01ce 09F0 breq .+2
468 01d0 B7C0 rjmp .L71
469 .LBB4:
470 .LBB5:
606:FrameMgr.c **** }
607:FrameMgr.c ****
608:FrameMgr.c **** /***********************************************************
609:FrameMgr.c **** Function Name: FrameMgr_findConnectedness
610:FrameMgr.c **** Function Description: This function is responsible for
611:FrameMgr.c **** finding the connectedness between two particular run-
612:FrameMgr.c **** length encoded lines of pixel data. It updates the
613:FrameMgr.c **** trackingTable as needed.
GAS LISTING /tmp/ccQRbLT3.s page 20
614:FrameMgr.c **** Inputs: none
615:FrameMgr.c **** Outputs: none
616:FrameMgr.c **** ***********************************************************/
617:FrameMgr.c **** static void FrameMgr_findConnectedness(void)
618:FrameMgr.c **** {
619:FrameMgr.c **** trackedColor_t currColor;
620:FrameMgr.c **** unsigned char *pCurrLineColorInfo = currentLineBuffer;
621:FrameMgr.c **** unsigned char *pTrackedObjectData;
622:FrameMgr.c **** register unsigned char currPixelRunStart=0;
623:FrameMgr.c **** register unsigned char currPixelRunFinish=0;
624:FrameMgr.c **** register unsigned char lastLineXStart=0;
625:FrameMgr.c **** register unsigned char lastLineXFinish=0;
626:FrameMgr.c **** register unsigned char runLength=1;
627:FrameMgr.c **** unsigned char i;
628:FrameMgr.c **** bool_t colorConnected;
629:FrameMgr.c ****
630:FrameMgr.c **** do
631:FrameMgr.c **** {
632:FrameMgr.c **** /* grab both the current color and the number of pixels
633:FrameMgr.c **** in the run...remember, pixels start at 1, not 0! */
634:FrameMgr.c **** colorConnected = FALSE;
635:FrameMgr.c **** currColor = *pCurrLineColorInfo++;
636:FrameMgr.c **** currPixelRunStart += runLength;
637:FrameMgr.c **** runLength = *pCurrLineColorInfo++;
638:FrameMgr.c **** currPixelRunFinish += runLength;
639:FrameMgr.c ****
640:FrameMgr.c **** /* make sure that the run-length is at least as wide as
641:FrameMgr.c **** the minimum horizontal tracking width, and we care about the color */
642:FrameMgr.c ****
643:FrameMgr.c **** if ( (currColor != notTracked) && (runLength > MIN_OBJECT_TRACKING_WIDTH) )
644:FrameMgr.c **** {
645:FrameMgr.c **** /* this run contains a color we care about, so
646:FrameMgr.c **** either it will begin a new tracked object, or it
647:FrameMgr.c **** is connected to a currently tracked object...
648:FrameMgr.c **** compare it with each object in the tracking
649:FrameMgr.c **** table...we can't just look at the numTrackedObjects because
650:FrameMgr.c **** it is entirely possible that the first couple of objects could
651:FrameMgr.c **** be invalid...
652:FrameMgr.c ****
653:FrameMgr.c **** NOTE: Instead of accessing each element in the trackedObjectTable
654:FrameMgr.c **** through the 'i' index, and then accessing the fields in each structure,
655:FrameMgr.c **** a pointer to each entry is established each time through the loop, followed
656:FrameMgr.c **** by accessing the elements through specified offsets. GCC seems to be
657:FrameMgr.c **** able to optimize this code much better than simply accessing the elements
658:FrameMgr.c **** of each structure in the array the more normal way...*/
659:FrameMgr.c ****
660:FrameMgr.c **** pTrackedObjectData = (unsigned char *)pCurrentTrackedObjectTable;
661:FrameMgr.c **** for (i=0; i<MAX_TRACKED_OBJECTS; i++)
662:FrameMgr.c **** {
663:FrameMgr.c **** if ( (currColor == *(pTrackedObjectData + COLOR_OFFSET)) &&
664:FrameMgr.c **** (*(pTrackedObjectData + VALID_OBJECT_OFFSET) == TRUE) &&
665:FrameMgr.c **** (*(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) == trackedLineCount - 1) )
666:FrameMgr.c **** {
667:FrameMgr.c **** /* found a color match and the object is valid...check to see if there is
668:FrameMgr.c **** connectedness */
669:FrameMgr.c **** lastLineXStart = *(pTrackedObjectData + LAST_LINE_X_START_OFFSET);
670:FrameMgr.c **** lastLineXFinish = *(pTrackedObjectData + LAST_LINE_X_FINISH_OFFSET);
GAS LISTING /tmp/ccQRbLT3.s page 21
671:FrameMgr.c ****
672:FrameMgr.c **** /* Check for the 5 following types of line connectedness:
673:FrameMgr.c **** ---------------------
674:FrameMgr.c **** | |
675:FrameMgr.c **** ---------------------
676:FrameMgr.c **** -------------------------
677:FrameMgr.c **** | |
678:FrameMgr.c **** ------------------------- */
679:FrameMgr.c **** if ( ( (currPixelRunStart >= lastLineXStart) &&
680:FrameMgr.c **** (currPixelRunStart <= lastLineXFinish) ) ||
681:FrameMgr.c ****
682:FrameMgr.c **** /* ---------------------
683:FrameMgr.c **** | |
684:FrameMgr.c **** ---------------------
685:FrameMgr.c **** -------------------
686:FrameMgr.c **** | |
687:FrameMgr.c **** -------------------
688:FrameMgr.c **** OR
689:FrameMgr.c **** ------------------------------
690:FrameMgr.c **** | |
691:FrameMgr.c **** ------------------------------
692:FrameMgr.c **** ---------
693:FrameMgr.c **** | |
694:FrameMgr.c **** --------- */
695:FrameMgr.c **** ( (currPixelRunFinish >= lastLineXStart) &&
696:FrameMgr.c **** (currPixelRunFinish <= lastLineXFinish) ) ||
697:FrameMgr.c ****
698:FrameMgr.c ****
699:FrameMgr.c **** /* -------------------------------
700:FrameMgr.c **** | |
701:FrameMgr.c **** -------------------------------
702:FrameMgr.c **** -------------------------------
703:FrameMgr.c **** | |
704:FrameMgr.c **** -------------------------------
705:FrameMgr.c **** OR
706:FrameMgr.c **** -------------
707:FrameMgr.c **** | |
708:FrameMgr.c **** -------------
709:FrameMgr.c **** -------------------------------
710:FrameMgr.c **** | |
711:FrameMgr.c **** ------------------------------- */
712:FrameMgr.c **** ( (currPixelRunStart <= lastLineXStart) &&
713:FrameMgr.c **** (currPixelRunFinish >= lastLineXFinish) ) )
714:FrameMgr.c **** {
715:FrameMgr.c **** /* THERE IS CONNECTEDNESS...update the lastLineXStart and lastLineXFinish
716:FrameMgr.c **** data pointed to by pTrackedObjectData */
717:FrameMgr.c **** *(pTrackedObjectData + LAST_LINE_X_START_OFFSET) = currPixelRunStart;
718:FrameMgr.c **** *(pTrackedObjectData + LAST_LINE_X_FINISH_OFFSET) = currPixelRunFinish;
719:FrameMgr.c ****
720:FrameMgr.c **** /* check if the bounding box needs to be updated */
721:FrameMgr.c **** if (*(pTrackedObjectData + X_UPPER_LEFT_OFFSET) > currPixelRunStart)
722:FrameMgr.c **** {
723:FrameMgr.c **** /* need to update the bounding box for the upper left point to
724:FrameMgr.c **** enclose this new left-most point...we never have to update the
725:FrameMgr.c **** upper left Y point, since each scan line we process moves from
726:FrameMgr.c **** top to bottom */
727:FrameMgr.c **** *(pTrackedObjectData + X_UPPER_LEFT_OFFSET) = currPixelRunStart;
GAS LISTING /tmp/ccQRbLT3.s page 22
728:FrameMgr.c **** }
729:FrameMgr.c ****
730:FrameMgr.c **** if ( *(pTrackedObjectData + X_LOWER_RIGHT_OFFSET) < currPixelRunFinish)
731:FrameMgr.c **** {
732:FrameMgr.c **** /* need to update the bounding box for the lower right X point to
733:FrameMgr.c **** enclose this new right-most point */
734:FrameMgr.c **** *(pTrackedObjectData + X_LOWER_RIGHT_OFFSET) = currPixelRunFinish;
735:FrameMgr.c **** }
736:FrameMgr.c ****
737:FrameMgr.c **** /* the lower right 'y' point always gets updated when connectedness is found */
738:FrameMgr.c **** *(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) = trackedLineCount;
739:FrameMgr.c ****
740:FrameMgr.c **** /* set a flag indicating that that color run is part of another
741:FrameMgr.c **** object and thus doesn't need to be added as a new entry into the
742:FrameMgr.c **** tracking table */
743:FrameMgr.c **** colorConnected = TRUE;
744:FrameMgr.c **** break;
745:FrameMgr.c **** }
746:FrameMgr.c **** }
747:FrameMgr.c ****
748:FrameMgr.c **** /* go to the next object */
749:FrameMgr.c **** pTrackedObjectData += SIZE_OF_TRACKED_OBJECT;
750:FrameMgr.c **** }
751:FrameMgr.c ****
752:FrameMgr.c **** if (colorConnected == FALSE)
753:FrameMgr.c **** {
754:FrameMgr.c **** /* a new entry needs to be made to the tracking table, since we have
755:FrameMgr.c **** a run-length with a color, and it isn't connected to anything...but we
756:FrameMgr.c **** can only do this if there is space left in the trackedObject table */
757:FrameMgr.c **** if (numCurrTrackedObjects < MAX_TRACKED_OBJECTS)
758:FrameMgr.c **** {
759:FrameMgr.c **** /* space is available...add the object...but first we need to find an
760:FrameMgr.c **** invalid object in the object tracking table */
761:FrameMgr.c **** pTrackedObjectData = (unsigned char *)pCurrentTrackedObjectTable;
762:FrameMgr.c **** for (i=0; i<MAX_TRACKED_OBJECTS; i++)
763:FrameMgr.c **** {
764:FrameMgr.c **** if ( *(pTrackedObjectData + VALID_OBJECT_OFFSET) == FALSE) break;
765:FrameMgr.c ****
766:FrameMgr.c **** /* if we haven't broken above, then the object must have been valid...
767:FrameMgr.c **** go ahead and move the pointer to the next object to check it */
768:FrameMgr.c **** pTrackedObjectData += SIZE_OF_TRACKED_OBJECT;
769:FrameMgr.c **** }
770:FrameMgr.c ****
771:FrameMgr.c ****
772:FrameMgr.c **** /* now that we have a pointer to the tracked object to be updated, update all
773:FrameMgr.c **** the fields */
774:FrameMgr.c **** *(pTrackedObjectData + COLOR_OFFSET) = currColor; /* color */
775:FrameMgr.c **** *(pTrackedObjectData + LAST_LINE_X_START_OFFSET) = currPixelRunStart; /* lastLineXStart */
776:FrameMgr.c **** *(pTrackedObjectData + LAST_LINE_X_FINISH_OFFSET) = currPixelRunFinish; /* lastLineXFinish *
777:FrameMgr.c **** *(pTrackedObjectData + X_UPPER_LEFT_OFFSET) = currPixelRunStart; /* x_upperLeft */
778:FrameMgr.c **** *(pTrackedObjectData + Y_UPPER_LEFT_OFFSET) = trackedLineCount; /* y_upperLeft */
471 .stabn 68,0,778,.LM58-FrameMgr_processLine
472 .LM58:
473 01d2 F090 0000 lds r15,trackedLineCount
474 .stabn 68,0,663,.LM59-FrameMgr_processLine
475 .LM59:
476 01d6 CF2C mov r12,r15
GAS LISTING /tmp/ccQRbLT3.s page 23
477 01d8 DD24 clr r13
478 01da 3601 movw r6,r12
479 01dc 0894 sec
480 01de 6108 sbc r6,__zero_reg__
481 01e0 7108 sbc r7,__zero_reg__
482 01e2 7091 0000 lds r23,numCurrTrackedObjects
483 01e6 0F2E mov __tmp_reg__,r31
484 01e8 F0E0 ldi r31,lo8(currentLineBuffer)
485 01ea 2F2E mov r2,r31
486 01ec F0E0 ldi r31,hi8(currentLineBuffer)
487 01ee 3F2E mov r3,r31
488 01f0 F02D mov r31,__tmp_reg__
489 01f2 50E0 ldi r21,lo8(0)
490 01f4 40E0 ldi r20,lo8(0)
491 01f6 61E0 ldi r22,lo8(1)
492 01f8 EF2C mov r14,r15
493 01fa E394 inc r14
494 .L35:
495 .stabn 68,0,635,.LM60-FrameMgr_processLine
496 .LM60:
497 01fc F101 movw r30,r2
498 01fe 3081 ld r19,Z
499 .stabn 68,0,636,.LM61-FrameMgr_processLine
500 .LM61:
501 0200 560F add r21,r22
502 .stabn 68,0,637,.LM62-FrameMgr_processLine
503 .LM62:
504 0202 6181 ldd r22,Z+1
505 0204 82E0 ldi r24,lo8(2)
506 0206 90E0 ldi r25,hi8(2)
507 0208 280E add r2,r24
508 020a 391E adc r3,r25
509 .stabn 68,0,638,.LM63-FrameMgr_processLine
510 .LM63:
511 020c 460F add r20,r22
512 .stabn 68,0,643,.LM64-FrameMgr_processLine
513 .LM64:
514 020e 3323 tst r19
515 0210 09F4 brne .+2
516 0212 5CC0 rjmp .L36
517 0214 6430 cpi r22,lo8(4)
518 0216 08F4 brsh .+2
519 0218 59C0 rjmp .L36
520 021a D801 movw r26,r16
521 021c 20E0 ldi r18,lo8(0)
522 .L39:
523 .stabn 68,0,663,.LM65-FrameMgr_processLine
524 .LM65:
525 021e 8C91 ld r24,X
526 0220 3817 cp r19,r24
527 0222 C9F5 brne .L40
528 0224 FD01 movw r30,r26
529 0226 8781 ldd r24,Z+7
530 0228 8130 cpi r24,lo8(1)
531 022a A9F5 brne .L40
532 022c 0F2E mov __tmp_reg__,r31
533 022e F6E0 ldi r31,lo8(6)
GAS LISTING /tmp/ccQRbLT3.s page 24
534 0230 AF2E mov r10,r31
535 0232 BB24 clr r11
536 0234 F02D mov r31,__tmp_reg__
537 0236 AA0E add r10,r26
538 0238 BB1E adc r11,r27
539 023a 8681 ldd r24,Z+6
540 023c 9927 clr r25
541 023e 8615 cp r24,r6
542 0240 9705 cpc r25,r7
543 0242 49F5 brne .L40
544 0244 2D01 movw r4,r26
545 0246 0894 sec
546 0248 411C adc r4,__zero_reg__
547 024a 511C adc r5,__zero_reg__
548 .stabn 68,0,669,.LM66-FrameMgr_processLine
549 .LM66:
550 024c 8181 ldd r24,Z+1
551 024e 8824 clr r8
552 0250 9924 clr r9
553 0252 6894 set
554 0254 81F8 bld r8,1
555 0256 8A0E add r8,r26
556 0258 9B1E adc r9,r27
557 .stabn 68,0,670,.LM67-FrameMgr_processLine
558 .LM67:
559 025a 9281 ldd r25,Z+2
560 .stabn 68,0,679,.LM68-FrameMgr_processLine
561 .LM68:
562 025c 5817 cp r21,r24
563 025e 10F0 brlo .L44
564 0260 9517 cp r25,r21
565 0262 40F4 brsh .L46
566 .L44:
567 0264 4817 cp r20,r24
568 0266 10F0 brlo .L47
569 0268 9417 cp r25,r20
570 026a 20F4 brsh .L46
571 .L47:
572 026c 8517 cp r24,r21
573 026e 98F0 brlo .L40
574 0270 4917 cp r20,r25
575 0272 88F0 brlo .L40
576 .L46:
577 .stabn 68,0,717,.LM69-FrameMgr_processLine
578 .LM69:
579 0274 F201 movw r30,r4
580 0276 5083 st Z,r21
581 .stabn 68,0,718,.LM70-FrameMgr_processLine
582 .LM70:
583 0278 F401 movw r30,r8
584 027a 4083 st Z,r20
585 .stabn 68,0,721,.LM71-FrameMgr_processLine
586 .LM71:
587 027c FD01 movw r30,r26
588 027e 8381 ldd r24,Z+3
589 0280 5817 cp r21,r24
590 0282 08F4 brsh .L50
GAS LISTING /tmp/ccQRbLT3.s page 25
591 .stabn 68,0,727,.LM72-FrameMgr_processLine
592 .LM72:
593 0284 5383 std Z+3,r21
594 .L50:
595 .stabn 68,0,730,.LM73-FrameMgr_processLine
596 .LM73:
597 0286 FD01 movw r30,r26
598 0288 8581 ldd r24,Z+5
599 028a 8417 cp r24,r20
600 028c 08F4 brsh .L52
601 .stabn 68,0,734,.LM74-FrameMgr_processLine
602 .LM74:
603 028e 4583 std Z+5,r20
604 .L52:
605 .stabn 68,0,738,.LM75-FrameMgr_processLine
606 .LM75:
607 0290 F501 movw r30,r10
608 0292 F082 st Z,r15
609 0294 1BC0 rjmp .L36
610 .L40:
611 .stabn 68,0,661,.LM76-FrameMgr_processLine
612 .LM76:
613 0296 2F5F subi r18,lo8(-(1))
614 0298 2830 cpi r18,lo8(8)
615 029a 09F4 brne .+2
616 029c 4DC0 rjmp .L54
617 .stabn 68,0,749,.LM77-FrameMgr_processLine
618 .LM77:
619 029e 1896 adiw r26,8
620 02a0 BECF rjmp .L39
621 .L56:
622 02a2 D801 movw r26,r16
623 02a4 90E0 ldi r25,lo8(0)
624 .L57:
625 .stabn 68,0,764,.LM78-FrameMgr_processLine
626 .LM78:
627 02a6 FD01 movw r30,r26
628 02a8 8781 ldd r24,Z+7
629 02aa 8823 tst r24
630 02ac 21F0 breq .L58
631 .stabn 68,0,768,.LM79-FrameMgr_processLine
632 .LM79:
633 02ae 1896 adiw r26,8
634 .stabn 68,0,762,.LM80-FrameMgr_processLine
635 .LM80:
636 02b0 9F5F subi r25,lo8(-(1))
637 02b2 9830 cpi r25,lo8(8)
638 02b4 C1F7 brne .L57
639 .L58:
640 .stabn 68,0,774,.LM81-FrameMgr_processLine
641 .LM81:
642 02b6 3C93 st X,r19
643 .stabn 68,0,775,.LM82-FrameMgr_processLine
644 .LM82:
645 02b8 FD01 movw r30,r26
646 02ba 5183 std Z+1,r21
647 .stabn 68,0,776,.LM83-FrameMgr_processLine
GAS LISTING /tmp/ccQRbLT3.s page 26
648 .LM83:
649 02bc 4283 std Z+2,r20
650 .stabn 68,0,777,.LM84-FrameMgr_processLine
651 .LM84:
652 02be 5383 std Z+3,r21
653 .stabn 68,0,778,.LM85-FrameMgr_processLine
654 .LM85:
655 02c0 F482 std Z+4,r15
779:FrameMgr.c **** *(pTrackedObjectData + X_LOWER_RIGHT_OFFSET) = currPixelRunFinish; /* x_lowerRight */
656 .stabn 68,0,779,.LM86-FrameMgr_processLine
657 .LM86:
658 02c2 4583 std Z+5,r20
780:FrameMgr.c **** *(pTrackedObjectData + Y_LOWER_RIGHT_OFFSET) = trackedLineCount; /* y_lowerRight */
659 .stabn 68,0,780,.LM87-FrameMgr_processLine
660 .LM87:
661 02c4 F682 std Z+6,r15
781:FrameMgr.c **** *(pTrackedObjectData + VALID_OBJECT_OFFSET) = TRUE; /* o
662 .stabn 68,0,781,.LM88-FrameMgr_processLine
663 .LM88:
664 02c6 81E0 ldi r24,lo8(1)
665 02c8 8783 std Z+7,r24
782:FrameMgr.c ****
783:FrameMgr.c **** numCurrTrackedObjects++;
666 .stabn 68,0,783,.LM89-FrameMgr_processLine
667 .LM89:
668 02ca 7F5F subi r23,lo8(-(1))
669 .L36:
784:FrameMgr.c **** }
785:FrameMgr.c **** }
786:FrameMgr.c ****
787:FrameMgr.c **** /* move the pointer to the beginning of the next tracked object */
788:FrameMgr.c **** pTrackedObjectData += SIZE_OF_TRACKED_OBJECT;
789:FrameMgr.c **** }
790:FrameMgr.c **** } while(currPixelRunFinish < ACTUAL_NUM_PIXELS_IN_A_LINE);
670 .stabn 68,0,790,.LM90-FrameMgr_processLine
671 .LM90:
672 02cc 403B cpi r20,lo8(-80)
673 02ce 08F4 brsh .+2
674 02d0 95CF rjmp .L35
675 02d2 7093 0000 sts numCurrTrackedObjects,r23
676 .LBE5:
677 .LBE4:
678 .stabn 68,0,460,.LM91-FrameMgr_processLine
679 .LM91:
680 02d6 C601 movw r24,r12
681 02d8 8770 andi r24,lo8(7)
682 02da 9070 andi r25,hi8(7)
683 02dc 0797 sbiw r24,7
684 02de 01F5 brne .L61
685 02e0 D801 movw r26,r16
686 02e2 1796 adiw r26,7
687 02e4 40E0 ldi r20,lo8(0)
688 .L63:
689 .stabn 68,0,464,.LM92-FrameMgr_processLine
690 .LM92:
691 02e6 8C91 ld r24,X
692 02e8 8130 cpi r24,lo8(1)
GAS LISTING /tmp/ccQRbLT3.s page 27
693 02ea A1F4 brne .L64
694 02ec FD01 movw r30,r26
695 02ee 3197 sbiw r30,1
696 .stabn 68,0,468,.LM93-FrameMgr_processLine
697 .LM93:
698 02f0 9081 ld r25,Z
699 02f2 FD01 movw r30,r26
700 02f4 3397 sbiw r30,3
701 02f6 8081 ld r24,Z
702 02f8 292F mov r18,r25
703 02fa 3327 clr r19
704 02fc F901 movw r30,r18
705 02fe E81B sub r30,r24
706 0300 F109 sbc r31,__zero_reg__
707 0302 3397 sbiw r30,3
708 0304 3CF4 brge .L64
709 .stabn 68,0,474,.LM94-FrameMgr_processLine
710 .LM94:
711 0306 C601 movw r24,r12
712 0308 821B sub r24,r18
713 030a 930B sbc r25,r19
714 030c 0397 sbiw r24,3
715 030e 14F0 brlt .L64
716 .stabn 68,0,477,.LM95-FrameMgr_processLine
717 .LM95:
718 0310 1C92 st X,__zero_reg__
719 .stabn 68,0,478,.LM96-FrameMgr_processLine
720 .LM96:
721 0312 7150 subi r23,lo8(-(-1))
722 .L64:
723 .stabn 68,0,462,.LM97-FrameMgr_processLine
724 .LM97:
725 0314 4F5F subi r20,lo8(-(1))
726 0316 1896 adiw r26,8
727 0318 4830 cpi r20,lo8(8)
728 031a 29F7 brne .L63
729 031c 7093 0000 sts numCurrTrackedObjects,r23
730 .L61:
731 .stabn 68,0,486,.LM98-FrameMgr_processLine
732 .LM98:
733 0320 E092 0000 sts trackedLineCount,r14
734 .stabn 68,0,487,.LM99-FrameMgr_processLine
735 .LM99:
736 0324 F0E9 ldi r31,lo8(-112)
737 0326 EF16 cp r14,r31
738 0328 09F4 brne .+2
739 032a 48CF rjmp .L72
740 .stabn 68,0,498,.LM100-FrameMgr_processLine
741 .LM100:
742 032c 8091 0000 lds r24,fastEventBitmask
743 0330 8260 ori r24,lo8(2)
744 0332 8093 0000 sts fastEventBitmask,r24
745 0336 04C0 rjmp .L71
746 .L54:
747 .LBB6:
748 .LBB7:
749 .stabn 68,0,757,.LM101-FrameMgr_processLine
GAS LISTING /tmp/ccQRbLT3.s page 28
750 .LM101:
751 0338 7830 cpi r23,lo8(8)
752 033a 08F4 brsh .+2
753 033c B2CF rjmp .L56
754 033e C6CF rjmp .L36
755 .L71:
756 .LBE7:
757 .LBE6:
758 /* epilogue: frame size=1 */
759 0340 2196 adiw r28,1
760 0342 0FB6 in __tmp_reg__,__SREG__
761 0344 F894 cli
762 0346 DEBF out __SP_H__,r29
763 0348 0FBE out __SREG__,__tmp_reg__
764 034a CDBF out __SP_L__,r28
765 034c DF91 pop r29
766 034e CF91 pop r28
767 0350 1F91 pop r17
768 0352 0F91 pop r16
769 0354 FF90 pop r15
770 0356 EF90 pop r14
771 0358 DF90 pop r13
772 035a CF90 pop r12
773 035c BF90 pop r11
774 035e AF90 pop r10
775 0360 9F90 pop r9
776 0362 8F90 pop r8
777 0364 7F90 pop r7
778 0366 6F90 pop r6
779 0368 5F90 pop r5
780 036a 4F90 pop r4
781 036c 3F90 pop r3
782 036e 2F90 pop r2
783 0370 0895 ret
784 /* epilogue end (size=25) */
785 /* function FrameMgr_processLine size 355 (304) */
786 .size FrameMgr_processLine, .-FrameMgr_processLine
787 .stabs "i:r(0,11)",64,0,343,20
788 .stabs "dataToSend:(0,23)=B(0,11)",128,0,344,1
789 .stabs "pTrackedObjectData:r(0,22)",64,0,345,26
790 .stabn 192,0,0,FrameMgr_processLine-FrameMgr_processLine
791 .stabn 224,0,0,.Lscope1-FrameMgr_processLine
792 .Lscope1:
793 .stabs "",36,0,0,.Lscope1-FrameMgr_processLine
794 .stabd 78,0,0
795 .stabs "FrameMgr_init:F(0,15)",36,0,191,FrameMgr_init
796 .global FrameMgr_init
797 .type FrameMgr_init, @function
798 FrameMgr_init:
799 .stabd 46,0,0
800 .stabn 68,0,191,.LM102-FrameMgr_init
801 .LM102:
802 /* prologue: frame size=0 */
803 /* prologue end (size=0) */
804 .stabn 68,0,192,.LM103-FrameMgr_init
805 .LM103:
806 0372 80E4 ldi r24,lo8(64)
GAS LISTING /tmp/ccQRbLT3.s page 29
807 0374 E0E0 ldi r30,lo8(trackedObjectTable)
808 0376 F0E0 ldi r31,hi8(trackedObjectTable)
809 0378 1192 st Z+,__zero_reg__
810 037a 8A95 dec r24
811 037c E9F7 brne .-6
812 /* epilogue: frame size=0 */
813 037e 0895 ret
814 /* epilogue end (size=1) */
815 /* function FrameMgr_init size 7 (6) */
816 .size FrameMgr_init, .-FrameMgr_init
817 .Lscope2:
818 .stabs "",36,0,0,.Lscope2-FrameMgr_init
819 .stabd 78,0,0
820 .stabs "FrameMgr_acquireLine:F(0,15)",36,0,287,FrameMgr_acquireLine
821 .global FrameMgr_acquireLine
822 .type FrameMgr_acquireLine, @function
823 FrameMgr_acquireLine:
824 .stabd 46,0,0
825 .stabn 68,0,287,.LM104-FrameMgr_acquireLine
826 .LM104:
827 /* prologue: frame size=0 */
828 /* prologue end (size=0) */
829 .stabn 68,0,297,.LM105-FrameMgr_acquireLine
830 .LM105:
831 0380 8091 0000 lds r24,currentState
832 0384 8230 cpi r24,lo8(2)
833 0386 49F5 brne .L83
834 .stabn 68,0,299,.LM106-FrameMgr_acquireLine
835 .LM106:
836 0388 8091 0000 lds r24,lineCount
837 038c 282F mov r18,r24
838 038e 220F lsl r18
839 .stabn 68,0,305,.LM107-FrameMgr_acquireLine
840 .LM107:
841 0390 80EB ldi r24,lo8(-80)
842 0392 E0E0 ldi r30,lo8(currentLineBuffer)
843 0394 F0E0 ldi r31,hi8(currentLineBuffer)
844 0396 982F mov r25,r24
845 0398 1192 st Z+,__zero_reg__
846 039a 9A95 dec r25
847 039c E9F7 brne .-6
848 .stabn 68,0,306,.LM108-FrameMgr_acquireLine
849 .LM108:
850 039e E0E0 ldi r30,lo8(previousLineBuffer)
851 03a0 F0E0 ldi r31,hi8(previousLineBuffer)
852 03a2 1192 st Z+,__zero_reg__
853 03a4 8A95 dec r24
854 03a6 E9F7 brne .-6
855 .L85:
856 .stabn 68,0,309,.LM109-FrameMgr_acquireLine
857 .LM109:
858 03a8 829B sbis 48-0x20,2
859 03aa FECF rjmp .L85
860 .L101:
861 .stabn 68,0,310,.LM110-FrameMgr_acquireLine
862 .LM110:
863 03ac 829B sbis 48-0x20,2
GAS LISTING /tmp/ccQRbLT3.s page 30
864 03ae 07C0 rjmp .L110
865 03b0 FDCF rjmp .L101
866 .L88:
867 03b2 90E0 ldi r25,lo8(0)
868 .L114:
869 .stabn 68,0,316,.LM111-FrameMgr_acquireLine
870 .LM111:
871 03b4 849B sbis 48-0x20,4
872 03b6 FECF rjmp .L114
873 .L102:
874 .stabn 68,0,318,.LM112-FrameMgr_acquireLine
875 .LM112:
876 03b8 849B sbis 48-0x20,4
877 03ba 04C0 rjmp .L111
878 03bc FDCF rjmp .L102
879 .L110:
880 .stabn 68,0,314,.LM113-FrameMgr_acquireLine
881 .LM113:
882 03be 2223 tst r18
883 03c0 C1F7 brne .L88
884 03c2 05C0 rjmp .L92
885 .L111:
886 03c4 9150 subi r25,lo8(-(-1))
887 03c6 822F mov r24,r18
888 03c8 8195 neg r24
889 03ca 9817 cp r25,r24
890 03cc 99F7 brne .L114
891 .L92:
892 .stabn 68,0,322,.LM114-FrameMgr_acquireLine
893 .LM114:
894 03ce 60E0 ldi r22,lo8(previousLineBuffer)
895 03d0 70E0 ldi r23,hi8(previousLineBuffer)
896 03d2 80E0 ldi r24,lo8(currentLineBuffer)
897 03d4 90E0 ldi r25,hi8(currentLineBuffer)
898 03d6 00D0 rcall CamIntAsm_acquireDumpLine
899 03d8 0895 ret
900 .L83:
901 .stabn 68,0,324,.LM115-FrameMgr_acquireLine
902 .LM115:
903 03da 8130 cpi r24,lo8(1)
904 03dc 39F4 brne .L96
905 .L103:
906 .stabn 68,0,326,.LM116-FrameMgr_acquireLine
907 .LM116:
908 03de 8499 sbic 48-0x20,4
909 03e0 FECF rjmp .L103
910 .stabn 68,0,327,.LM117-FrameMgr_acquireLine
911 .LM117:
912 03e2 60E0 ldi r22,lo8(colorMap)
913 03e4 70E0 ldi r23,hi8(colorMap)
914 03e6 80E0 ldi r24,lo8(currentLineBuffer)
915 03e8 90E0 ldi r25,hi8(currentLineBuffer)
916 03ea 00D0 rcall CamIntAsm_acquireTrackingLine
917 .L96:
918 03ec 0895 ret
919 /* epilogue: frame size=0 */
920 /* epilogue: noreturn */
GAS LISTING /tmp/ccQRbLT3.s page 31
921 /* epilogue end (size=0) */
922 /* function FrameMgr_acquireLine size 55 (55) */
923 .size FrameMgr_acquireLine, .-FrameMgr_acquireLine
924 .stabs "tmpLineCount:r(0,11)",64,0,288,18
925 .stabn 192,0,0,FrameMgr_acquireLine-FrameMgr_acquireLine
926 .stabn 224,0,0,.Lscope3-FrameMgr_acquireLine
927 .Lscope3:
928 .stabs "",36,0,0,.Lscope3-FrameMgr_acquireLine
929 .stabd 78,0,0
930 .stabs "FrameMgr_acquireFrame:F(0,15)",36,0,261,FrameMgr_acquireFrame
931 .global FrameMgr_acquireFrame
932 .type FrameMgr_acquireFrame, @function
933 FrameMgr_acquireFrame:
934 .stabd 46,0,0
935 .stabn 68,0,261,.LM118-FrameMgr_acquireFrame
936 .LM118:
937 /* prologue: frame size=0 */
938 /* prologue end (size=0) */
939 .stabn 68,0,262,.LM119-FrameMgr_acquireFrame
940 .LM119:
941 03ee 8091 0000 lds r24,currentState
942 03f2 8130 cpi r24,lo8(1)
943 03f4 A9F4 brne .L120
944 .stabn 68,0,264,.LM120-FrameMgr_acquireFrame
945 .LM120:
946 03f6 1092 0000 sts trackedLineCount,__zero_reg__
947 .stabn 68,0,265,.LM121-FrameMgr_acquireFrame
948 .LM121:
949 03fa 8091 0000 lds r24,numCurrTrackedObjects
950 03fe 8093 0000 sts numPrevTrackedObjects,r24
951 .stabn 68,0,266,.LM122-FrameMgr_acquireFrame
952 .LM122:
953 0402 1092 0000 sts numCurrTrackedObjects,__zero_reg__
954 .stabn 68,0,270,.LM123-FrameMgr_acquireFrame
955 .LM123:
956 0406 80E4 ldi r24,lo8(64)
957 0408 E0E0 ldi r30,lo8(trackedObjectTable)
958 040a F0E0 ldi r31,hi8(trackedObjectTable)
959 040c 1192 st Z+,__zero_reg__
960 040e 8A95 dec r24
961 0410 E9F7 brne .-6
962 .L118:
963 .stabn 68,0,272,.LM124-FrameMgr_acquireFrame
964 .LM124:
965 0412 829B sbis 48-0x20,2
966 0414 FECF rjmp .L118
967 .stabn 68,0,273,.LM125-FrameMgr_acquireFrame
968 .LM125:
969 0416 60E0 ldi r22,lo8(colorMap)
970 0418 70E0 ldi r23,hi8(colorMap)
971 041a 80E0 ldi r24,lo8(currentLineBuffer)
972 041c 90E0 ldi r25,hi8(currentLineBuffer)
973 041e 00D0 rcall CamIntAsm_acquireTrackingLine
974 .L120:
975 0420 0895 ret
976 /* epilogue: frame size=0 */
977 /* epilogue: noreturn */
GAS LISTING /tmp/ccQRbLT3.s page 32
978 /* epilogue end (size=0) */
979 /* function FrameMgr_acquireFrame size 26 (26) */
980 .size FrameMgr_acquireFrame, .-FrameMgr_acquireFrame
981 .Lscope4:
982 .stabs "",36,0,0,.Lscope4-FrameMgr_acquireFrame
983 .stabd 78,0,0
984 .stabs "FrameMgr_dispatchEvent:F(0,15)",36,0,205,FrameMgr_dispatchEvent
985 .stabs "event:P(0,11)",64,0,204,24
986 .global FrameMgr_dispatchEvent
987 .type FrameMgr_dispatchEvent, @function
988 FrameMgr_dispatchEvent:
989 .stabd 46,0,0
990 .stabn 68,0,205,.LM126-FrameMgr_dispatchEvent
991 .LM126:
992 /* prologue: frame size=0 */
993 /* prologue end (size=0) */
994 .stabn 68,0,206,.LM127-FrameMgr_dispatchEvent
995 .LM127:
996 0422 8430 cpi r24,lo8(4)
997 0424 19F1 breq .L127
998 .stabn 68,0,206,.LM128-FrameMgr_dispatchEvent
999 .LM128:
1000 0426 8530 cpi r24,lo8(5)
1001 0428 28F4 brsh .L131
1002 042a 8130 cpi r24,lo8(1)
1003 042c 09F1 breq .L125
1004 042e 8230 cpi r24,lo8(2)
1005 0430 41F5 brne .L133
1006 0432 07C0 rjmp .L126
1007 .L131:
1008 0434 8038 cpi r24,lo8(-128)
1009 0436 99F0 breq .L129
1010 0438 8138 cpi r24,lo8(-127)
1011 043a 09F1 breq .L130
1012 043c 8032 cpi r24,lo8(32)
1013 043e 09F5 brne .L133
1014 0440 13C0 rjmp .L128
1015 .L126:
1016 .stabn 68,0,211,.LM129-FrameMgr_dispatchEvent
1017 .LM129:
1018 0442 61E0 ldi r22,lo8(1)
1019 0444 81E1 ldi r24,lo8(17)
1020 0446 00D0 rcall CamConfig_setCamReg
1021 .stabn 68,0,212,.LM130-FrameMgr_dispatchEvent
1022 .LM130:
1023 0448 00D0 rcall CamConfig_sendFifoCmds
1024 .stabn 68,0,213,.LM131-FrameMgr_dispatchEvent
1025 .LM131:
1026 044a 88EE ldi r24,lo8(1000)
1027 044c 93E0 ldi r25,hi8(1000)
1028 044e 00D0 rcall Utility_delay
1029 .stabn 68,0,214,.LM132-FrameMgr_dispatchEvent
1030 .LM132:
1031 0450 1092 0000 sts lineCount,__zero_reg__
1032 .stabn 68,0,215,.LM133-FrameMgr_dispatchEvent
1033 .LM133:
1034 0454 82E0 ldi r24,lo8(2)
GAS LISTING /tmp/ccQRbLT3.s page 33
1035 0456 8093 0000 sts currentState,r24
1036 .stabn 68,0,217,.LM134-FrameMgr_dispatchEvent
1037 .LM134:
1038 045a 92DF rcall FrameMgr_acquireLine
1039 045c 0895 ret
1040 .L129:
1041 .stabn 68,0,221,.LM135-FrameMgr_dispatchEvent
1042 .LM135:
1043 045e 81E0 ldi r24,lo8(1)
1044 0460 8093 0000 sts currentState,r24
1045 .stabn 68,0,222,.LM136-FrameMgr_dispatchEvent
1046 .LM136:
1047 0464 C4DF rcall FrameMgr_acquireFrame
1048 0466 0895 ret
1049 .L128:
1050 .stabn 68,0,226,.LM137-FrameMgr_dispatchEvent
1051 .LM137:
1052 0468 CBDD rcall FrameMgr_processFrame
1053 046a 0895 ret
1054 .L127:
1055 .stabn 68,0,230,.LM138-FrameMgr_dispatchEvent
1056 .LM138:
1057 046c C0DF rcall FrameMgr_acquireFrame
1058 046e 0895 ret
1059 .L125:
1060 .stabn 68,0,234,.LM139-FrameMgr_dispatchEvent
1061 .LM139:
1062 0470 8091 0000 lds r24,currentState
1063 0474 8823 tst r24
1064 0476 29F0 breq .L133
1065 .stabn 68,0,240,.LM140-FrameMgr_dispatchEvent
1066 .LM140:
1067 0478 84E0 ldi r24,lo8(4)
1068 047a 00D0 rcall Exec_writeEventFifo
1069 047c 0895 ret
1070 .L130:
1071 .stabn 68,0,246,.LM141-FrameMgr_dispatchEvent
1072 .LM141:
1073 047e 1092 0000 sts currentState,__zero_reg__
1074 .L133:
1075 0482 0895 ret
1076 /* epilogue: frame size=0 */
1077 /* epilogue: noreturn */
1078 /* epilogue end (size=0) */
1079 /* function FrameMgr_dispatchEvent size 49 (49) */
1080 .size FrameMgr_dispatchEvent, .-FrameMgr_dispatchEvent
1081 .Lscope5:
1082 .stabs "",36,0,0,.Lscope5-FrameMgr_dispatchEvent
1083 .stabd 78,0,0
1084 .data
1085 .type pCurrentTrackedObjectTable, @object
1086 .size pCurrentTrackedObjectTable, 2
1087 pCurrentTrackedObjectTable:
1088 0000 0000 .word trackedObjectTable
1089 .lcomm numCurrTrackedObjects,1
1090 .lcomm currentState,1
1091 .lcomm lineCount,1
GAS LISTING /tmp/ccQRbLT3.s page 34
1092 .lcomm trackedLineCount,1
1093 .lcomm numPrevTrackedObjects,1
1094 .lcomm trackedObjectTable,64
1095 .stabs "trackedObjectTable:S(0,24)=ar(0,25)=r(0,25);0;0177777;;0;7;(0,20)",40,0,162,trackedObjectT
1096 .stabs "pCurrentTrackedObjectTable:S(0,26)=*(0,20)",38,0,163,pCurrentTrackedObjectTable
1097 .stabs "lineCount:S(0,11)",38,0,164,lineCount
1098 .stabs "currentState:S(0,17)",38,0,165,currentState
1099 .stabs "numCurrTrackedObjects:S(0,11)",38,0,166,numCurrTrackedObjects
1100 .stabs "numPrevTrackedObjects:S(0,11)",38,0,167,numPrevTrackedObjects
1101 .stabs "trackedLineCount:S(0,11)",38,0,168,trackedLineCount
1102 .text
1103 .stabs "",100,0,0,.Letext0
1104 .Letext0:
1105 /* File "FrameMgr.c": code 580 = 0x0244 ( 513), prologues 33, epilogues 34 */
GAS LISTING /tmp/ccQRbLT3.s page 35
DEFINED SYMBOLS
*ABS*:00000000 FrameMgr.c
/tmp/ccQRbLT3.s:3 *ABS*:0000003f __SREG__
/tmp/ccQRbLT3.s:4 *ABS*:0000003e __SP_H__
/tmp/ccQRbLT3.s:5 *ABS*:0000003d __SP_L__
/tmp/ccQRbLT3.s:6 *ABS*:00000000 __tmp_reg__
/tmp/ccQRbLT3.s:7 *ABS*:00000001 __zero_reg__
/tmp/ccQRbLT3.s:91 .text:00000000 FrameMgr_processFrame
/tmp/ccQRbLT3.s:1087 .data:00000000 pCurrentTrackedObjectTable
.bss:00000000 numCurrTrackedObjects
/tmp/ccQRbLT3.s:270 .text:000000b2 FrameMgr_processLine
/tmp/ccQRbLT3.s:1089 .bss:00000001 currentState
/tmp/ccQRbLT3.s:1090 .bss:00000002 lineCount
/tmp/ccQRbLT3.s:1091 .bss:00000003 trackedLineCount
/tmp/ccQRbLT3.s:798 .text:00000372 FrameMgr_init
/tmp/ccQRbLT3.s:1093 .bss:00000005 trackedObjectTable
/tmp/ccQRbLT3.s:823 .text:00000380 FrameMgr_acquireLine
/tmp/ccQRbLT3.s:933 .text:000003ee FrameMgr_acquireFrame
/tmp/ccQRbLT3.s:1092 .bss:00000004 numPrevTrackedObjects
/tmp/ccQRbLT3.s:988 .text:00000422 FrameMgr_dispatchEvent
UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss
UIMgr_writeTxFifo
Exec_writeEventFifo
UartInt_txByte
currentLineBuffer
previousLineBuffer
CamConfig_setCamReg
CamConfig_sendFifoCmds
fastEventBitmask
CamIntAsm_acquireDumpLine
colorMap
CamIntAsm_acquireTrackingLine
Utility_delay