📄 mca25.lst
字号:
287:io/mca25.c **** }
288:io/mca25.c ****
289:io/mca25.c **** //new version, thanks to jesper ;)
290:io/mca25.c **** //softuart_put_uint8(mca25_buffer[1]);
291:io/mca25.c **** if ((mca25_mux_buffer[0] == 0x83) && (mca25_mux_buffer[1] == 0xEF) ){ //data channel & UIH packet
292:io/mca25.c **** dcnt++;
293:io/mca25.c ****
294:io/mca25.c **** switch (state){
295:io/mca25.c **** case 0: //check how many bytes cam want to send
296:io/mca25.c **** skip_count = ((int)mca25_mux_buffer[4]<<8) + mca25_mux_buffer[5];
297:io/mca25.c ****
298:io/mca25.c **** if (skip_count > datalen){
299:io/mca25.c **** skip_count = datalen;
300:io/mca25.c **** }
301:io/mca25.c ****
302:io/mca25.c **** if (skip_count > 3){
303:io/mca25.c **** //only handle data packets -> ignore packets smaller 3 bytes (=acks)
304:io/mca25.c **** skip_count -= ((mca25_mux_buffer[2])>>1);
305:io/mca25.c **** bufpos += (mca25_mux_buffer[2]>>1)-6;
306:io/mca25.c ****
307:io/mca25.c **** //last data packet ?!
308:io/mca25.c **** if (mca25_mux_buffer[3] == 0xA0){
309:io/mca25.c **** mca25_pic_state = MCA25_PIC_STATE_LAST_DATA; //no more data
310:io/mca25.c **** }else{
311:io/mca25.c **** mca25_pic_state = MCA25_PIC_STATE_JPG_DATA; //middle of pic
312:io/mca25.c **** }
313:io/mca25.c **** state = 1;
314:io/mca25.c ****
315:io/mca25.c **** if (skip_count <= 0){
316:io/mca25.c **** //softuart_putc('.');
317:io/mca25.c **** if (mca25_pic_state == MCA25_PIC_STATE_LAST_DATA){
318:io/mca25.c **** mca25_send_data_ack();
319:io/mca25.c ****
320:io/mca25.c **** //reconfigure mux channel (?!)
321:io/mca25.c **** mca25_puts_progmem("\xF9\x01\xEF\x0B\xE3\x07\x23\x0C\x01\x79\xF9");
322:io/mca25.c ****
323:io/mca25.c **** mca25_pic_state = MCA25_PIC_STATE_IDLE;
324:io/mca25.c **** mca25_datapos += bufpos;
325:io/mca25.c **** return bufpos;
326:io/mca25.c **** }else{
327:io/mca25.c **** mca25_datapos += bufpos;
328:io/mca25.c **** return 0;
329:io/mca25.c **** }
330:io/mca25.c **** }
331:io/mca25.c **** }
332:io/mca25.c **** break;
333:io/mca25.c **** case 2:
334:io/mca25.c **** case 1:
335:io/mca25.c **** skip_count -= ((mca25_mux_buffer[2])>>1);
336:io/mca25.c **** bufpos += (mca25_mux_buffer[2]>>1)-0;
337:io/mca25.c ****
338:io/mca25.c **** if (skip_count <= 0){
339:io/mca25.c **** //softuart_putc('.');
340:io/mca25.c **** if (mca25_pic_state == MCA25_PIC_STATE_LAST_DATA){
341:io/mca25.c **** mca25_send_data_ack();
342:io/mca25.c ****
343:io/mca25.c **** //reconfigure mux channel (?!)
344:io/mca25.c **** mca25_puts_progmem("\xF9\x01\xEF\x0B\xE3\x07\x23\x0C\x01\x79\xF9");
345:io/mca25.c ****
346:io/mca25.c **** mca25_pic_state = MCA25_PIC_STATE_IDLE;
347:io/mca25.c **** mca25_datapos += bufpos;
348:io/mca25.c **** return bufpos; //last data packet !
349:io/mca25.c **** }else{
350:io/mca25.c **** mca25_datapos += bufpos;
351:io/mca25.c **** return 0; //state = 100;
352:io/mca25.c **** }
353:io/mca25.c **** }
354:io/mca25.c **** break;
355:io/mca25.c ****
356:io/mca25.c **** default:
357:io/mca25.c **** break;
358:io/mca25.c **** } //case
359:io/mca25.c **** //softuart_put_uint16(skip_count);
360:io/mca25.c **** }else if (mca25_mux_buffer[0] == 0x23){
361:io/mca25.c **** //channel 0x23
362:io/mca25.c **** mca25_handle_channel_x23();
363:io/mca25.c **** }else if (mca25_mux_buffer[0] == 0x03){
364:io/mca25.c **** //channel 0x03
365:io/mca25.c **** mca25_handle_channel_x03();
366:io/mca25.c **** }else{
367:io/mca25.c **** /*for(unsigned char f=0; f<40; f++){
368:io/mca25.c **** softuart_put_uint8(f);
369:io/mca25.c **** softuart_putc('>');
370:io/mca25.c **** softuart_put_uint8(mca25_buffer[f]);
371:io/mca25.c **** softuart_putnewline();
372:io/mca25.c **** }softuart_putnewline();softuart_putnewline();*/
373:io/mca25.c **** }
374:io/mca25.c **** }
375:io/mca25.c **** //softuart_puts_progmem("count=");
376:io/mca25.c **** //softuart_put_uint16(dcnt);
377:io/mca25.c **** //preview image #i has been grabbed.
378:io/mca25.c **** #if MCA25_DEBUG
379:io/mca25.c **** softuart_putc(' ');
380:io/mca25.c **** #endif
381:io/mca25.c ****
382:io/mca25.c **** return 0xFFFF;
383:io/mca25.c **** }
384:io/mca25.c ****
385:io/mca25.c **** //start image grab, grab preview pictures and send jpg request
386:io/mca25.c **** unsigned char mca25_start_image_grab(unsigned char socketnum){
387:io/mca25.c **** unsigned char state;
388:io/mca25.c **** unsigned char datapos;
389:io/mca25.c **** int skip_count=0;
390:io/mca25.c ****
391:io/mca25.c **** //switch light on (slow fade in !)
392:io/mca25.c **** //mpf10_fade(MPF10_FADE_IN);
393:io/mca25.c **** //without soft fade in:
394:io/mca25.c **** MPF10_ENABLE();
395:io/mca25.c ****
396:io/mca25.c **** //reset global data byte counter
397:io/mca25.c **** mca25_datapos = 0;
398:io/mca25.c ****
399:io/mca25.c **** //allocate cam to current socket
400:io/mca25.c **** mca25_allocated_for_socket = socketnum;
401:io/mca25.c ****
402:io/mca25.c **** //reset state
403:io/mca25.c **** mca25_pic_state = MCA25_PIC_STATE_IDLE; //not ready
404:io/mca25.c ****
405:io/mca25.c **** if (mca25_ready == 0){
406:io/mca25.c **** //cam not initialised or missing!
407:io/mca25.c **** #if MCA25_DEBUG
408:io/mca25.c **** softuart_puts_progmem("CAM : cam not initialised or missing -> abort.");
409:io/mca25.c **** softuart_putnewline();
410:io/mca25.c **** #endif
411:io/mca25.c **** MPF10_DISABLE();
412:io/mca25.c **** return 0;
413:io/mca25.c **** }
414:io/mca25.c ****
415:io/mca25.c **** #if MCA25_DEBUG
416:io/mca25.c **** softuart_puts_progmem("CAM : starting image grab...");
417:io/mca25.c **** softuart_putnewline();
418:io/mca25.c **** softuart_puts_progmem("CAM : grabbing preview ");
419:io/mca25.c **** #endif
420:io/mca25.c ****
421:io/mca25.c **** //grab 5 preview pictures:
422:io/mca25.c **** for (char i=0; i<5; i++){
423:io/mca25.c **** #if MCA25_DEBUG
424:io/mca25.c **** softuart_put_uint8(i);
425:io/mca25.c **** #endif
426:io/mca25.c ****
427:io/mca25.c **** //softuart_put_uint8(mca25_brightness);
428:io/mca25.c **** //mca25_brightness = 0;
429:io/mca25.c ****
430:io/mca25.c **** if ((i==0) && (mca25_pic_state == MCA25_PIC_STATE_JPG_DATA)){
431:io/mca25.c **** // do not send start cmd ! an jpg request is already running
432:io/mca25.c **** // -> use first "preview" to ack jpg data!
433:io/mca25.c **** }else{
434:io/mca25.c **** if (mca25_pic_state == MCA25_PIC_STATE_LAST_DATA){
435:io/mca25.c **** //last data -> send an ack !
436:io/mca25.c **** mca25_send_data_ack();
437:io/mca25.c **** }
438:io/mca25.c ****
439:io/mca25.c **** // send capture start cmd:
440:io/mca25.c **** mca25_puts_progmem2(MCA25_START_CAPTURING, sizeof(MCA25_START_CAPTURING));
441:io/mca25.c **** }
442:io/mca25.c ****
443:io/mca25.c **** state = 0;
444:io/mca25.c **** datapos = 0;
445:io/mca25.c ****
446:io/mca25.c **** // grab actual image and tell cam to keep it in RAM
447:io/mca25.c **** // we acknowledge the _preview_ image and download
448:io/mca25.c **** // the full size image later...
449:io/mca25.c **** while (state != 100){
450:io/mca25.c ****
451:io/mca25.c **** if( ! mca25_read_mux_packet(mca25_buffer,0)){
452:io/mca25.c **** #if MCA25_DEBUG
453:io/mca25.c **** softuart_puts_progmem("TIMEOUT! (MUX4) / previewpic");
454:io/mca25.c **** softuart_put_uint8(i);
455:io/mca25.c **** softuart_putnewline();
456:io/mca25.c **** #endif
457:io/mca25.c ****
458:io/mca25.c **** //cam error, disable !
459:io/mca25.c **** mca25_ready = 0;
460:io/mca25.c **** MPF10_DISABLE();
461:io/mca25.c **** return 0; //read failed -> exit!;
462:io/mca25.c **** }
463:io/mca25.c ****
464:io/mca25.c **** //new version, thanks to jesper ;)
465:io/mca25.c **** //softuart_put_uint8(mca25_buffer[1]);
466:io/mca25.c **** if ((mca25_mux_buffer[0] == 0x83) && (mca25_mux_buffer[1] == 0xEF) ){ //data channel & UIH packe
467:io/mca25.c **** //softuart_put_uint16(skip_count);
468:io/mca25.c **** switch (state){
469:io/mca25.c **** case 0: //check how many bytes cam want to send
470:io/mca25.c **** skip_count = ((int)mca25_mux_buffer[4]<<8) + mca25_mux_buffer[5];
471:io/mca25.c ****
472:io/mca25.c **** if (skip_count > 3){
473:io/mca25.c **** //only handle data packets -> ignore packets smaller 3 bytes (=acks)
474:io/mca25.c **** skip_count -= ((mca25_mux_buffer[2])>>1);
475:io/mca25.c ****
476:io/mca25.c **** //last data packet ?!
477:io/mca25.c **** if (mca25_buffer[0] == 0xA0)
478:io/mca25.c **** state = 2;
479:io/mca25.c **** else
480:io/mca25.c **** state = 1;
481:io/mca25.c ****
482:io/mca25.c **** //estimate picture brightness by grabbing some bmp preview pixels
483:io/mca25.c **** ///mca25_estimate_brightness(mca25_buffer[28]);
484:io/mca25.c ****
485:io/mca25.c **** if (skip_count <= 0){
486:io/mca25.c **** //softuart_putc('.');
487:io/mca25.c **** mca25_send_data_ack();
488:io/mca25.c **** if (state == 2)
489:io/mca25.c **** state = 100;
490:io/mca25.c **** else
491:io/mca25.c **** state = 0;
492:io/mca25.c **** }
493:io/mca25.c **** }
494:io/mca25.c **** break;
495:io/mca25.c **** case 2:
496:io/mca25.c **** case 1:
497:io/mca25.c **** skip_count -= ((mca25_mux_buffer[2])>>1);
498:io/mca25.c ****
499:io/mca25.c **** //estimate picture brightness by grabbing some bmp preview pixels
500:io/mca25.c **** ///mca25_estimate_brightness(mca25_buffer[28]);
501:io/mca25.c ****
502:io/mca25.c **** if (skip_count <= 0){
503:io/mca25.c **** softuart_putc('.');
504:io/mca25.c **** mca25_send_data_ack();
505:io/mca25.c **** if (state == 2)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -