📄 mca25.lst
字号:
71:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** Delay loop using an 8-bit counter \c __count, so up to 256
72:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** iterations are possible. (The value 256 would have to be passed
73:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** as 0.) The loop executes three CPU cycles per iteration, not
74:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** including the overhead the compiler needs to setup the counter
75:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** register.
76:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
77:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** Thus, at a CPU speed of 1 MHz, delays of up to 768 microseconds
78:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** can be achieved.
79:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** */
80:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** void
81:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** _delay_loop_1(uint8_t __count)
82:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** {
83:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** __asm__ volatile (
84:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** "1: dec %0" "\n\t"
85:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** "brne 1b"
86:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** : "=r" (__count)
87:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** : "0" (__count)
88:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** );
89:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** }
90:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
91:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** /** \ingroup util_delay_basic
92:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
93:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** Delay loop using a 16-bit counter \c __count, so up to 65536
94:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** iterations are possible. (The value 65536 would have to be
95:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** passed as 0.) The loop executes four CPU cycles per iteration,
96:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** not including the overhead the compiler requires to setup the
97:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** counter register pair.
98:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h ****
99:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** Thus, at a CPU speed of 1 MHz, delays of up to about 262.1
100:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** milliseconds can be achieved.
101:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** */
102:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** void
103:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** _delay_loop_2(uint16_t __count)
104:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** {
105:c:/winavr-20081205/lib/gcc/../../avr/include/util/delay_basic.h **** __asm__ volatile (
134 ,105,.LM2-.LFBB1
135 .LM2:
136 0004 43E3 ldi r20,lo8(1843)
137 0006 57E0 ldi r21,hi8(1843)
138 0008 00C0 rjmp .L2
139 .L4:
140 .LBE353:
141 .LBE352:
142 .LBE351:
143 .LBE350:
144 .LBE349:
145 .LBE348:
147 .Ltext2:
149 .LM3:
150 000a 9B01 movw r18,r22
151 .LBB361:
152 .LBB360:
153 .LBB357:
121:io/mca25.c ****
122:io/mca25.c ****
123:io/mca25.c **** //handle channel 0x23 data
124:io/mca25.c **** void mca25_handle_channel_x23(void){
125:io/mca25.c **** if (mca25_mux_buffer[1] == 0xEF){
126:io/mca25.c **** //UIH
127:io/mca25.c **** if (string_compare_progmem_plen("AT*ECUR=", mca25_buffer)){
128:io/mca25.c **** //ack current request packets:
129:io/mca25.c **** // -> send mux "\r\nOK\r\n" packet:
130:io/mca25.c **** mca25_puts_progmem("\xF9\x21\xEF\x0D\x0D\x0A\x4F\x4B\x0D\x0A\x48\xF9");
131:io/mca25.c **** }else{
132:io/mca25.c **** #if MCA25_DEBUG
133:io/mca25.c **** softuart_putc('u');
134:io/mca25.c **** #endif
135:io/mca25.c **** }
136:io/mca25.c **** }else if (mca25_mux_buffer[1] == 0x3F){
137:io/mca25.c **** //SABM
138:io/mca25.c **** mca25_puts_progmem("\xF9\x23\x73\x01\x02\xF9");
139:io/mca25.c **** }
140:io/mca25.c **** }
141:io/mca25.c ****
142:io/mca25.c **** //handle channel 0x03 data
143:io/mca25.c **** void mca25_handle_channel_x03(void){
144:io/mca25.c **** if (mca25_mux_buffer[1] == 0xEF){
145:io/mca25.c **** //UIH
146:io/mca25.c **** if (string_compare_progmem_plen("\xE1\x07\x23\x0C\x01", mca25_buffer)){
147:io/mca25.c **** mca25_puts_progmem("\xF9\x01\xEF\x0B\xE3\x07\x23\x0C\x01\x79\xF9");
148:io/mca25.c **** }else{
149:io/mca25.c **** #if MCA25_DEBUG
150:io/mca25.c **** softuart_putc('v');
151:io/mca25.c **** #endif
152:io/mca25.c **** }
153:io/mca25.c **** }else if (mca25_mux_buffer[1] == 0x3F){
154:io/mca25.c **** //SABM
155:io/mca25.c **** mca25_puts_progmem("\xF9\x03\x73\x01\xD7\xF9");
156:io/mca25.c **** }
157:io/mca25.c **** }
158:io/mca25.c ****
159:io/mca25.c **** //cleanup dead connection -> run this every second !
160:io/mca25.c **** void mca25_cleanup(void){
161:io/mca25.c **** if (mca25_pic_state != MCA25_PIC_STATE_IDLE){
162:io/mca25.c **** if (mca25_allocated_timeout == 0){
163:io/mca25.c **** #if MCA25_DEBUG
164:io/mca25.c **** softuart_puts_progmem("CAM : allocation to socket ");
165:io/mca25.c **** softuart_put_uint8(mca25_allocated_for_socket);
166:io/mca25.c **** softuart_puts_progmem(" removed");
167:io/mca25.c **** softuart_putnewline();
168:io/mca25.c **** #endif
169:io/mca25.c **** mca25_pic_state = MCA25_PIC_STATE_IDLE;
170:io/mca25.c **** }else{
171:io/mca25.c **** mca25_allocated_timeout--;
172:io/mca25.c **** }
173:io/mca25.c **** }
174:io/mca25.c **** }
175:io/mca25.c ****
176:io/mca25.c **** //grab jpg data & store in buffer
177:io/mca25.c **** unsigned int mca25_grab_data(char *buffer, unsigned int datalen, unsigned long pos, unsigned char s
178:io/mca25.c **** int skip_count=0;
179:io/mca25.c **** unsigned char state=0;
180:io/mca25.c ****
181:io/mca25.c **** mca25_allocated_timeout = 5; //5sec timeout
182:io/mca25.c ****
183:io/mca25.c **** //cam is used by another user -> abort
184:io/mca25.c **** if ((mca25_pic_state != MCA25_PIC_STATE_IDLE) && (mca25_allocated_for_socket != socketnum)){
185:io/mca25.c **** return 0xFFFE;
186:io/mca25.c **** }
187:io/mca25.c ****
188:io/mca25.c **** //cam is no longer working -> reset !
189:io/mca25.c **** if ((mca25_pic_state == MCA25_PIC_STATE_CAM_ERROR) || (mca25_ready == 0)){
190:io/mca25.c **** //cam not initialised or missing!
191:io/mca25.c **** #if MCA25_DEBUG
192:io/mca25.c **** softuart_puts_progmem("CAM : grab -> cam error -> retry init!");
193:io/mca25.c **** softuart_putnewline();
194:io/mca25.c **** #endif
195:io/mca25.c **** mca25_init_cam();
196:io/mca25.c **** mca25_configure();
197:io/mca25.c **** //return 0xFFFF; //-> abort this image !
198:io/mca25.c **** }
199:io/mca25.c ****
200:io/mca25.c **** //we need to do a preview image:
201:io/mca25.c **** if (mca25_pic_state == MCA25_PIC_STATE_IDLE){
202:io/mca25.c **** mca25_start_image_grab(socketnum);
203:io/mca25.c **** }
204:io/mca25.c ****
205:io/mca25.c **** #if 1
206:io/mca25.c **** softuart_puts_progmem("CAM : req byte ");
207:io/mca25.c **** softuart_put_uint16(pos);
208:io/mca25.c **** softuart_puts_progmem(" cur pos is: ");
209:io/mca25.c **** softuart_put_uint16(mca25_datapos);
210:io/mca25.c **** softuart_putnewline();
211:io/mca25.c **** //tcp stack requested data bytes we do no longer have...
212:io/mca25.c **** //hack: dont touch ethernetbuffer & hope that data is still available.
213:io/mca25.c **** // if buffer was used during last transfer -> picture will have errors...
214:io/mca25.c **** if (pos<mca25_datapos){
215:io/mca25.c **** int adjust = (mca25_datapos-pos)-512;
216:io/mca25.c **** if (adjust == 0){
217:io/mca25.c **** //perfect
218:io/mca25.c **** return 512;
219:io/mca25.c **** }else if(adjust > 0){
220:io/mca25.c **** //we must shift the data:
221:io/mca25.c **** for(unsigned int a=0; a<512; a++){
222:io/mca25.c **** if (a+adjust <= 512)
223:io/mca25.c **** buffer[a] = buffer[a+adjust];
224:io/mca25.c **** }
225:io/mca25.c **** return adjust; //#adjusted bytes data
226:io/mca25.c **** }else{
227:io/mca25.c **** //>512 bytes of data seems to be lost -> no way to fix it...
228:io/mca25.c **** //-> dont touch the buffer, maybe we can use the data later ...
229:io/mca25.c **** return (adjust%512);
230:io/mca25.c **** }
231:io/mca25.c **** }else if(pos>mca25_datapos){
232:io/mca25.c **** //?! how could that happen ?
233:io/mca25.c **** //FIXME:
234:io/mca25.c **** //1) ignore the missing data & continue
235:io/mca25.c **** //2) skip camera data until we have the requestet data packet...
236:io/mca25.c **** //-> use (1), change to 2 later ?!
237:io/mca25.c **** }
238:io/mca25.c **** #endif
239:io/mca25.c ****
240:io/mca25.c **** #if MCA25_DEBUG
241:io/mca25.c **** /*softuart_puts_progmem("CAM : grab data starting at byte ");
242:io/mca25.c **** softuart_put_uint16(pos>>16);
243:io/mca25.c **** softuart_put_uint16(pos&0xFFFF);
244:io/mca25.c **** softuart_puts_progmem(", current pos is ");
245:io/mca25.c **** softuart_put_uint16(mca25_datapos>>16);
246:io/mca25.c **** softuart_put_uint16(mca25_datapos&0xFFFF);
247:io/mca25.c **** softuart_putnewline();*/
248:io/mca25.c **** #endif
249:io/mca25.c ****
250:io/mca25.c **** unsigned int dcnt=0;
251:io/mca25.c **** unsigned int res=0;
252:io/mca25.c **** unsigned int bufpos=0;
253:io/mca25.c ****
254:io/mca25.c **** //we have received data -> send an ack !
255:io/mca25.c **** if ((mca25_pic_state == MCA25_PIC_STATE_JPG_DATA) || (mca25_pic_state == MCA25_PIC_STATE_LAST_DAT
256:io/mca25.c **** mca25_send_data_ack();
257:io/mca25.c **** }
258:io/mca25.c ****
259:io/mca25.c **** //do the statemachine
260:io/mca25.c **** while (state != 100){
261:io/mca25.c **** if (state == 0)
262:io/mca25.c **** res = mca25_read_mux_packet(&buffer[bufpos],6);
263:io/mca25.c **** else
264:io/mca25.c **** res = mca25_read_mux_packet(&buffer[bufpos],0);
265:io/mca25.c **** if (res == 0){
266:io/mca25.c **** #if MCA25_DEBUG
267:io/mca25.c **** softuart_puts_progmem("TIMEOUT! (MUX J)");
268:io/mca25.c **** softuart_putnewline();
269:io/mca25.c **** softuart_puts_progmem("dcount=");
270:io/mca25.c **** softuart_put_uint16(dcnt);
271:io/mca25.c **** softuart_putnewline();
272:io/mca25.c **** #endif
273:io/mca25.c ****
274:io/mca25.c **** //cam error, disable !
275:io/mca25.c **** mca25_ready = 0;
276:io/mca25.c **** return 0xFFFF; //read failed -> exit!;
277:io/mca25.c **** }
278:io/mca25.c ****
279:io/mca25.c **** if (bufpos>datalen){
280:io/mca25.c **** #if MCA25_DEBUG
281:io/mca25.c **** softuart_puts_progmem("CAM : buf overflow! ");
282:io/mca25.c **** softuart_put_uint16(skip_count);
283:io/mca25.c **** softuart_put_uint16(bufpos);
284:io/mca25.c **** softuart_putnewline();
285:io/mca25.c **** #endif
286:io/mca25.c **** return 0xFFFF;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -