501
+        eosIsoSpeedMap.put(0x28, "6");
502
+        eosIsoSpeedMap.put(0x30, "12");
503
+        eosIsoSpeedMap.put(0x38, "25");
504
+        eosIsoSpeedMap.put(0x40, "50");
505
+        eosIsoSpeedMap.put(0x48, "100");
506
+        eosIsoSpeedMap.put(0x4b, "125");
507
+        eosIsoSpeedMap.put(0x4d, "160");
508
+        eosIsoSpeedMap.put(0x50, "200");
509
+        eosIsoSpeedMap.put(0x53, "250");
510
+        eosIsoSpeedMap.put(0x55, "320");
511
+        eosIsoSpeedMap.put(0x58, "400");
512
+        eosIsoSpeedMap.put(0x5b, "500");
513
+        eosIsoSpeedMap.put(0x5d, "640");
514
+        eosIsoSpeedMap.put(0x60, "800");
515
+        eosIsoSpeedMap.put(0x63, "1000");
516
+        eosIsoSpeedMap.put(0x65, "1250");
517
+        eosIsoSpeedMap.put(0x68, "1600");
518
+        eosIsoSpeedMap.put(0x6b, "2000");
519
+        eosIsoSpeedMap.put(0x6d, "2500");
520
+        eosIsoSpeedMap.put(0x70, "3200");
521
+        eosIsoSpeedMap.put(0x73, "4000");
522
+        eosIsoSpeedMap.put(0x75, "5000");
523
+        eosIsoSpeedMap.put(0x78, "6400");
524
+        eosIsoSpeedMap.put(0x80, "12800");
525
+        eosIsoSpeedMap.put(0x88, "25600");
526
+        eosIsoSpeedMap.put(0x90, "51200");
527
+        eosIsoSpeedMap.put(0x98, "102400");
528
+
529
+        eosWhitebalanceMap.put(0, "Auto");
530
+        eosWhitebalanceMap.put(1, "Daylight");
531
+        eosWhitebalanceMap.put(2, "Cloudy");
532
+        eosWhitebalanceMap.put(3, "Tungsten");
533
+        eosWhitebalanceMap.put(4, "Fluorescent");
534
+        eosWhitebalanceMap.put(5, "Flash");
535
+        eosWhitebalanceMap.put(6, "Manual 1");
536
+        eosWhitebalanceMap.put(8, "Shade");
537
+        eosWhitebalanceMap.put(9, "Color temperature");
538
+        eosWhitebalanceMap.put(10, "PC-1");
539
+        eosWhitebalanceMap.put(11, "PC-2");
540
+        eosWhitebalanceMap.put(12, "PC-3");
541
+        eosWhitebalanceMap.put(15, "Manual 2");
542
+        eosWhitebalanceMap.put(16, "Manual 3");
543
+        eosWhitebalanceMap.put(18, "Manual 4");
544
+        eosWhitebalanceMap.put(19, "Manual");
545
+        eosWhitebalanceMap.put(20, "PC-4");
546
+        eosWhitebalanceMap.put(21, "PC-5");
547
+
548
+//        eosWhitebalanceIconsMap.put(0, R.drawable.whitebalance_auto);
549
+//        eosWhitebalanceIconsMap.put(1, R.drawable.whitebalance_daylight);
550
+//        eosWhitebalanceIconsMap.put(2, R.drawable.whitebalance_cloudy);
551
+//        eosWhitebalanceIconsMap.put(3, R.drawable.whitebalance_tungsten);
552
+//        eosWhitebalanceIconsMap.put(4, R.drawable.whitebalance_fluorescent);
553
+//        eosWhitebalanceIconsMap.put(5, R.drawable.whitebalance_flash);
554
+//        eosWhitebalanceIconsMap.put(6, R.drawable.whitebalance_manual1);
555
+//        eosWhitebalanceIconsMap.put(8, R.drawable.whitebalance_shade);
556
+//        eosWhitebalanceIconsMap.put(9, R.drawable.whitebalance_color_temperature);
557
+//        eosWhitebalanceIconsMap.put(10, R.drawable.whitebalance_custom1);
558
+//        eosWhitebalanceIconsMap.put(11, R.drawable.whitebalance_custom2);
559
+//        eosWhitebalanceIconsMap.put(12, R.drawable.whitebalance_custom3);
560
+//        eosWhitebalanceIconsMap.put(15, R.drawable.whitebalance_manual2);
561
+//        eosWhitebalanceIconsMap.put(16, R.drawable.whitebalance_manual3);
562
+//        eosWhitebalanceIconsMap.put(18, R.drawable.whitebalance_manual4);
563
+//        eosWhitebalanceIconsMap.put(19, R.drawable.whitebalance_manual5);
564
+//        eosWhitebalanceIconsMap.put(20, R.drawable.whitebalance_custom4);
565
+//        eosWhitebalanceIconsMap.put(21, R.drawable.whitebalance_custom5);
566
+
567
+        eosShootingModeMap.put(0, "Program AE");
568
+        eosShootingModeMap.put(1, "Shutter-Speed Priority AE");
569
+        eosShootingModeMap.put(2, "Aperture Priority AE");
570
+        eosShootingModeMap.put(3, "Manual Exposure");
571
+        eosShootingModeMap.put(4, "Bulb");
572
+        eosShootingModeMap.put(5, "Auto Depth-of-Field AE");
573
+        eosShootingModeMap.put(6, "Depth-of-Field AE");
574
+        eosShootingModeMap.put(8, "Lock");
575
+        eosShootingModeMap.put(9, "Auto");
576
+        eosShootingModeMap.put(10, "Night Scene Portrait");
577
+        eosShootingModeMap.put(11, "Sports");
578
+        eosShootingModeMap.put(12, "Portrait");
579
+        eosShootingModeMap.put(13, "Landscape");
580
+        eosShootingModeMap.put(14, "Close-Up");
581
+        eosShootingModeMap.put(15, "Flash Off");
582
+        eosShootingModeMap.put(19, "Creative Auto");
583
+
584
+//        eosShootingModeIconsMap.put(0, R.drawable.shootingmode_program);
585
+//        eosShootingModeIconsMap.put(1, R.drawable.shootingmode_tv);
586
+//        eosShootingModeIconsMap.put(2, R.drawable.shootingmode_av);
587
+//        eosShootingModeIconsMap.put(3, R.drawable.shootingmode_m);
588
+//        eosShootingModeIconsMap.put(4, R.drawable.shootingmode_bulb);
589
+//        eosShootingModeIconsMap.put(5, R.drawable.shootingmode_adep);
590
+//        eosShootingModeIconsMap.put(6, R.drawable.shootingmode_dep);
591
+//        eosShootingModeIconsMap.put(8, R.drawable.shootingmode_lock);
592
+//        eosShootingModeIconsMap.put(9, R.drawable.shootingmode_auto);
593
+//        eosShootingModeIconsMap.put(10, R.drawable.shootingmode_night_scene_portrait);
594
+//        eosShootingModeIconsMap.put(11, R.drawable.shootingmode_sports);
595
+//        eosShootingModeIconsMap.put(12, R.drawable.shootingmode_portrait);
596
+//        eosShootingModeIconsMap.put(13, R.drawable.shootingmode_landscape);
597
+//        eosShootingModeIconsMap.put(14, R.drawable.shootingmode_close_up);
598
+//        eosShootingModeIconsMap.put(15, R.drawable.shootingmode_flash_off);
599
+//        eosShootingModeIconsMap.put(19, R.drawable.shootingmode_creativeauto);
600
+
601
+        eosDriveModeMap.put(0, "Single Shooting");
602
+        eosDriveModeMap.put(1, "Continuous Shooting");
603
+        eosDriveModeMap.put(2, "Video");
604
+        eosDriveModeMap.put(3, "?");
605
+        eosDriveModeMap.put(4, "High-Speed Continuous Shooting");
606
+        eosDriveModeMap.put(5, "Low-Speed Continuous Shooting");
607
+        eosDriveModeMap.put(6, "Silent Single Shooting");
608
+        eosDriveModeMap.put(7, "10-Sec Self-Timer plus Continuous Shooting");
609
+        eosDriveModeMap.put(0x10, "10-Sec Self-Timer");
610
+        eosDriveModeMap.put(0x11, "2-Sec Self-Timer");
611
+
612
+        // TODO easDriveModeIconsmap
613
+
614
+        eosFocusModeMap.put(0, "One-Shot AF");
615
+        eosFocusModeMap.put(1, "AI Servo AF");
616
+        eosFocusModeMap.put(2, "AI Focus AF");
617
+        eosFocusModeMap.put(3, "Manual Focus");
618
+
619
+        nikonWhitebalanceMap.put(2, "Auto");
620
+        nikonWhitebalanceMap.put(4, "Sunny");
621
+        nikonWhitebalanceMap.put(5, "Fluorescent");
622
+        nikonWhitebalanceMap.put(6, "Incandescent");
623
+        nikonWhitebalanceMap.put(7, "Flash");
624
+        nikonWhitebalanceMap.put(0x8010, "Cloudy");
625
+        nikonWhitebalanceMap.put(0x8011, "Sunny shade");
626
+        nikonWhitebalanceMap.put(0x8012, "Color temperature");
627
+        nikonWhitebalanceMap.put(0x8013, "Preset");
628
+
629
+//        nikonWhitebalanceIconsMap.put(2, R.drawable.whitebalance_auto);
630
+//        nikonWhitebalanceIconsMap.put(4, R.drawable.whitebalance_daylight);
631
+//        nikonWhitebalanceIconsMap.put(5, R.drawable.whitebalance_fluorescent);
632
+//        nikonWhitebalanceIconsMap.put(6, R.drawable.whitebalance_tungsten);
633
+//        nikonWhitebalanceIconsMap.put(7, R.drawable.whitebalance_flash);
634
+//        nikonWhitebalanceIconsMap.put(0x8010, R.drawable.whitebalance_cloudy);
635
+//        nikonWhitebalanceIconsMap.put(0x8011, R.drawable.whitebalance_shade);
636
+//        nikonWhitebalanceIconsMap.put(0x8012, R.drawable.whitebalance_color_temperature);
637
+//        nikonWhitebalanceIconsMap.put(0x8013, R.drawable.whitebalance_custom1); // TODO create Nikon specific icon
638
+
639
+        nikonExposureIndexMap.put(0x0064, "100");
640
+        nikonExposureIndexMap.put(0x007D, "125");
641
+        nikonExposureIndexMap.put(0x00A0, "160");
642
+        nikonExposureIndexMap.put(0x00C8, "200");
643
+        nikonExposureIndexMap.put(0x00FA, "250");
644
+        nikonExposureIndexMap.put(0x0118, "280");
645
+        nikonExposureIndexMap.put(0x0140, "320");
646
+        nikonExposureIndexMap.put(0x0190, "400");
647
+        nikonExposureIndexMap.put(0x01F4, "500");
648
+        nikonExposureIndexMap.put(0x0230, "560");
649
+        nikonExposureIndexMap.put(0x0280, "640");
650
+        nikonExposureIndexMap.put(0x0320, "800");
651
+        nikonExposureIndexMap.put(0x03E8, "1000");
652
+        nikonExposureIndexMap.put(0x044C, "1100");
653
+        nikonExposureIndexMap.put(0x04E2, "1250");
654
+        nikonExposureIndexMap.put(0x0640, "1600");
655
+        nikonExposureIndexMap.put(0x07D0, "2000");
656
+        nikonExposureIndexMap.put(0x0898, "2200");
657
+        nikonExposureIndexMap.put(0x09C4, "2500");
658
+        nikonExposureIndexMap.put(0x0C80, "3200");
659
+        nikonExposureIndexMap.put(0x0FA0, "4000");
660
+        nikonExposureIndexMap.put(0x1194, "4500");
661
+        nikonExposureIndexMap.put(0x1388, "5000");
662
+        nikonExposureIndexMap.put(0x1900, "6400");
663
+        nikonExposureIndexMap.put(0x1F40, "8000");
664
+        nikonExposureIndexMap.put(0x2328, "9000");
665
+        nikonExposureIndexMap.put(0x2710, "10000");
666
+        nikonExposureIndexMap.put(0x3200, "12800");
667
+
668
+//        nikonExposureProgramMap.put(0x0001, R.drawable.shootingmode_m);
669
+//        nikonExposureProgramMap.put(0x0002, R.drawable.shootingmode_program);
670
+//        nikonExposureProgramMap.put(0x0003, R.drawable.shootingmode_av);
671
+//        nikonExposureProgramMap.put(0x0004, R.drawable.shootingmode_tv);
672
+//        nikonExposureProgramMap.put(0x8010, R.drawable.shootingmode_auto);
673
+//        nikonExposureProgramMap.put(0x8011, R.drawable.shootingmode_portrait);
674
+//        nikonExposureProgramMap.put(0x8012, R.drawable.shootingmode_landscape);
675
+//        nikonExposureProgramMap.put(0x8013, R.drawable.shootingmode_close_up);
676
+//        nikonExposureProgramMap.put(0x8014, R.drawable.shootingmode_sports);
677
+//        nikonExposureProgramMap.put(0x8015, R.drawable.shootingmode_night_scene_portrait);
678
+//        nikonExposureProgramMap.put(0x8016, R.drawable.shootingmode_flash_off);
679
+//        nikonExposureProgramMap.put(0x8017, R.drawable.shootingmode_unknown); // TODO Child
680
+//        nikonExposureProgramMap.put(0x8018, R.drawable.shootingmode_unknown); // TODO SCENE
681
+//        nikonExposureProgramMap.put(0x8050, R.drawable.shootingmode_unknown); // TODO User mode U1
682
+//        nikonExposureProgramMap.put(0x8051, R.drawable.shootingmode_unknown); // TODO User mode U2
683
+
684
+        nikonWbColorTempD300SMap.put(0, "2500K");
685
+        nikonWbColorTempD300SMap.put(1, "2560K");
686
+        nikonWbColorTempD300SMap.put(2, "2630K");
687
+        nikonWbColorTempD300SMap.put(3, "2700K");
688
+        nikonWbColorTempD300SMap.put(4, "2780K");
689
+        nikonWbColorTempD300SMap.put(5, "2860K");
690
+        nikonWbColorTempD300SMap.put(6, "2940K");
691
+        nikonWbColorTempD300SMap.put(7, "3030K");
692
+        nikonWbColorTempD300SMap.put(8, "3130K");
693
+        nikonWbColorTempD300SMap.put(9, "3230K");
694
+        nikonWbColorTempD300SMap.put(10, "3330K");
695
+        nikonWbColorTempD300SMap.put(11, "3450K");
696
+        nikonWbColorTempD300SMap.put(12, "3570K");
697
+        nikonWbColorTempD300SMap.put(13, "3700K");
698
+        nikonWbColorTempD300SMap.put(14, "3850K");
699
+        nikonWbColorTempD300SMap.put(15, "4000K");
700
+        nikonWbColorTempD300SMap.put(16, "4170K");
701
+        nikonWbColorTempD300SMap.put(17, "4350K");
702
+        nikonWbColorTempD300SMap.put(18, "4550K");
703
+        nikonWbColorTempD300SMap.put(19, "4760K");
704
+        nikonWbColorTempD300SMap.put(20, "5000K");
705
+        nikonWbColorTempD300SMap.put(21, "5260K");
706
+        nikonWbColorTempD300SMap.put(22, "5560K");
707
+        nikonWbColorTempD300SMap.put(23, "5880K");
708
+        nikonWbColorTempD300SMap.put(24, "6250K");
709
+        nikonWbColorTempD300SMap.put(25, "6670K");
710
+        nikonWbColorTempD300SMap.put(26, "7140K");
711
+        nikonWbColorTempD300SMap.put(27, "7690K");
712
+        nikonWbColorTempD300SMap.put(28, "8330K");
713
+        nikonWbColorTempD300SMap.put(29, "9090K");
714
+        nikonWbColorTempD300SMap.put(30, "10000K");
715
+
716
+        nikonWbColorTempD200Map.put(0, "2500K");
717
+        nikonWbColorTempD200Map.put(1, "2550K");
718
+        nikonWbColorTempD200Map.put(2, "2650K");
719
+        nikonWbColorTempD200Map.put(3, "2700K");
720
+        nikonWbColorTempD200Map.put(4, "2800K");
721
+        nikonWbColorTempD200Map.put(5, "2850K");
722
+        nikonWbColorTempD200Map.put(6, "2950K");
723
+        nikonWbColorTempD200Map.put(7, "3000K");
724
+        nikonWbColorTempD200Map.put(8, "3100K");
725
+        nikonWbColorTempD200Map.put(9, "3200K");
726
+        nikonWbColorTempD200Map.put(10, "3300K");
727
+        nikonWbColorTempD200Map.put(11, "3400K");
728
+        nikonWbColorTempD200Map.put(12, "3600K");
729
+        nikonWbColorTempD200Map.put(13, "3700K");
730
+        nikonWbColorTempD200Map.put(14, "3800K");
731
+        nikonWbColorTempD200Map.put(15, "4000K");
732
+        nikonWbColorTempD200Map.put(16, "4200K");
733
+        nikonWbColorTempD200Map.put(17, "4300K");
734
+        nikonWbColorTempD200Map.put(18, "4500K");
735
+        nikonWbColorTempD200Map.put(19, "4800K");
736
+        nikonWbColorTempD200Map.put(20, "5000K");
737
+        nikonWbColorTempD200Map.put(21, "5300K");
738
+        nikonWbColorTempD200Map.put(22, "5600K");
739
+        nikonWbColorTempD200Map.put(23, "5900K");
740
+        nikonWbColorTempD200Map.put(24, "6300K");
741
+        nikonWbColorTempD200Map.put(25, "6700K");
742
+        nikonWbColorTempD200Map.put(26, "7100K");
743
+        nikonWbColorTempD200Map.put(27, "7700K");
744
+        nikonWbColorTempD200Map.put(28, "8300K");
745
+        nikonWbColorTempD200Map.put(29, "9100K");
746
+        nikonWbColorTempD200Map.put(30, "10000K");
747
+
748
+        nikonFocusModeMap.put(0x0001, "Manual Focus");
749
+        nikonFocusModeMap.put(0x8010, "Single AF servo");
750
+        nikonFocusModeMap.put(0x8011, "Continous AF servo");
751
+        nikonFocusModeMap.put(0x8012, "AF servo auto switch");
752
+        nikonFocusModeMap.put(0x8013, "Constant AF servo");
753
+
754
+        nikonActivePicCtrlItemMap.put(1, "SD");
755
+        nikonActivePicCtrlItemMap.put(2, "NL");
756
+        nikonActivePicCtrlItemMap.put(3, "VI");
757
+        nikonActivePicCtrlItemMap.put(4, "MC");
758
+        nikonActivePicCtrlItemMap.put(5, "PT");
759
+        nikonActivePicCtrlItemMap.put(6, "LS");
760
+        nikonActivePicCtrlItemMap.put(101, "O-1");
761
+        nikonActivePicCtrlItemMap.put(102, "O-2");
762
+        nikonActivePicCtrlItemMap.put(103, "O-3");
763
+        nikonActivePicCtrlItemMap.put(104, "O-4");
764
+        nikonActivePicCtrlItemMap.put(201, "C-1");
765
+        nikonActivePicCtrlItemMap.put(202, "C-2");
766
+        nikonActivePicCtrlItemMap.put(203, "C-3");
767
+        nikonActivePicCtrlItemMap.put(204, "C-4");
768
+        nikonActivePicCtrlItemMap.put(205, "C-5");
769
+        nikonActivePicCtrlItemMap.put(206, "C-6");
770
+        nikonActivePicCtrlItemMap.put(207, "C-7");
771
+        nikonActivePicCtrlItemMap.put(208, "C-8");
772
+        nikonActivePicCtrlItemMap.put(209, "C-9");
773
+
774
+//        nikonMeteringModeMap.put(2, R.drawable.metering_exposure_center_weighted_nikon);
775
+//        nikonMeteringModeMap.put(3, R.drawable.metering_exposure_matrix_nikon);
776
+//        nikonMeteringModeMap.put(4, R.drawable.metering_exposure_spot);
777
+//
778
+//        eosMeteringModeIconsMap.put(1, R.drawable.metering_exposure_spot);
779
+//        eosMeteringModeIconsMap.put(3, R.drawable.metering_exposure_evaluative_canon);
780
+//        eosMeteringModeIconsMap.put(4, R.drawable.metering_exposure_partial);
781
+//        eosMeteringModeIconsMap.put(5, R.drawable.metering_exposure_center_weighted_average_canon);
782
+
783
+        nikonFocusMeteringModeMap.put(0x0002, "Dynamic");
784
+        nikonFocusMeteringModeMap.put(0x8010, "Single point");
785
+        nikonFocusMeteringModeMap.put(0x8011, "Auto area");
786
+        nikonFocusMeteringModeMap.put(0x8012, "3D");
787
+
788
+//        nikonFocusMeteringModeIconsMap.put(0x0002, R.drawable.metering_af_dynamic_area);
789
+//        nikonFocusMeteringModeIconsMap.put(0x8010, R.drawable.metering_af_single_point);
790
+//        nikonFocusMeteringModeIconsMap.put(0x8011, R.drawable.metering_af_auto_area);
791
+//        nikonFocusMeteringModeIconsMap.put(0x8012, R.drawable.metering_af_3d_tracking);
792
+
793
+        eosPictureStyleMap.put(0x81, "ST");
794
+        eosPictureStyleMap.put(0x82, "PT");
795
+        eosPictureStyleMap.put(0x83, "LS");
796
+        eosPictureStyleMap.put(0x84, "NL");
797
+        eosPictureStyleMap.put(0x85, "FL");
798
+        eosPictureStyleMap.put(0x86, "MO");
799
+        eosPictureStyleMap.put(0x21, "UD1");
800
+        eosPictureStyleMap.put(0x22, "UD2");
801
+        eosPictureStyleMap.put(0x23, "UD3");
802
+    }
803
+}

+ 47 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/PtpService.java

@@ -0,0 +1,47 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp;
17
+
18
+import com.remoteyourcam.usb.ptp.Camera.CameraListener;
19
+
20
+import android.content.Context;
21
+import android.content.Intent;
22
+
23
+public interface PtpService {
24
+
25
+    void setCameraListener(CameraListener listener);
26
+
27
+    void initialize(Context context, Intent intent);
28
+
29
+    void shutdown();
30
+
31
+    void lazyShutdown();
32
+
33
+    public static class Singleton {
34
+        private static PtpService singleton;
35
+
36
+        public static PtpService getInstance(Context context) {
37
+            if (singleton == null) {
38
+                singleton = new PtpUsbService(context);
39
+            }
40
+            return singleton;
41
+        }
42
+
43
+        public static void setInstance(PtpService service) {
44
+            singleton = service;
45
+        }
46
+    }
47
+}

+ 76 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/PtpUsbConnection.java

@@ -0,0 +1,76 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp;
17
+
18
+import android.hardware.usb.UsbDeviceConnection;
19
+import android.hardware.usb.UsbEndpoint;
20
+import android.hardware.usb.UsbRequest;
21
+
22
+public class PtpUsbConnection {
23
+
24
+    private final UsbDeviceConnection connection;
25
+    private final UsbEndpoint bulkOut;
26
+    private final UsbEndpoint bulkIn;
27
+    private final int vendorId;
28
+    private final int productId;
29
+
30
+    public PtpUsbConnection(UsbDeviceConnection connection, UsbEndpoint bulkIn, UsbEndpoint bulkOut, int vendorId,
31
+            int productId) {
32
+        this.connection = connection;
33
+        this.bulkIn = bulkIn;
34
+        this.bulkOut = bulkOut;
35
+        this.vendorId = vendorId;
36
+        this.productId = productId;
37
+    }
38
+
39
+    public int getVendorId() {
40
+        return vendorId;
41
+    }
42
+
43
+    public int getProductId() {
44
+        return productId;
45
+    }
46
+
47
+    public void close() {
48
+        connection.close();
49
+    }
50
+
51
+    public int getMaxPacketInSize() {
52
+        return bulkIn.getMaxPacketSize();
53
+    }
54
+
55
+    public int getMaxPacketOutSize() {
56
+        return bulkOut.getMaxPacketSize();
57
+    }
58
+
59
+    public UsbRequest createInRequest() {
60
+        UsbRequest r = new UsbRequest();
61
+        r.initialize(connection, bulkIn);
62
+        return r;
63
+    }
64
+
65
+    public int bulkTransferOut(byte[] buffer, int length, int timeout) {
66
+        return connection.bulkTransfer(bulkOut, buffer, length, timeout);
67
+    }
68
+
69
+    public int bulkTransferIn(byte[] buffer, int maxLength, int timeout) {
70
+        return connection.bulkTransfer(bulkIn, buffer, maxLength, timeout);
71
+    }
72
+
73
+    public void requestWait() {
74
+        connection.requestWait();
75
+    }
76
+}

+ 234 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/PtpUsbService.java

@@ -0,0 +1,234 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp;
17
+
18
+import java.util.Map;
19
+
20
+import android.app.PendingIntent;
21
+import android.content.BroadcastReceiver;
22
+import android.content.Context;
23
+import android.content.Intent;
24
+import android.content.IntentFilter;
25
+import android.hardware.usb.UsbConstants;
26
+import android.hardware.usb.UsbDevice;
27
+import android.hardware.usb.UsbEndpoint;
28
+import android.hardware.usb.UsbInterface;
29
+import android.hardware.usb.UsbManager;
30
+import android.os.Handler;
31
+import android.util.Log;
32
+
33
+import com.remoteyourcam.usb.AppConfig;
34
+import com.remoteyourcam.usb.ptp.Camera.CameraListener;
35
+import com.remoteyourcam.usb.ptp.PtpCamera.State;
36
+
37
+public class PtpUsbService implements PtpService {
38
+
39
+    private final String TAG = PtpUsbService.class.getSimpleName();
40
+
41
+    private static final String ACTION_USB_PERMISSION = "com.android.example.USB_PERMISSION";
42
+    private final BroadcastReceiver permissonReceiver = new BroadcastReceiver() {
43
+        @Override
44
+        public void onReceive(Context context, Intent intent) {
45
+            String action = intent.getAction();
46
+            if (ACTION_USB_PERMISSION.equals(action)) {
47
+                unregisterPermissionReceiver(context);
48
+                synchronized (this) {
49
+                    UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
50
+
51
+                    if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
52
+                        connect(context, device);
53
+                    } else {
54
+                        //TODO report
55
+                    }
56
+                }
57
+            }
58
+        }
59
+    };
60
+
61
+    private final Handler handler = new Handler();
62
+    private final UsbManager usbManager;
63
+    private PtpCamera camera;
64
+    private CameraListener listener;
65
+
66
+    Runnable shutdownRunnable = new Runnable() {
67
+        @Override
68
+        public void run() {
69
+            shutdown();
70
+        }
71
+    };
72
+
73
+    public PtpUsbService(Context context) {
74
+        this.usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE);
75
+    }
76
+
77
+    @Override
78
+    public void setCameraListener(CameraListener listener) {
79
+        this.listener = listener;
80
+        if (camera != null) {
81
+            camera.setListener(listener);
82
+        }
83
+    }
84
+
85
+    @Override
86
+    public void initialize(Context context, Intent intent) {
87
+        handler.removeCallbacks(shutdownRunnable);
88
+        if (camera != null) {
89
+            if (AppConfig.LOG) {
90
+                Log.i(TAG, "initialize: camera available");
91
+                listener.onLogMessage("有可用相机,初始化中");
92
+            }
93
+            if (camera.getState() == State.Active) {
94
+                if (listener != null) {
95
+                    listener.onCameraStarted(camera);
96
+                }
97
+                return;
98
+            }
99
+            if (AppConfig.LOG) {
100
+                Log.i(TAG, "initialize: camera not active, satet " + camera.getState());
101
+            }
102
+            camera.shutdownHard();
103
+        }
104
+        UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
105
+        if (device != null) {
106
+            if (AppConfig.LOG) {
107
+                Log.i(TAG, "initialize: got device through intent");
108
+                listener.onLogMessage("发现可用相机设备"+device.getDeviceName());
109
+            }
110
+            connect(context, device);
111
+        } else {
112
+            if (AppConfig.LOG) {
113
+                Log.i(TAG, "initialize: looking for compatible camera");
114
+                listener.onLogMessage("查找相机设备...");
115
+            }
116
+            device = lookupCompatibleDevice(usbManager);
117
+            if (device != null) {
118
+                listener.onLogMessage("查找到相机设备"+device.getDeviceName());
119
+                registerPermissionReceiver(context);
120
+                PendingIntent mPermissionIntent = PendingIntent.getBroadcast(context, 0, new Intent(
121
+                        ACTION_USB_PERMISSION), 0);
122
+                usbManager.requestPermission(device, mPermissionIntent);
123
+            } else {
124
+                listener.onNoCameraFound();
125
+            }
126
+        }
127
+    }
128
+
129
+    @Override
130
+    public void shutdown() {
131
+        if (AppConfig.LOG) {
132
+            Log.i(TAG, "shutdown");
133
+            listener.onLogMessage("关闭设备");
134
+        }
135
+        if (camera != null) {
136
+            camera.shutdown();
137
+            camera = null;
138
+        }
139
+    }
140
+
141
+    @Override
142
+    public void lazyShutdown() {
143
+        if (AppConfig.LOG) {
144
+            Log.i(TAG, "lazy shutdown");
145
+        }
146
+        handler.postDelayed(shutdownRunnable, 4000);
147
+    }
148
+
149
+    private void registerPermissionReceiver(Context context) {
150
+        if (AppConfig.LOG) {
151
+            Log.i(TAG, "register permission receiver");
152
+        }
153
+        IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
154
+        context.registerReceiver(permissonReceiver, filter);
155
+    }
156
+
157
+    private void unregisterPermissionReceiver(Context context) {
158
+        if (AppConfig.LOG) {
159
+            Log.i(TAG, "unregister permission receiver");
160
+        }
161
+        context.unregisterReceiver(permissonReceiver);
162
+    }
163
+
164
+    private UsbDevice lookupCompatibleDevice(UsbManager manager) {
165
+        Map<String, UsbDevice> deviceList = manager.getDeviceList();
166
+        for (Map.Entry<String, UsbDevice> e : deviceList.entrySet()) {
167
+            UsbDevice d = e.getValue();
168
+            if (d.getVendorId() == PtpConstants.CanonVendorId || d.getVendorId() == PtpConstants.NikonVendorId) {
169
+                return d;
170
+            }
171
+        }
172
+        return null;
173
+    }
174
+
175
+    private boolean connect(Context context, UsbDevice device) {
176
+        if (camera != null) {
177
+            camera.shutdown();
178
+            camera = null;
179
+        }
180
+        for (int i = 0, n = device.getInterfaceCount(); i < n; ++i) {
181
+            UsbInterface intf = device.getInterface(i);
182
+
183
+            if (intf.getEndpointCount() != 3) {
184
+                continue;
185
+            }
186
+
187
+            UsbEndpoint in = null;
188
+            UsbEndpoint out = null;
189
+
190
+            for (int e = 0, en = intf.getEndpointCount(); e < en; ++e) {
191
+                UsbEndpoint endpoint = intf.getEndpoint(e);
192
+                if (endpoint.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
193
+                    if (endpoint.getDirection() == UsbConstants.USB_DIR_IN) {
194
+                        in = endpoint;
195
+                    } else if (endpoint.getDirection() == UsbConstants.USB_DIR_OUT) {
196
+                        out = endpoint;
197
+                    }
198
+                }
199
+            }
200
+
201
+            if (in == null || out == null) {
202
+                continue;
203
+            }
204
+
205
+            if (AppConfig.LOG) {
206
+                Log.i(TAG, "Found compatible USB interface");
207
+                Log.i(TAG, "Interface class " + intf.getInterfaceClass());
208
+                Log.i(TAG, "Interface subclass " + intf.getInterfaceSubclass());
209
+                Log.i(TAG, "Interface protocol " + intf.getInterfaceProtocol());
210
+                Log.i(TAG, "Bulk out max size " + out.getMaxPacketSize());
211
+                Log.i(TAG, "Bulk in max size " + in.getMaxPacketSize());
212
+                listener.onLogMessage("发现兼容的USB接口设备 "+ device.getDeviceName() +" "+  device.getVendorId());
213
+            }
214
+
215
+            if (device.getVendorId() == PtpConstants.CanonVendorId) {
216
+                PtpUsbConnection connection = new PtpUsbConnection(usbManager.openDevice(device), in, out,
217
+                        device.getVendorId(), device.getProductId());
218
+                camera = new EosCamera(connection, listener, new WorkerNotifier(context));
219
+            } else if (device.getVendorId() == PtpConstants.NikonVendorId) {
220
+                PtpUsbConnection connection = new PtpUsbConnection(usbManager.openDevice(device), in, out,
221
+                        device.getVendorId(), device.getProductId());
222
+                camera = new NikonCamera(connection, listener, new WorkerNotifier(context));
223
+            }
224
+
225
+            return true;
226
+        }
227
+
228
+        if (listener != null) {
229
+            listener.onError("No compatible camera found");
230
+        }
231
+
232
+        return false;
233
+    }
234
+}

+ 34 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/WorkerNotifier.java

@@ -0,0 +1,34 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp;
17
+
18
+import android.content.Context;
19
+
20
+public class WorkerNotifier implements Camera.WorkerListener {
21
+
22
+
23
+    public WorkerNotifier(Context context) {
24
+    }
25
+
26
+    @Override
27
+    public void onWorkerStarted() {
28
+    }
29
+
30
+    @Override
31
+    public void onWorkerEnded() {
32
+    }
33
+
34
+}

+ 61 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/CloseSessionCommand.java

@@ -0,0 +1,61 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.AppConfig;
21
+import com.remoteyourcam.usb.ptp.PtpCamera;
22
+import com.remoteyourcam.usb.ptp.PtpConstants;
23
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
24
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
25
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
26
+
27
+import android.util.Log;
28
+
29
+public class CloseSessionCommand extends Command {
30
+
31
+    private final String TAG = CloseSessionCommand.class.getSimpleName();
32
+
33
+    public CloseSessionCommand(PtpCamera camera) {
34
+        super(camera);
35
+    }
36
+
37
+    @Override
38
+    public void exec(IO io) {
39
+        io.handleCommand(this);
40
+        // Can this even happen?
41
+        if (responseCode == Response.DeviceBusy) {
42
+            camera.onDeviceBusy(this, true);
43
+            return;
44
+        }
45
+        // close even when error happened
46
+        camera.onSessionClosed();
47
+        if (responseCode != Response.Ok) {
48
+            // TODO error report
49
+            if (AppConfig.LOG) {
50
+                Log.w(TAG,
51
+                        String.format("Error response when closing session, response %s",
52
+                                PtpConstants.responseToString(responseCode)));
53
+            }
54
+        }
55
+    }
56
+
57
+    @Override
58
+    public void encodeCommand(ByteBuffer b) {
59
+        encodeCommand(b, Operation.CloseSession);
60
+    }
61
+}

+ 188 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/Command.java

@@ -0,0 +1,188 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import android.util.Log;
19
+
20
+import com.remoteyourcam.usb.AppConfig;
21
+import com.remoteyourcam.usb.ptp.PacketUtil;
22
+import com.remoteyourcam.usb.ptp.PtpAction;
23
+import com.remoteyourcam.usb.ptp.PtpCamera;
24
+import com.remoteyourcam.usb.ptp.PtpConstants;
25
+import com.remoteyourcam.usb.ptp.PtpConstants.Type;
26
+
27
+import java.nio.ByteBuffer;
28
+
29
+/**
30
+ * Base class for all PTP commands.
31
+ */
32
+public abstract class Command implements PtpAction {
33
+
34
+    private static final String TAG = "Command";
35
+
36
+    protected final PtpCamera camera;
37
+
38
+    /**
39
+     * Deriving classes have to set this field to true if they want to send data
40
+     * from host to camera.
41
+     */
42
+    protected boolean hasDataToSend;
43
+
44
+    /**
45
+     * Received response code, should be handled in
46
+     * {@link #exec(com.remoteyourcam.usb.ptp.PtpCamera.IO)}.
47
+     */
48
+    protected int responseCode;
49
+
50
+    private boolean hasResponseReceived;
51
+
52
+    public Command(PtpCamera camera) {
53
+        this.camera = camera;
54
+    }
55
+
56
+    @Override
57
+    public abstract void exec(PtpCamera.IO io);
58
+
59
+    public abstract void encodeCommand(ByteBuffer b);
60
+
61
+    /**
62
+     * Derived classes should implement this method if they want to send data
63
+     * from host to camera. The field {@code hasDataToSend} has to be set to
64
+     * true for the sending to be done. The data to send must not be greater
65
+     * than the USB max packet size, any size below 256 should be save.
66
+     */
67
+    public void encodeData(ByteBuffer b) {
68
+    }
69
+
70
+    /**
71
+     * Derived classes should implement this method if they want to decode data
72
+     * received in an data packet that has been sent by the camera. The
73
+     * {@code ByteBuffer} already points to the first byte behind the
74
+     * transaction id, i.e. the payload.
75
+     */
76
+    protected void decodeData(ByteBuffer b, int length) {
77
+        if (AppConfig.LOG) {
78
+            Log.w(TAG, "Received data packet but handler not implemented");
79
+        }
80
+    }
81
+
82
+    /**
83
+     * Override if any special response data has to be decoded. The
84
+     * {@code ByteBuffer} already points to the first byte behind the
85
+     * transaction id, i.e. the payload.
86
+     */
87
+    protected void decodeResponse(ByteBuffer b, int length) {
88
+    }
89
+
90
+    public boolean hasDataToSend() {
91
+        return hasDataToSend;
92
+    }
93
+
94
+    public boolean hasResponseReceived() {
95
+        return hasResponseReceived;
96
+    }
97
+
98
+    public int getResponseCode() {
99
+        return responseCode;
100
+    }
101
+
102
+    public void receivedRead(ByteBuffer b) {
103
+        int length = b.getInt();
104
+        int type = b.getShort() & 0xFFFF;
105
+        int code = b.getShort() & 0xFFFF;
106
+        int tx = b.getInt();
107
+
108
+        if (AppConfig.LOG) {
109
+            Log.i(TAG,
110
+                    String.format("Received %s packet for %s, length %d, code %s, tx %d",
111
+                            PtpConstants.typeToString(type), getClass().getSimpleName(), length,
112
+                            PtpConstants.codeToString(type, code), tx));
113
+        }
114
+        if (AppConfig.LOG_PACKETS) {
115
+            PacketUtil.logHexdump(TAG, b.array(), length < 512 ? length : 512);
116
+        }
117
+
118
+        if (type == Type.Data) {
119
+            decodeData(b, length);
120
+        } else if (type == Type.Response) {
121
+            hasResponseReceived = true;
122
+            responseCode = code;
123
+            decodeResponse(b, length);
124
+        } else {
125
+            // error
126
+            hasResponseReceived = true;
127
+        }
128
+    }
129
+
130
+    /**
131
+     * Reset fields so this command may be requeued.
132
+     */
133
+    @Override
134
+    public void reset() {
135
+        responseCode = 0;
136
+        hasResponseReceived = false;
137
+    }
138
+
139
+    protected void encodeCommand(ByteBuffer b, int code) {
140
+        b.putInt(12);
141
+        b.putShort((short) Type.Command);
142
+        b.putShort((short) code);
143
+        b.putInt(camera.nextTransactionId());
144
+        if (AppConfig.LOG_PACKETS) {
145
+            Log.i(TAG, "command packet for " + getClass().getSimpleName());
146
+            PacketUtil.logHexdump(TAG, b.array(), 12);
147
+        }
148
+    }
149
+
150
+    protected void encodeCommand(ByteBuffer b, int code, int p0) {
151
+        b.putInt(16);
152
+        b.putShort((short) Type.Command);
153
+        b.putShort((short) code);
154
+        b.putInt(camera.nextTransactionId());
155
+        b.putInt(p0);
156
+        if (AppConfig.LOG_PACKETS) {
157
+            Log.i(TAG, "command packet for " + getClass().getSimpleName());
158
+            PacketUtil.logHexdump(TAG, b.array(), 16);
159
+        }
160
+    }
161
+
162
+    protected void encodeCommand(ByteBuffer b, int code, int p0, int p1) {
163
+        b.putInt(20);
164
+        b.putShort((short) Type.Command);
165
+        b.putShort((short) code);
166
+        b.putInt(camera.nextTransactionId());
167
+        b.putInt(p0);
168
+        b.putInt(p1);
169
+        if (AppConfig.LOG_PACKETS) {
170
+            Log.i(TAG, "command packet for " + getClass().getSimpleName());
171
+            PacketUtil.logHexdump(TAG, b.array(), 20);
172
+        }
173
+    }
174
+
175
+    protected void encodeCommand(ByteBuffer b, int code, int p0, int p1, int p2) {
176
+        b.putInt(24);
177
+        b.putShort((short) Type.Command);
178
+        b.putShort((short) code);
179
+        b.putInt(camera.nextTransactionId());
180
+        b.putInt(p0);
181
+        b.putInt(p1);
182
+        b.putInt(p2);
183
+        if (AppConfig.LOG_PACKETS) {
184
+            Log.i(TAG, "command packet for " + getClass().getSimpleName());
185
+            PacketUtil.logHexdump(TAG, b.array(), 24);
186
+        }
187
+    }
188
+}

+ 62 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/GetDeviceInfoCommand.java

@@ -0,0 +1,62 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.PtpCamera;
21
+import com.remoteyourcam.usb.ptp.PtpConstants;
22
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
24
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
25
+import com.remoteyourcam.usb.ptp.model.DeviceInfo;
26
+
27
+public class GetDeviceInfoCommand extends Command {
28
+
29
+    private DeviceInfo info;
30
+
31
+    public GetDeviceInfoCommand(PtpCamera camera) {
32
+        super(camera);
33
+    }
34
+
35
+    @Override
36
+    public void exec(IO io) {
37
+        io.handleCommand(this);
38
+        if (responseCode != Response.Ok) {
39
+            camera.onPtpError(String.format("Couldn't read device information, error code \"%s\"",
40
+                    PtpConstants.responseToString(responseCode)));
41
+        } else if (info == null) {
42
+            camera.onPtpError("Couldn't retrieve device information");
43
+        }
44
+    }
45
+
46
+    @Override
47
+    public void reset() {
48
+        super.reset();
49
+        info = null;
50
+    }
51
+
52
+    @Override
53
+    public void encodeCommand(ByteBuffer b) {
54
+        encodeCommand(b, Operation.GetDeviceInfo);
55
+    }
56
+
57
+    @Override
58
+    protected void decodeData(ByteBuffer b, int length) {
59
+        info = new DeviceInfo(b, length);
60
+        camera.setDeviceInfo(info);
61
+    }
62
+}

+ 57 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/GetDevicePropDescCommand.java

@@ -0,0 +1,57 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.PtpCamera;
21
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
22
+import com.remoteyourcam.usb.ptp.PtpConstants;
23
+import com.remoteyourcam.usb.ptp.model.DevicePropDesc;
24
+
25
+public class GetDevicePropDescCommand extends Command {
26
+
27
+    private final int property;
28
+    private DevicePropDesc devicePropDesc;
29
+
30
+    public GetDevicePropDescCommand(PtpCamera camera, int property) {
31
+        super(camera);
32
+        this.property = property;
33
+    }
34
+
35
+    @Override
36
+    public void exec(IO io) {
37
+        io.handleCommand(this);
38
+        if (responseCode == PtpConstants.Response.DeviceBusy) {
39
+            camera.onDeviceBusy(this, true);
40
+        }
41
+        if (devicePropDesc != null) {
42
+            // this order is important
43
+            camera.onPropertyDescChanged(property, devicePropDesc);
44
+            camera.onPropertyChanged(property, devicePropDesc.currentValue);
45
+        }
46
+    }
47
+
48
+    @Override
49
+    public void encodeCommand(ByteBuffer b) {
50
+        encodeCommand(b, PtpConstants.Operation.GetDevicePropDesc, property);
51
+    }
52
+
53
+    @Override
54
+    protected void decodeData(ByteBuffer b, int length) {
55
+        devicePropDesc = new DevicePropDesc(b, length);
56
+    }
57
+}

+ 68 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/GetDevicePropValueCommand.java

@@ -0,0 +1,68 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.PtpCamera;
21
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
22
+import com.remoteyourcam.usb.ptp.PtpConstants;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Datatype;
24
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
25
+
26
+public class GetDevicePropValueCommand extends Command {
27
+
28
+    private final int property;
29
+    private final int datatype;
30
+    private int value;
31
+
32
+    public GetDevicePropValueCommand(PtpCamera camera, int property, int datatype) {
33
+        super(camera);
34
+        this.property = property;
35
+        this.datatype = datatype;
36
+    }
37
+
38
+    @Override
39
+    public void exec(IO io) {
40
+        io.handleCommand(this);
41
+        if (responseCode == Response.DeviceBusy) {
42
+            camera.onDeviceBusy(this, true);
43
+        }
44
+        if (responseCode == Response.Ok) {
45
+            camera.onPropertyChanged(property, value);
46
+        }
47
+    }
48
+
49
+    @Override
50
+    public void encodeCommand(ByteBuffer b) {
51
+        encodeCommand(b, PtpConstants.Operation.GetDevicePropValue, property);
52
+    }
53
+
54
+    @Override
55
+    protected void decodeData(ByteBuffer b, int length) {
56
+        if (datatype == Datatype.int8) {
57
+            value = b.get();
58
+        } else if (datatype == Datatype.uint8) {
59
+            value = b.get() & 0xFF;
60
+        } else if (datatype == Datatype.uint16) {
61
+            value = b.getShort() & 0xFFFF;
62
+        } else if (datatype == Datatype.int16) {
63
+            value = b.getShort();
64
+        } else if (datatype == Datatype.int32 || datatype == Datatype.uint32) {
65
+            value = b.getInt();
66
+        }
67
+    }
68
+}

+ 90 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/GetObjectCommand.java

@@ -0,0 +1,90 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import android.graphics.Bitmap;
21
+import android.graphics.BitmapFactory;
22
+import android.util.Log;
23
+
24
+import com.remoteyourcam.usb.ptp.PtpCamera;
25
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
26
+import com.remoteyourcam.usb.ptp.PtpConstants;
27
+
28
+/**
29
+ * Read file data from camera with specified {@code objectHandle}.
30
+ */
31
+public class GetObjectCommand extends Command {
32
+
33
+    private static final String TAG = GetObjectCommand.class.getSimpleName();
34
+
35
+    private final int objectHandle;
36
+
37
+    private final BitmapFactory.Options options;
38
+    private Bitmap inBitmap;
39
+
40
+    private boolean outOfMemoryError;
41
+
42
+    public GetObjectCommand(PtpCamera camera, int objectHandle, int sampleSize) {
43
+        super(camera);
44
+        this.objectHandle = objectHandle;
45
+        options = new BitmapFactory.Options();
46
+        if (sampleSize >= 1 && sampleSize <= 4) {
47
+            options.inSampleSize = sampleSize;
48
+        } else {
49
+            options.inSampleSize = 2;
50
+        }
51
+    }
52
+
53
+    public Bitmap getBitmap() {
54
+        return inBitmap;
55
+    }
56
+
57
+    public boolean isOutOfMemoryError() {
58
+        return outOfMemoryError;
59
+    }
60
+
61
+    @Override
62
+    public void exec(IO io) {
63
+        throw new UnsupportedOperationException();
64
+    }
65
+
66
+    @Override
67
+    public void reset() {
68
+        super.reset();
69
+        inBitmap = null;
70
+        outOfMemoryError = false;
71
+    }
72
+
73
+    @Override
74
+    public void encodeCommand(ByteBuffer b) {
75
+        encodeCommand(b, PtpConstants.Operation.GetObject, objectHandle);
76
+    }
77
+
78
+    @Override
79
+    protected void decodeData(ByteBuffer b, int length) {
80
+        try {
81
+            // 12 == offset of data header
82
+            inBitmap = BitmapFactory.decodeByteArray(b.array(), 12, length - 12, options);
83
+        } catch (RuntimeException e) {
84
+            Log.i(TAG, "exception on decoding picture : " + e.toString());
85
+        } catch (OutOfMemoryError e) {
86
+            System.gc();
87
+            outOfMemoryError = true;
88
+        }
89
+    }
90
+}

+ 79 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/GetObjectHandlesCommand.java

@@ -0,0 +1,79 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.Camera.StorageInfoListener;
21
+import com.remoteyourcam.usb.ptp.PacketUtil;
22
+import com.remoteyourcam.usb.ptp.PtpCamera;
23
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
24
+import com.remoteyourcam.usb.ptp.PtpConstants;
25
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
26
+
27
+public class GetObjectHandlesCommand extends Command {
28
+
29
+    private final int storageId;
30
+    private final int objectFormat;
31
+    private final int associationHandle;
32
+    private int[] objectHandles;
33
+    private final StorageInfoListener listener;
34
+
35
+    public int[] getObjectHandles() {
36
+        if (objectHandles == null) {
37
+            return new int[0];
38
+        }
39
+        return objectHandles;
40
+    }
41
+
42
+    public GetObjectHandlesCommand(PtpCamera camera, StorageInfoListener listener, int storageId) {
43
+        this(camera, listener, storageId, 0, 0);
44
+    }
45
+
46
+    public GetObjectHandlesCommand(PtpCamera camera, StorageInfoListener listener, int storageId, int objectFormat) {
47
+        this(camera, listener, storageId, objectFormat, 0);
48
+    }
49
+
50
+    public GetObjectHandlesCommand(PtpCamera camera, StorageInfoListener listener, int storageId, int objectFormat,
51
+            int associationHandle) {
52
+        super(camera);
53
+        this.listener = listener;
54
+        this.storageId = storageId;
55
+        this.objectFormat = objectFormat;
56
+        this.associationHandle = associationHandle;
57
+    }
58
+
59
+    @Override
60
+    public void exec(IO io) {
61
+        io.handleCommand(this);
62
+        if (getResponseCode() != Response.Ok) {
63
+            // error
64
+            listener.onImageHandlesRetrieved(new int[0]);
65
+            return;
66
+        }
67
+        listener.onImageHandlesRetrieved(objectHandles);
68
+    }
69
+
70
+    @Override
71
+    public void encodeCommand(ByteBuffer b) {
72
+        super.encodeCommand(b, PtpConstants.Operation.GetObjectHandles, storageId, objectFormat, associationHandle);
73
+    }
74
+
75
+    @Override
76
+    protected void decodeData(ByteBuffer b, int length) {
77
+        objectHandles = PacketUtil.readU32Array(b);
78
+    }
79
+}

+ 73 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/GetObjectInfoCommand.java

@@ -0,0 +1,73 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.AppConfig;
21
+import com.remoteyourcam.usb.ptp.PtpCamera;
22
+import com.remoteyourcam.usb.ptp.PtpConstants;
23
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
24
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
25
+import com.remoteyourcam.usb.ptp.model.ObjectInfo;
26
+
27
+import android.util.Log;
28
+
29
+public class GetObjectInfoCommand extends Command {
30
+
31
+    private final String TAG = GetObjectInfoCommand.class.getSimpleName();
32
+
33
+    private final int outObjectHandle;
34
+    private ObjectInfo inObjectInfo;
35
+
36
+    public GetObjectInfoCommand(PtpCamera camera, int objectHandle) {
37
+        super(camera);
38
+        this.outObjectHandle = objectHandle;
39
+    }
40
+
41
+    public ObjectInfo getObjectInfo() {
42
+        return inObjectInfo;
43
+    }
44
+
45
+    @Override
46
+    public void exec(IO io) {
47
+        io.handleCommand(this);
48
+        if (responseCode == Response.DeviceBusy) {
49
+            camera.onDeviceBusy(this, true);
50
+        }
51
+        if (inObjectInfo != null) {
52
+            if (AppConfig.LOG) {
53
+                Log.i(TAG, inObjectInfo.toString());
54
+            }
55
+        }
56
+    }
57
+
58
+    @Override
59
+    public void reset() {
60
+        super.reset();
61
+        inObjectInfo = null;
62
+    }
63
+
64
+    @Override
65
+    public void encodeCommand(ByteBuffer b) {
66
+        encodeCommand(b, PtpConstants.Operation.GetObjectInfo, outObjectHandle);
67
+    }
68
+
69
+    @Override
70
+    protected void decodeData(ByteBuffer b, int length) {
71
+        inObjectInfo = new ObjectInfo(b, length);
72
+    }
73
+}

+ 54 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/GetStorageIdsCommand.java

@@ -0,0 +1,54 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.PacketUtil;
21
+import com.remoteyourcam.usb.ptp.PtpCamera;
22
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
23
+import com.remoteyourcam.usb.ptp.PtpConstants;
24
+
25
+public class GetStorageIdsCommand extends Command {
26
+
27
+    private int[] storageIds;
28
+
29
+    public int[] getStorageIds() {
30
+        if (storageIds == null) {
31
+            return new int[0];
32
+        }
33
+        return storageIds;
34
+    }
35
+
36
+    public GetStorageIdsCommand(PtpCamera camera) {
37
+        super(camera);
38
+    }
39
+
40
+    @Override
41
+    public void exec(IO io) {
42
+        io.handleCommand(this);
43
+    }
44
+
45
+    @Override
46
+    public void encodeCommand(ByteBuffer b) {
47
+        super.encodeCommand(b, PtpConstants.Operation.GetStorageIDs);
48
+    }
49
+
50
+    @Override
51
+    protected void decodeData(ByteBuffer b, int length) {
52
+        storageIds = PacketUtil.readU32Array(b);
53
+    }
54
+}

+ 53 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/GetStorageInfoCommand.java

@@ -0,0 +1,53 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.PtpCamera;
21
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
22
+import com.remoteyourcam.usb.ptp.PtpConstants;
23
+import com.remoteyourcam.usb.ptp.model.StorageInfo;
24
+
25
+public class GetStorageInfoCommand extends Command {
26
+
27
+    private StorageInfo storageInfo;
28
+    private final int storageId;
29
+
30
+    public StorageInfo getStorageInfo() {
31
+        return storageInfo;
32
+    }
33
+
34
+    public GetStorageInfoCommand(PtpCamera camera, int storageId) {
35
+        super(camera);
36
+        this.storageId = storageId;
37
+    }
38
+
39
+    @Override
40
+    public void exec(IO io) {
41
+        io.handleCommand(this);
42
+    }
43
+
44
+    @Override
45
+    public void encodeCommand(ByteBuffer b) {
46
+        super.encodeCommand(b, PtpConstants.Operation.GetStorageInfo, storageId);
47
+    }
48
+
49
+    @Override
50
+    protected void decodeData(ByteBuffer b, int length) {
51
+        storageInfo = new StorageInfo(b, length);
52
+    }
53
+}

+ 72 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/GetStorageInfosAction.java

@@ -0,0 +1,72 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import com.remoteyourcam.usb.ptp.Camera;
19
+import com.remoteyourcam.usb.ptp.Camera.StorageInfoListener;
20
+import com.remoteyourcam.usb.ptp.PtpAction;
21
+import com.remoteyourcam.usb.ptp.PtpCamera;
22
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
24
+
25
+public class GetStorageInfosAction implements PtpAction {
26
+
27
+    private final PtpCamera camera;
28
+    private final StorageInfoListener listener;
29
+
30
+    public GetStorageInfosAction(PtpCamera camera, Camera.StorageInfoListener listener) {
31
+        this.camera = camera;
32
+        this.listener = listener;
33
+    }
34
+
35
+    @Override
36
+    public void exec(IO io) {
37
+        GetStorageIdsCommand getStorageIds = new GetStorageIdsCommand(camera);
38
+        io.handleCommand(getStorageIds);
39
+
40
+        if (getStorageIds.getResponseCode() != Response.Ok) {
41
+            listener.onAllStoragesFound();
42
+            return;
43
+        }
44
+
45
+        int ids[] = getStorageIds.getStorageIds();
46
+        for (int i = 0; i < ids.length; ++i) {
47
+            int storageId = ids[i];
48
+            if(storageId == 131073){
49
+                GetStorageInfoCommand c = new GetStorageInfoCommand(camera, storageId);
50
+                io.handleCommand(c);
51
+
52
+                if (c.getResponseCode() != Response.Ok) {
53
+                    listener.onAllStoragesFound();
54
+                    return;
55
+                }
56
+
57
+                String label = c.getStorageInfo().volumeLabel.isEmpty() ? c.getStorageInfo().storageDescription : c
58
+                        .getStorageInfo().volumeLabel;
59
+                if (label == null || label.isEmpty()) {
60
+                    label = "Storage " + i;
61
+                }
62
+                listener.onStorageFound(storageId, label);
63
+            }
64
+        }
65
+
66
+        listener.onAllStoragesFound();
67
+    }
68
+
69
+    @Override
70
+    public void reset() {
71
+    }
72
+}

+ 71 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/GetThumb.java

@@ -0,0 +1,71 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import android.graphics.Bitmap;
21
+import android.graphics.BitmapFactory;
22
+import android.util.Log;
23
+
24
+import com.remoteyourcam.usb.ptp.PtpCamera;
25
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
26
+import com.remoteyourcam.usb.ptp.PtpConstants;
27
+
28
+public class GetThumb extends Command {
29
+
30
+    private static final String TAG = GetThumb.class.getSimpleName();
31
+
32
+    private final int objectHandle;
33
+    private Bitmap inBitmap;
34
+
35
+    public GetThumb(PtpCamera camera, int objectHandle) {
36
+        super(camera);
37
+        this.objectHandle = objectHandle;
38
+    }
39
+
40
+    public Bitmap getBitmap() {
41
+        return inBitmap;
42
+    }
43
+
44
+    @Override
45
+    public void exec(IO io) {
46
+        throw new UnsupportedOperationException();
47
+    }
48
+
49
+    @Override
50
+    public void reset() {
51
+        super.reset();
52
+        inBitmap = null;
53
+    }
54
+
55
+    @Override
56
+    public void encodeCommand(ByteBuffer b) {
57
+        encodeCommand(b, PtpConstants.Operation.GetThumb, objectHandle);
58
+    }
59
+
60
+    @Override
61
+    protected void decodeData(ByteBuffer b, int length) {
62
+        try {
63
+            // 12 == offset of data header
64
+            inBitmap = BitmapFactory.decodeByteArray(b.array(), 12, length - 12);
65
+        } catch (RuntimeException e) {
66
+            Log.i(TAG, "exception on decoding picture : " + e.toString());
67
+        } catch (OutOfMemoryError e) {
68
+            System.gc();
69
+        }
70
+    }
71
+}

+ 44 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/InitiateCaptureCommand.java

@@ -0,0 +1,44 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.PtpCamera;
21
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
24
+
25
+public class InitiateCaptureCommand extends Command {
26
+
27
+    public InitiateCaptureCommand(PtpCamera camera) {
28
+        super(camera);
29
+    }
30
+
31
+    @Override
32
+    public void exec(IO io) {
33
+        io.handleCommand(this);
34
+        if (responseCode == Response.DeviceBusy) {
35
+            camera.onDeviceBusy(this, true); // TODO when nikon live view is enabled this stalls
36
+            return;
37
+        }
38
+    }
39
+
40
+    @Override
41
+    public void encodeCommand(ByteBuffer b) {
42
+        encodeCommand(b, Operation.InitiateCapture, 0, 0);
43
+    }
44
+}

+ 44 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/InitiateOpenCaptureCommand.java

@@ -0,0 +1,44 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import com.remoteyourcam.usb.ptp.PtpCamera;
19
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
20
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
21
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
22
+
23
+import java.nio.ByteBuffer;
24
+
25
+public class InitiateOpenCaptureCommand extends Command {
26
+
27
+    public InitiateOpenCaptureCommand(PtpCamera camera) {
28
+        super(camera);
29
+    }
30
+
31
+    @Override
32
+    public void exec(IO io) {
33
+        io.handleCommand(this);
34
+        if (responseCode == Response.DeviceBusy) {
35
+            camera.onDeviceBusy(this, true); // TODO when nikon live view is enabled this stalls
36
+            return;
37
+        }
38
+    }
39
+
40
+    @Override
41
+    public void encodeCommand(ByteBuffer b) {
42
+        encodeCommand(b, Operation.InitiateOpenCapture, 0, 0);
43
+    }
44
+}

+ 48 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/OpenSessionCommand.java

@@ -0,0 +1,48 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.PtpCamera;
21
+import com.remoteyourcam.usb.ptp.PtpConstants;
22
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
24
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
25
+
26
+public class OpenSessionCommand extends Command {
27
+
28
+    public OpenSessionCommand(PtpCamera camera) {
29
+        super(camera);
30
+    }
31
+
32
+    @Override
33
+    public void exec(IO io) {
34
+        io.handleCommand(this);
35
+        if (responseCode == Response.Ok) {
36
+            camera.onSessionOpened();
37
+        } else {
38
+            camera.onPtpError(String.format("Couldn't open session, error code \"%s\"",
39
+                    PtpConstants.responseToString(responseCode)));
40
+        }
41
+    }
42
+
43
+    @Override
44
+    public void encodeCommand(ByteBuffer b) {
45
+        camera.resetTransactionId();
46
+        encodeCommand(b, Operation.OpenSession, 1);
47
+    }
48
+}

+ 51 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/RetrieveAddedObjectInfoAction.java

@@ -0,0 +1,51 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import com.remoteyourcam.usb.ptp.PtpAction;
19
+import com.remoteyourcam.usb.ptp.PtpCamera;
20
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
21
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
22
+
23
+public class RetrieveAddedObjectInfoAction implements PtpAction {
24
+
25
+    private final PtpCamera camera;
26
+    private final int objectHandle;
27
+
28
+    public RetrieveAddedObjectInfoAction(PtpCamera camera, int objectHandle) {
29
+        this.camera = camera;
30
+        this.objectHandle = objectHandle;
31
+    }
32
+
33
+    @Override
34
+    public void exec(IO io) {
35
+        GetObjectInfoCommand getInfo = new GetObjectInfoCommand(camera, objectHandle);
36
+        io.handleCommand(getInfo);
37
+
38
+        if (getInfo.getResponseCode() != Response.Ok) {
39
+            return;
40
+        }
41
+        if (getInfo.getObjectInfo() == null) {
42
+            return;
43
+        }
44
+
45
+        camera.onEventObjectAdded(objectHandle);
46
+    }
47
+
48
+    @Override
49
+    public void reset() {
50
+    }
51
+}

+ 54 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/RetrieveImageAction.java

@@ -0,0 +1,54 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import com.remoteyourcam.usb.ptp.Camera.RetrieveImageListener;
19
+import com.remoteyourcam.usb.ptp.PtpAction;
20
+import com.remoteyourcam.usb.ptp.PtpCamera;
21
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
23
+
24
+public class RetrieveImageAction implements PtpAction {
25
+
26
+    private final PtpCamera camera;
27
+    private final int objectHandle;
28
+    private final RetrieveImageListener listener;
29
+    private final int sampleSize;
30
+
31
+    public RetrieveImageAction(PtpCamera camera, RetrieveImageListener listener, int objectHandle, int sampleSize) {
32
+        this.camera = camera;
33
+        this.listener = listener;
34
+        this.objectHandle = objectHandle;
35
+        this.sampleSize = sampleSize;
36
+    }
37
+
38
+    @Override
39
+    public void exec(IO io) {
40
+        GetObjectCommand getObject = new GetObjectCommand(camera, objectHandle, sampleSize);
41
+        io.handleCommand(getObject);
42
+
43
+        if (getObject.getResponseCode() != Response.Ok || getObject.getBitmap() == null) {
44
+            listener.onImageRetrieved(0, null);
45
+            return;
46
+        }
47
+
48
+        listener.onImageRetrieved(objectHandle, getObject.getBitmap());
49
+    }
50
+
51
+    @Override
52
+    public void reset() {
53
+    }
54
+}

+ 70 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/RetrieveImageInfoAction.java

@@ -0,0 +1,70 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import android.graphics.Bitmap;
19
+
20
+import com.remoteyourcam.usb.ptp.Camera.RetrieveImageInfoListener;
21
+import com.remoteyourcam.usb.ptp.PtpAction;
22
+import com.remoteyourcam.usb.ptp.PtpCamera;
23
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
24
+import com.remoteyourcam.usb.ptp.PtpConstants;
25
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
26
+import com.remoteyourcam.usb.ptp.model.ObjectInfo;
27
+
28
+public class RetrieveImageInfoAction implements PtpAction {
29
+
30
+    private final PtpCamera camera;
31
+    private final int objectHandle;
32
+    private final RetrieveImageInfoListener listener;
33
+
34
+    public RetrieveImageInfoAction(PtpCamera camera, RetrieveImageInfoListener listener, int objectHandle) {
35
+        this.camera = camera;
36
+        this.listener = listener;
37
+        this.objectHandle = objectHandle;
38
+    }
39
+
40
+    @Override
41
+    public void exec(IO io) {
42
+        GetObjectInfoCommand getInfo = new GetObjectInfoCommand(camera, objectHandle);
43
+        io.handleCommand(getInfo);
44
+
45
+        if (getInfo.getResponseCode() != Response.Ok) {
46
+            return;
47
+        }
48
+
49
+        ObjectInfo objectInfo = getInfo.getObjectInfo();
50
+        if (objectInfo == null) {
51
+            return;
52
+        }
53
+
54
+        Bitmap thumbnail = null;
55
+        if (objectInfo.thumbFormat == PtpConstants.ObjectFormat.JFIF
56
+                || objectInfo.thumbFormat == PtpConstants.ObjectFormat.EXIF_JPEG) {
57
+            GetThumb getThumb = new GetThumb(camera, objectHandle);
58
+            io.handleCommand(getThumb);
59
+            if (getThumb.getResponseCode() == Response.Ok) {
60
+                thumbnail = getThumb.getBitmap();
61
+            }
62
+        }
63
+
64
+        listener.onImageInfoRetrieved(objectHandle, getInfo.getObjectInfo(), thumbnail);
65
+    }
66
+
67
+    @Override
68
+    public void reset() {
69
+    }
70
+}

+ 86 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/RetrievePictureAction.java

@@ -0,0 +1,86 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import android.graphics.Bitmap;
19
+
20
+import com.remoteyourcam.usb.ptp.PtpAction;
21
+import com.remoteyourcam.usb.ptp.PtpCamera;
22
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
23
+import com.remoteyourcam.usb.ptp.PtpConstants;
24
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
25
+import com.remoteyourcam.usb.ptp.model.ObjectInfo;
26
+
27
+public class RetrievePictureAction implements PtpAction {
28
+
29
+    private final PtpCamera camera;
30
+    private final int objectHandle;
31
+    private final int sampleSize;
32
+
33
+    public RetrievePictureAction(PtpCamera camera, int objectHandle, int sampleSize) {
34
+        this.camera = camera;
35
+        this.objectHandle = objectHandle;
36
+        this.sampleSize = sampleSize;
37
+    }
38
+
39
+    @Override
40
+    public void exec(IO io) {
41
+        GetObjectInfoCommand getInfo = new GetObjectInfoCommand(camera, objectHandle);
42
+        io.handleCommand(getInfo);
43
+
44
+        if (getInfo.getResponseCode() != Response.Ok) {
45
+            return;
46
+        }
47
+
48
+        ObjectInfo objectInfo = getInfo.getObjectInfo();
49
+        if (objectInfo == null) {
50
+            return;
51
+        }
52
+
53
+        Bitmap thumbnail = null;
54
+        if (objectInfo.thumbFormat == PtpConstants.ObjectFormat.JFIF
55
+                || objectInfo.thumbFormat == PtpConstants.ObjectFormat.EXIF_JPEG) {
56
+            GetThumb getThumb = new GetThumb(camera, objectHandle);
57
+            io.handleCommand(getThumb);
58
+            if (getThumb.getResponseCode() == Response.Ok) {
59
+                thumbnail = getThumb.getBitmap();
60
+            }
61
+        }
62
+
63
+        GetObjectCommand getObject = new GetObjectCommand(camera, objectHandle, sampleSize);
64
+        io.handleCommand(getObject);
65
+
66
+        if (getObject.getResponseCode() != Response.Ok) {
67
+            return;
68
+        }
69
+        if (getObject.getBitmap() == null) {
70
+            if (getObject.isOutOfMemoryError()) {
71
+                camera.onPictureReceived(objectHandle, getInfo.getObjectInfo().filename, thumbnail, null);
72
+            }
73
+            return;
74
+        }
75
+
76
+        if (thumbnail == null) {
77
+            // TODO resize real picture?
78
+        }
79
+
80
+        camera.onPictureReceived(objectHandle, getInfo.getObjectInfo().filename, thumbnail, getObject.getBitmap());
81
+    }
82
+
83
+    @Override
84
+    public void reset() {
85
+    }
86
+}

+ 76 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/SetDevicePropValueCommand.java

@@ -0,0 +1,76 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.PtpCamera;
21
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
22
+import com.remoteyourcam.usb.ptp.PtpConstants;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Datatype;
24
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
25
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
26
+import com.remoteyourcam.usb.ptp.PtpConstants.Type;
27
+
28
+public class SetDevicePropValueCommand extends Command {
29
+
30
+    private final int property;
31
+    private final int value;
32
+    private final int datatype;
33
+
34
+    public SetDevicePropValueCommand(PtpCamera camera, int property, int value, int datatype) {
35
+        super(camera);
36
+        this.property = property;
37
+        this.value = value;
38
+        this.datatype = datatype;
39
+        hasDataToSend = true;
40
+    }
41
+
42
+    @Override
43
+    public void exec(IO io) {
44
+        io.handleCommand(this);
45
+        if (responseCode == Response.DeviceBusy) {
46
+            camera.onDeviceBusy(this, true);
47
+            return;
48
+        } else if (responseCode == Response.Ok) {
49
+            camera.onPropertyChanged(property, value);
50
+        }
51
+    }
52
+
53
+    @Override
54
+    public void encodeCommand(ByteBuffer b) {
55
+        encodeCommand(b, Operation.SetDevicePropValue, property);
56
+    }
57
+
58
+    @Override
59
+    public void encodeData(ByteBuffer b) {
60
+        // header
61
+        b.putInt(12 + PtpConstants.getDatatypeSize(datatype));
62
+        b.putShort((short) Type.Data);
63
+        b.putShort((short) Operation.SetDevicePropValue);
64
+        b.putInt(camera.currentTransactionId());
65
+        // specific block
66
+        if (datatype == Datatype.int8 || datatype == Datatype.uint8) {
67
+            b.put((byte) value);
68
+        } else if (datatype == Datatype.int16 || datatype == Datatype.uint16) {
69
+            b.putShort((short) value);
70
+        } else if (datatype == Datatype.int32 || datatype == Datatype.uint32) {
71
+            b.putInt(value);
72
+        } else {
73
+            throw new UnsupportedOperationException();
74
+        }
75
+    }
76
+}

+ 70 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/SimpleCommand.java

@@ -0,0 +1,70 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.PtpCamera;
21
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
23
+
24
+public class SimpleCommand extends Command {
25
+
26
+    private final int operation;
27
+    private int numParams;
28
+    private int p0;
29
+    private int p1;
30
+
31
+    public SimpleCommand(PtpCamera camera, int operation) {
32
+        super(camera);
33
+        this.operation = operation;
34
+    }
35
+
36
+    public SimpleCommand(PtpCamera camera, int operation, int p0) {
37
+        super(camera);
38
+        this.operation = operation;
39
+        this.p0 = p0;
40
+        this.numParams = 1;
41
+    }
42
+
43
+    public SimpleCommand(PtpCamera camera, int operation, int p0, int p1) {
44
+        super(camera);
45
+        this.operation = operation;
46
+        this.p0 = p0;
47
+        this.p1 = p1;
48
+        this.numParams = 2;
49
+    }
50
+
51
+    @Override
52
+    public void exec(IO io) {
53
+        io.handleCommand(this);
54
+        if (responseCode == Response.DeviceBusy) {
55
+            camera.onDeviceBusy(this, true);
56
+            return;
57
+        }
58
+    }
59
+
60
+    @Override
61
+    public void encodeCommand(ByteBuffer b) {
62
+        if (numParams == 2) {
63
+            encodeCommand(b, operation, p0, p1);
64
+        } else if (numParams == 1) {
65
+            encodeCommand(b, operation, p0);
66
+        } else {
67
+            encodeCommand(b, operation);
68
+        }
69
+    }
70
+}

+ 29 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/eos/EosCommand.java

@@ -0,0 +1,29 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.eos;
17
+
18
+import com.remoteyourcam.usb.ptp.EosCamera;
19
+import com.remoteyourcam.usb.ptp.commands.Command;
20
+
21
+public abstract class EosCommand extends Command {
22
+
23
+    protected EosCamera camera;
24
+
25
+    public EosCommand(EosCamera camera) {
26
+        super(camera);
27
+        this.camera = camera;
28
+    }
29
+}

+ 184 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/eos/EosEventCheckCommand.java

@@ -0,0 +1,184 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.eos;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import android.util.Log;
21
+
22
+import com.remoteyourcam.usb.AppConfig;
23
+import com.remoteyourcam.usb.ptp.EosCamera;
24
+import com.remoteyourcam.usb.ptp.PacketUtil;
25
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
26
+import com.remoteyourcam.usb.ptp.PtpConstants;
27
+import com.remoteyourcam.usb.ptp.PtpConstants.Event;
28
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
29
+import com.remoteyourcam.usb.ptp.PtpConstants.Property;
30
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
31
+
32
+public class EosEventCheckCommand extends EosCommand {
33
+
34
+    private static final String TAG = EosEventCheckCommand.class.getSimpleName();
35
+
36
+    public EosEventCheckCommand(EosCamera camera) {
37
+        super(camera);
38
+    }
39
+
40
+    @Override
41
+    public void exec(IO io) {
42
+        io.handleCommand(this);
43
+        if (responseCode == Response.DeviceBusy) {
44
+            camera.onDeviceBusy(this, false);
45
+        }
46
+    }
47
+
48
+    @Override
49
+    public void encodeCommand(ByteBuffer b) {
50
+        encodeCommand(b, Operation.EosEventCheck);
51
+    }
52
+
53
+    @Override
54
+    protected void decodeData(ByteBuffer b, int length) {
55
+        while (b.position() < length) {
56
+            int eventLength = b.getInt();
57
+            int event = b.getInt();
58
+            if (AppConfig.LOG) {
59
+                Log.i(TAG, "event length " + eventLength);
60
+                Log.i(TAG, "event type " + PtpConstants.eventToString(event));
61
+            }
62
+            switch (event) {
63
+            case Event.EosObjectAdded: {
64
+                int objectHandle = b.getInt();
65
+                int storageId = b.getInt();
66
+                int objectFormat = b.getShort();
67
+                skip(b, eventLength - 18);
68
+                camera.onEventDirItemCreated(objectHandle, storageId, objectFormat, "TODO");
69
+                break;
70
+            }
71
+            case Event.EosDevicePropChanged: {
72
+                int property = b.getInt();
73
+                if (AppConfig.LOG) {
74
+                    Log.i(TAG, "property " + PtpConstants.propertyToString(property));
75
+                }
76
+                switch (property) {
77
+                case Property.EosApertureValue:
78
+                case Property.EosShutterSpeed:
79
+                case Property.EosIsoSpeed:
80
+                case Property.EosWhitebalance:
81
+                case Property.EosEvfOutputDevice:
82
+                case Property.EosShootingMode:
83
+                case Property.EosAvailableShots:
84
+                case Property.EosColorTemperature:
85
+                case Property.EosAfMode:
86
+                case Property.EosMeteringMode:
87
+                case Property.EosExposureCompensation:
88
+                case Property.EosPictureStyle:
89
+                case Property.EosEvfMode: {
90
+                    int value = b.getInt();
91
+                    if (AppConfig.LOG) {
92
+                        Log.i(TAG, "value " + value);
93
+                    }
94
+                    camera.onPropertyChanged(property, value);
95
+                    break;
96
+                }
97
+                default:
98
+                    if (AppConfig.LOG && eventLength <= 200) {
99
+                        PacketUtil.logHexdump(TAG, b.array(), b.position(), eventLength - 12);
100
+                    }
101
+                    skip(b, eventLength - 12);
102
+                    break;
103
+                }
104
+                break;
105
+            }
106
+            case Event.EosDevicePropDescChanged: {
107
+                int property = b.getInt();
108
+                if (AppConfig.LOG) {
109
+                    Log.i(TAG, "property " + PtpConstants.propertyToString(property));
110
+                }
111
+                switch (property) {
112
+                case Property.EosApertureValue:
113
+                case Property.EosShutterSpeed:
114
+                case Property.EosIsoSpeed:
115
+                case Property.EosMeteringMode:
116
+                case Property.EosPictureStyle:
117
+                case Property.EosExposureCompensation:
118
+                case Property.EosColorTemperature:
119
+                case Property.EosWhitebalance: {
120
+                    /* int dataType = */b.getInt();
121
+                    int num = b.getInt();
122
+                    if (AppConfig.LOG) {
123
+                        Log.i(TAG, "property desc with num " + num);
124
+                    }
125
+                    if (eventLength != 20 + 4 * num) {
126
+                        if (AppConfig.LOG) {
127
+                            Log.i(TAG, String.format("Event Desc length invalid should be %d but is %d", 20 + 4 * num,
128
+                                    eventLength));
129
+                            PacketUtil.logHexdump(TAG, b.array(), b.position() - 20, eventLength);
130
+                        }
131
+                    }
132
+                    int[] values = new int[num];
133
+                    for (int i = 0; i < num; ++i) {
134
+                        values[i] = b.getInt();
135
+                    }
136
+                    if (eventLength != 20 + 4 * num) {
137
+                        for (int i = 20 + 4 * num; i < eventLength; ++i) {
138
+                            b.get();
139
+                        }
140
+                    }
141
+                    camera.onPropertyDescChanged(property, values);
142
+                    break;
143
+                }
144
+                default:
145
+                    if (AppConfig.LOG && eventLength <= 50) {
146
+                        PacketUtil.logHexdump(TAG, b.array(), b.position(), eventLength - 12);
147
+                    }
148
+                    skip(b, eventLength - 12);
149
+                }
150
+                break;
151
+            }
152
+            case Event.EosBulbExposureTime: {
153
+                int seconds = b.getInt();
154
+                camera.onBulbExposureTime(seconds);
155
+                break;
156
+            }
157
+            case Event.EosCameraStatus: {
158
+                // 0 - capture stopped
159
+                // 1 - capture started
160
+                int status = b.getInt();
161
+                camera.onEventCameraCapture(status != 0);
162
+                break;
163
+            }
164
+            case Event.EosWillSoonShutdown: {
165
+                /* int seconds = */b.getInt();
166
+                //TODO
167
+                break;
168
+            }
169
+            default:
170
+                //                if (BuildConfig.LOG) {
171
+                //                    PacketUtil.logHexdump(b.array(), b.position(), eventLength - 8);
172
+                //                }
173
+                skip(b, eventLength - 8);
174
+                break;
175
+            }
176
+        }
177
+    }
178
+
179
+    private void skip(ByteBuffer b, int length) {
180
+        for (int i = 0; i < length; ++i) {
181
+            b.get();
182
+        }
183
+    }
184
+}

+ 153 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/eos/EosGetLiveViewPictureCommand.java

@@ -0,0 +1,153 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.eos;
17
+
18
+import java.nio.ByteBuffer;
19
+import java.nio.ByteOrder;
20
+
21
+import android.graphics.BitmapFactory;
22
+import android.graphics.BitmapFactory.Options;
23
+import android.util.Log;
24
+
25
+import com.remoteyourcam.usb.AppConfig;
26
+import com.remoteyourcam.usb.ptp.EosCamera;
27
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
28
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
29
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
30
+import com.remoteyourcam.usb.ptp.model.LiveViewData;
31
+
32
+public class EosGetLiveViewPictureCommand extends EosCommand {
33
+
34
+    private static final String TAG = EosGetLiveViewPictureCommand.class.getSimpleName();
35
+    private static byte[] tmpStorage = new byte[0x4000];
36
+    private final Options options;
37
+    private LiveViewData data;
38
+
39
+    public EosGetLiveViewPictureCommand(EosCamera camera, LiveViewData data) {
40
+        super(camera);
41
+        if (data == null) {
42
+            this.data = new LiveViewData();
43
+            this.data.histogram = ByteBuffer.allocate(1024 * 4);
44
+            this.data.histogram.order(ByteOrder.LITTLE_ENDIAN);
45
+        } else {
46
+            this.data = data;
47
+        }
48
+        options = new BitmapFactory.Options();
49
+        options.inBitmap = this.data.bitmap;
50
+        options.inSampleSize = 1;
51
+        options.inTempStorage = tmpStorage;
52
+        this.data.bitmap = null;
53
+    }
54
+
55
+    @Override
56
+    public void exec(IO io) {
57
+        io.handleCommand(this);
58
+        if (responseCode == Response.DeviceBusy) {
59
+            camera.onDeviceBusy(this, true);
60
+            return;
61
+        }
62
+        if (this.data.bitmap != null && responseCode == Response.Ok) {
63
+            camera.onLiveViewReceived(data);
64
+        } else {
65
+            camera.onLiveViewReceived(null);
66
+        }
67
+    }
68
+
69
+    @Override
70
+    public void encodeCommand(ByteBuffer b) {
71
+        encodeCommand(b, Operation.EosGetLiveViewPicture, 0x100000);
72
+    }
73
+
74
+    @Override
75
+    protected void decodeData(ByteBuffer b, int length) {
76
+
77
+        data.hasHistogram = false;
78
+        data.hasAfFrame = false;
79
+
80
+        if (length < 1000) {
81
+            if (AppConfig.LOG) {
82
+                Log.w(TAG, String.format("liveview data size too small %d", length));
83
+            }
84
+            return;
85
+        }
86
+
87
+        try {
88
+
89
+            while (b.hasRemaining()) {
90
+                int subLength = b.getInt();
91
+                int type = b.getInt();
92
+
93
+                if (subLength < 8) {
94
+                    throw new RuntimeException("Invalid sub size " + subLength);
95
+                }
96
+
97
+                int unknownInt = 0;
98
+
99
+                switch (type) {
100
+                case 0x01:
101
+                    data.bitmap = BitmapFactory.decodeByteArray(b.array(), b.position(), subLength - 8, options);
102
+                    b.position(b.position() + subLength - 8);
103
+                    break;
104
+                case 0x04:
105
+                    data.zoomFactor = b.getInt();
106
+                    break;
107
+                case 0x05:
108
+                    // zoomfocusx, zoomfocusy
109
+                    data.zoomRectRight = b.getInt();
110
+                    data.zoomRectBottom = b.getInt();
111
+                    if (AppConfig.LOG) {
112
+                        Log.i(TAG, "header 5 " + data.zoomRectRight + " " + data.zoomRectBottom);
113
+                    }
114
+                    break;
115
+                case 0x06:
116
+                    // imagex, imagey (if zoomed should be non zero)
117
+                    data.zoomRectLeft = b.getInt();
118
+                    data.zoomRectTop = b.getInt();
119
+                    if (AppConfig.LOG) {
120
+                        Log.i(TAG, "header 6 " + data.zoomRectLeft + " " + data.zoomRectTop);
121
+                    }
122
+                    break;
123
+                case 0x07:
124
+                    unknownInt = b.getInt();
125
+                    if (AppConfig.LOG) {
126
+                        Log.i(TAG, "header 7 " + unknownInt + " " + subLength);
127
+                    }
128
+                    break;
129
+                case 0x03:
130
+                    data.hasHistogram = true;
131
+                    b.get(data.histogram.array(), 0, 1024 * 4);
132
+                    break;
133
+                case 0x08: // faces if faces focus
134
+                case 0x0e: // TODO original width, original height
135
+                default:
136
+                    b.position(b.position() + subLength - 8);
137
+                    if (AppConfig.LOG) {
138
+                        Log.i(TAG, "unknown header " + type + " size " + subLength);
139
+                    }
140
+                    break;
141
+                }
142
+
143
+                if (length - b.position() < 8) {
144
+                    break;
145
+                }
146
+            }
147
+
148
+        } catch (RuntimeException e) {
149
+            Log.e(TAG, "" + e.toString());
150
+            Log.e(TAG, "" + e.getLocalizedMessage());
151
+        }
152
+    }
153
+}

+ 65 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/eos/EosOpenSessionAction.java

@@ -0,0 +1,65 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.eos;
17
+
18
+import com.remoteyourcam.usb.ptp.EosCamera;
19
+import com.remoteyourcam.usb.ptp.PtpAction;
20
+import com.remoteyourcam.usb.ptp.PtpConstants;
21
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
22
+import com.remoteyourcam.usb.ptp.commands.OpenSessionCommand;
23
+
24
+public class EosOpenSessionAction implements PtpAction {
25
+
26
+    private final EosCamera camera;
27
+
28
+    public EosOpenSessionAction(EosCamera camera) {
29
+        this.camera = camera;
30
+    }
31
+
32
+    @Override
33
+    public void exec(IO io) {
34
+        OpenSessionCommand openSession = new OpenSessionCommand(camera);
35
+        io.handleCommand(openSession);
36
+        if (openSession.getResponseCode() == PtpConstants.Response.Ok) {
37
+            EosSetPcModeCommand setPcMode = new EosSetPcModeCommand(camera);
38
+            io.handleCommand(setPcMode);
39
+            if (setPcMode.getResponseCode() == PtpConstants.Response.Ok) {
40
+                EosSetExtendedEventInfoCommand c = new EosSetExtendedEventInfoCommand(camera);
41
+                io.handleCommand(c);
42
+                if (c.getResponseCode() == PtpConstants.Response.Ok) {
43
+                    camera.onSessionOpened();
44
+                    return;
45
+                } else {
46
+                    camera.onPtpError(String.format(
47
+                            "Couldn't open session! Setting extended event info failed with error code \"%s\"",
48
+                            PtpConstants.responseToString(c.getResponseCode())));
49
+                }
50
+            } else {
51
+                camera.onPtpError(String.format(
52
+                        "Couldn't open session! Setting PcMode property failed with error code \"%s\"",
53
+                        PtpConstants.responseToString(setPcMode.getResponseCode())));
54
+            }
55
+        } else {
56
+            camera.onPtpError(String.format(
57
+                    "Couldn't open session! Open session command failed with error code \"%s\"",
58
+                    PtpConstants.responseToString(openSession.getResponseCode())));
59
+        }
60
+    }
61
+
62
+    @Override
63
+    public void reset() {
64
+    }
65
+}

+ 46 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/eos/EosSetExtendedEventInfoCommand.java

@@ -0,0 +1,46 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.eos;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.EosCamera;
21
+import com.remoteyourcam.usb.ptp.PtpConstants;
22
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
24
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
25
+
26
+public class EosSetExtendedEventInfoCommand extends EosCommand {
27
+
28
+    public EosSetExtendedEventInfoCommand(EosCamera camera) {
29
+        super(camera);
30
+    }
31
+
32
+    @Override
33
+    public void exec(IO io) {
34
+        io.handleCommand(this);
35
+        if (responseCode != Response.Ok) {
36
+            camera.onPtpError(String.format(
37
+                    "Couldn't initialize session! Setting extended event info failed, error code %s",
38
+                    PtpConstants.responseToString(responseCode)));
39
+        }
40
+    }
41
+
42
+    @Override
43
+    public void encodeCommand(ByteBuffer b) {
44
+        encodeCommand(b, Operation.EosSetEventMode, 1);
45
+    }
46
+}

+ 84 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/eos/EosSetLiveViewAction.java

@@ -0,0 +1,84 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.eos;
17
+
18
+import com.remoteyourcam.usb.ptp.EosCamera;
19
+import com.remoteyourcam.usb.ptp.EosConstants;
20
+import com.remoteyourcam.usb.ptp.PtpAction;
21
+import com.remoteyourcam.usb.ptp.EosConstants.EvfMode;
22
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Property;
24
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
25
+
26
+public class EosSetLiveViewAction implements PtpAction {
27
+
28
+    private final EosCamera camera;
29
+    private final boolean enabled;
30
+
31
+    public EosSetLiveViewAction(EosCamera camera, boolean enabled) {
32
+        this.camera = camera;
33
+        this.enabled = enabled;
34
+    }
35
+
36
+    @Override
37
+    public void exec(IO io) {
38
+        int evfMode = camera.getPtpProperty(Property.EosEvfMode);
39
+
40
+        if (enabled && evfMode != EvfMode.ENABLE || !enabled && evfMode != EvfMode.DISABLE) {
41
+            EosSetPropertyCommand setEvfMode = new EosSetPropertyCommand(camera, Property.EosEvfMode,
42
+                    enabled ? EvfMode.ENABLE : EvfMode.DISABLE);
43
+            io.handleCommand(setEvfMode);
44
+
45
+            if (setEvfMode.getResponseCode() == Response.DeviceBusy) {
46
+                camera.onDeviceBusy(this, true);
47
+                return;
48
+            } else if (setEvfMode.getResponseCode() != Response.Ok) {
49
+                camera.onPtpWarning("Couldn't open live view");
50
+                return;
51
+            }
52
+        }
53
+
54
+        int outputDevice = camera.getPtpProperty(Property.EosEvfOutputDevice);
55
+
56
+        if (enabled) {
57
+            outputDevice |= EosConstants.EvfOutputDevice.PC;
58
+        } else {
59
+            outputDevice &= ~EosConstants.EvfOutputDevice.PC;
60
+        }
61
+
62
+        EosSetPropertyCommand setOutputDevice = new EosSetPropertyCommand(camera, Property.EosEvfOutputDevice,
63
+                outputDevice);
64
+        io.handleCommand(setOutputDevice);
65
+
66
+        if (setOutputDevice.getResponseCode() == Response.DeviceBusy) {
67
+            camera.onDeviceBusy(this, true);
68
+        } else if (setOutputDevice.getResponseCode() == Response.Ok) {
69
+            if (!enabled) {
70
+                camera.onLiveViewStopped();
71
+            } else {
72
+                camera.onLiveViewStarted();
73
+            }
74
+            return;
75
+        } else {
76
+            camera.onPtpWarning("Couldn't open live view");
77
+        }
78
+
79
+    }
80
+
81
+    @Override
82
+    public void reset() {
83
+    }
84
+}

+ 45 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/eos/EosSetPcModeCommand.java

@@ -0,0 +1,45 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.eos;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.EosCamera;
21
+import com.remoteyourcam.usb.ptp.PtpConstants;
22
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
24
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
25
+
26
+public class EosSetPcModeCommand extends EosCommand {
27
+
28
+    public EosSetPcModeCommand(EosCamera camera) {
29
+        super(camera);
30
+    }
31
+
32
+    @Override
33
+    public void exec(IO io) {
34
+        io.handleCommand(this);
35
+        if (responseCode != Response.Ok) {
36
+            camera.onPtpError(String.format("Couldn't initialize session! setting PC Mode failed, error code %s",
37
+                    PtpConstants.responseToString(responseCode)));
38
+        }
39
+    }
40
+
41
+    @Override
42
+    public void encodeCommand(ByteBuffer b) {
43
+        encodeCommand(b, Operation.EosSetPCConnectMode, 1);
44
+    }
45
+}

+ 64 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/eos/EosSetPropertyCommand.java

@@ -0,0 +1,64 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.eos;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.EosCamera;
21
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
24
+import com.remoteyourcam.usb.ptp.PtpConstants.Type;
25
+
26
+public class EosSetPropertyCommand extends EosCommand {
27
+
28
+    private final int property;
29
+    private final int value;
30
+
31
+    public EosSetPropertyCommand(EosCamera camera, int property, int value) {
32
+        super(camera);
33
+        hasDataToSend = true;
34
+        this.property = property;
35
+        this.value = value;
36
+    }
37
+
38
+    @Override
39
+    public void exec(IO io) {
40
+        io.handleCommand(this);
41
+        if (responseCode == Response.DeviceBusy) {
42
+            camera.onDeviceBusy(this, true);
43
+            return;
44
+        }
45
+    }
46
+
47
+    @Override
48
+    public void encodeCommand(ByteBuffer b) {
49
+        encodeCommand(b, Operation.EosSetDevicePropValue);
50
+    }
51
+
52
+    @Override
53
+    public void encodeData(ByteBuffer b) {
54
+        // header
55
+        b.putInt(24);
56
+        b.putShort((short) Type.Data);
57
+        b.putShort((short) Operation.EosSetDevicePropValue);
58
+        b.putInt(camera.currentTransactionId());
59
+        // specific block
60
+        b.putInt(0x0C);
61
+        b.putInt(property);
62
+        b.putInt(value);
63
+    }
64
+}

+ 43 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/eos/EosTakePictureCommand.java

@@ -0,0 +1,43 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.eos;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.EosCamera;
21
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
24
+
25
+public class EosTakePictureCommand extends EosCommand {
26
+
27
+    public EosTakePictureCommand(EosCamera camera) {
28
+        super(camera);
29
+    }
30
+
31
+    @Override
32
+    public void exec(IO io) {
33
+        io.handleCommand(this);
34
+        if (responseCode == Response.DeviceBusy) {
35
+            camera.onDeviceBusy(this, true);
36
+        }
37
+    }
38
+
39
+    @Override
40
+    public void encodeCommand(ByteBuffer b) {
41
+        encodeCommand(b, Operation.EosTakePicture);
42
+    }
43
+}

+ 47 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonAfDriveCommand.java

@@ -0,0 +1,47 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.NikonCamera;
21
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
24
+
25
+public class NikonAfDriveCommand extends NikonCommand {
26
+
27
+    public NikonAfDriveCommand(NikonCamera camera) {
28
+        super(camera);
29
+    }
30
+
31
+    @Override
32
+    public void exec(IO io) {
33
+        //        if (camera.isInActivationTypePhase()) {
34
+        //            return;
35
+        //        }
36
+        io.handleCommand(this);
37
+        if (getResponseCode() == Response.Ok) {
38
+            camera.onFocusStarted();
39
+            camera.enqueue(new NikonAfDriveDeviceReadyCommand(camera), 200);
40
+        }
41
+    }
42
+
43
+    @Override
44
+    public void encodeCommand(ByteBuffer b) {
45
+        encodeCommand(b, Operation.NikonAfDrive);
46
+    }
47
+}

+ 46 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonAfDriveDeviceReadyCommand.java

@@ -0,0 +1,46 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.NikonCamera;
21
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
24
+
25
+public class NikonAfDriveDeviceReadyCommand extends NikonCommand {
26
+
27
+    public NikonAfDriveDeviceReadyCommand(NikonCamera camera) {
28
+        super(camera);
29
+    }
30
+
31
+    @Override
32
+    public void exec(IO io) {
33
+        io.handleCommand(this);
34
+        if (getResponseCode() == Response.DeviceBusy) {
35
+            reset();
36
+            camera.enqueue(this, 200);
37
+        } else {
38
+            camera.onFocusEnded(getResponseCode() == Response.Ok);
39
+        }
40
+    }
41
+
42
+    @Override
43
+    public void encodeCommand(ByteBuffer b) {
44
+        encodeCommand(b, Operation.NikonDeviceReady);
45
+    }
46
+}

+ 54 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonCloseSessionAction.java

@@ -0,0 +1,54 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import com.remoteyourcam.usb.ptp.NikonCamera;
19
+import com.remoteyourcam.usb.ptp.PtpAction;
20
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
21
+import com.remoteyourcam.usb.ptp.PtpConstants.Datatype;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Property;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
24
+import com.remoteyourcam.usb.ptp.commands.CloseSessionCommand;
25
+import com.remoteyourcam.usb.ptp.commands.SetDevicePropValueCommand;
26
+
27
+public class NikonCloseSessionAction implements PtpAction {
28
+
29
+    private final NikonCamera camera;
30
+
31
+    public NikonCloseSessionAction(NikonCamera camera) {
32
+        this.camera = camera;
33
+    }
34
+
35
+    @Override
36
+    public void exec(IO io) {
37
+        SetDevicePropValueCommand setRecordingMedia = new SetDevicePropValueCommand(camera,
38
+                Property.NikonRecordingMedia, 0,
39
+                Datatype.uint8);
40
+        io.handleCommand(setRecordingMedia);
41
+
42
+        if (setRecordingMedia.getResponseCode() == Response.DeviceBusy) {
43
+            camera.onDeviceBusy(this, true);
44
+            return;
45
+        }
46
+
47
+        io.handleCommand(new CloseSessionCommand(camera));
48
+        camera.onSessionClosed();
49
+    }
50
+
51
+    @Override
52
+    public void reset() {
53
+    }
54
+}

+ 29 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonCommand.java

@@ -0,0 +1,29 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import com.remoteyourcam.usb.ptp.NikonCamera;
19
+import com.remoteyourcam.usb.ptp.commands.Command;
20
+
21
+public abstract class NikonCommand extends Command {
22
+
23
+    protected NikonCamera camera;
24
+
25
+    public NikonCommand(NikonCamera camera) {
26
+        super(camera);
27
+        this.camera = camera;
28
+    }
29
+}

+ 81 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonEventCheckCommand.java

@@ -0,0 +1,81 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import android.util.Log;
21
+
22
+import com.remoteyourcam.usb.AppConfig;
23
+import com.remoteyourcam.usb.ptp.NikonCamera;
24
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
25
+import com.remoteyourcam.usb.ptp.PtpConstants;
26
+import com.remoteyourcam.usb.ptp.PtpConstants.Event;
27
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
28
+
29
+public class NikonEventCheckCommand extends NikonCommand {
30
+
31
+    private static final String TAG = NikonEventCheckCommand.class.getSimpleName();
32
+
33
+    public NikonEventCheckCommand(NikonCamera camera) {
34
+        super(camera);
35
+    }
36
+
37
+    @Override
38
+    public void exec(IO io) {
39
+        io.handleCommand(this);
40
+    }
41
+
42
+    @Override
43
+    public void encodeCommand(ByteBuffer b) {
44
+        encodeCommand(b, Operation.NikonGetEvent);
45
+    }
46
+
47
+    @Override
48
+    protected void decodeData(ByteBuffer b, int length) {
49
+        int count = b.getShort();
50
+
51
+        while (count > 0) {
52
+            --count;
53
+
54
+            int eventCode = b.getShort();
55
+            int eventParam = b.getInt();
56
+
57
+            if (AppConfig.LOG) {
58
+                Log.i(TAG,
59
+                        String.format("event %s value %s(%04x)", PtpConstants.eventToString(eventCode),
60
+                                PtpConstants.propertyToString(eventParam), eventParam));
61
+            }
62
+
63
+            switch (eventCode) {
64
+            case Event.ObjectAdded:
65
+                camera.onEventObjectAdded(eventParam);
66
+                break;
67
+            case Event.DevicePropChanged:
68
+                camera.onEventDevicePropChanged(eventParam);
69
+                break;
70
+            case Event.CaptureComplete:
71
+                camera.onEventCaptureComplete();
72
+                break;
73
+            case Event.NikonObjectAddedInSdram:
74
+                //libgphoto2 相关处理
75
+                if (eventParam == 0) { eventParam = 0xffff001; }
76
+                camera.onEventObjectAdded(eventParam);
77
+                break;
78
+            }
79
+        }
80
+    }
81
+}

+ 70 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonGetLiveViewImageAction.java

@@ -0,0 +1,70 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import com.remoteyourcam.usb.ptp.NikonCamera;
19
+import com.remoteyourcam.usb.ptp.PtpAction;
20
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
21
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
23
+import com.remoteyourcam.usb.ptp.commands.SimpleCommand;
24
+import com.remoteyourcam.usb.ptp.model.LiveViewData;
25
+
26
+public class NikonGetLiveViewImageAction implements PtpAction {
27
+
28
+    private final NikonCamera camera;
29
+    private final LiveViewData reuse;
30
+
31
+    public NikonGetLiveViewImageAction(NikonCamera camera, LiveViewData reuse) {
32
+        this.camera = camera;
33
+        this.reuse = reuse;
34
+    }
35
+
36
+    @Override
37
+    public void exec(IO io) {
38
+        SimpleCommand simpleCmd = new SimpleCommand(camera, Operation.NikonStartLiveView);
39
+        io.handleCommand(simpleCmd);
40
+
41
+        if (simpleCmd.getResponseCode() != Response.Ok) {
42
+            return;
43
+        }
44
+
45
+        SimpleCommand deviceReady = new SimpleCommand(camera, Operation.NikonDeviceReady);
46
+        for (int i = 0; i < 10; ++i) {
47
+            try {
48
+                Thread.sleep(300);
49
+            } catch (InterruptedException e) {
50
+                // nop
51
+            }
52
+
53
+            deviceReady.reset();
54
+            io.handleCommand(deviceReady);
55
+            if (deviceReady.getResponseCode() == Response.DeviceBusy) {
56
+                // still waiting
57
+            } else if (deviceReady.getResponseCode() == Response.Ok) {
58
+                camera.onLiveViewRestarted();
59
+                io.handleCommand(new NikonGetLiveViewImageCommand(camera, reuse));
60
+                return;
61
+            } else {
62
+                return;
63
+            }
64
+        }
65
+    }
66
+
67
+    @Override
68
+    public void reset() {
69
+    }
70
+}

+ 158 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonGetLiveViewImageCommand.java

@@ -0,0 +1,158 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import android.graphics.BitmapFactory;
19
+import android.graphics.BitmapFactory.Options;
20
+import android.util.Log;
21
+
22
+import com.remoteyourcam.usb.AppConfig;
23
+import com.remoteyourcam.usb.ptp.NikonCamera;
24
+import com.remoteyourcam.usb.ptp.PacketUtil;
25
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
26
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
27
+import com.remoteyourcam.usb.ptp.PtpConstants.Product;
28
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
29
+import com.remoteyourcam.usb.ptp.model.LiveViewData;
30
+
31
+import java.nio.ByteBuffer;
32
+import java.nio.ByteOrder;
33
+
34
+public class NikonGetLiveViewImageCommand extends NikonCommand {
35
+
36
+    private static boolean haveAddedDumpToAcra = false;
37
+
38
+    private static final String TAG = NikonGetLiveViewImageCommand.class.getSimpleName();
39
+    private static byte[] tmpStorage = new byte[0x4000];
40
+    private final Options options;
41
+    private LiveViewData data;
42
+
43
+    public NikonGetLiveViewImageCommand(NikonCamera camera, LiveViewData data) {
44
+        super(camera);
45
+        this.data = data;
46
+        if (data == null) {
47
+            this.data = new LiveViewData();
48
+            //this.data.histogram = ByteBuffer.allocate(1024 * 4);
49
+            //this.data.histogram.order(ByteOrder.LITTLE_ENDIAN);
50
+        } else {
51
+            this.data = data;
52
+        }
53
+        options = new BitmapFactory.Options();
54
+        options.inBitmap = this.data.bitmap;
55
+        options.inSampleSize = 1;
56
+        options.inTempStorage = tmpStorage;
57
+        this.data.bitmap = null;
58
+    }
59
+
60
+    @Override
61
+    public void exec(IO io) {
62
+        if (!camera.isLiveViewOpen()) {
63
+            return;
64
+        }
65
+        io.handleCommand(this);
66
+        if (responseCode == Response.DeviceBusy) {
67
+            camera.onDeviceBusy(this, true);
68
+            return;
69
+        }
70
+        data.hasHistogram = false;
71
+        if (this.data.bitmap != null && responseCode == Response.Ok) {
72
+            camera.onLiveViewReceived(data);
73
+        } else {
74
+            camera.onLiveViewReceived(null);
75
+        }
76
+    }
77
+
78
+    @Override
79
+    public void encodeCommand(ByteBuffer b) {
80
+        encodeCommand(b, Operation.NikonGetLiveViewImage);
81
+    }
82
+
83
+    @Override
84
+    protected void decodeData(ByteBuffer b, int length) {
85
+        if (length <= 128) {
86
+            return;
87
+        }
88
+
89
+        data.hasAfFrame = false;
90
+
91
+        int productId = camera.getProductId();
92
+        int start = b.position();
93
+        int pictureOffset;
94
+
95
+        switch (productId) {
96
+        case Product.NikonD5000:
97
+        case Product.NikonD3S:
98
+        case Product.NikonD90:
99
+            pictureOffset = 128;
100
+            break;
101
+        case Product.NikonD3X:
102
+        case Product.NikonD300S:
103
+        case Product.NikonD3:
104
+        case Product.NikonD300:
105
+        case Product.NikonD700:
106
+            pictureOffset = 64;
107
+            break;
108
+        case Product.NikonD7000:
109
+        case Product.NikonD5100:
110
+            pictureOffset = 384;
111
+            break;
112
+        default:
113
+            return;
114
+        }
115
+
116
+        b.order(ByteOrder.BIG_ENDIAN);
117
+
118
+        // read af frame
119
+        {
120
+            data.hasAfFrame = true;
121
+
122
+            int jpegImageWidth = b.getShort() & 0xFFFF;
123
+            int jpegImageHeight = b.getShort() & 0xFFFF;
124
+            int wholeWidth = b.getShort() & 0xFFFF;
125
+            int wholeHeight = b.getShort() & 0xFFFF;
126
+
127
+            float multX = jpegImageWidth / (float) wholeWidth;
128
+            float multY = jpegImageHeight / (float) wholeHeight;
129
+
130
+            b.position(start + 16);
131
+            data.nikonWholeWidth = wholeWidth;
132
+            data.nikonWholeHeight = wholeHeight;
133
+            data.nikonAfFrameWidth = (int) ((b.getShort() & 0xFFFF) * multX);
134
+            data.nikonAfFrameHeight = (int) ((b.getShort() & 0xFFFF) * multY);
135
+            data.nikonAfFrameCenterX = (int) ((b.getShort() & 0xFFFF) * multX);
136
+            data.nikonAfFrameCenterY = (int) ((b.getShort() & 0xFFFF) * multY);
137
+        }
138
+
139
+        b.order(ByteOrder.LITTLE_ENDIAN);
140
+
141
+        b.position(start + pictureOffset);
142
+
143
+        if (b.remaining() <= 128) {
144
+            data.bitmap = null;
145
+            return;
146
+        }
147
+
148
+        try {
149
+            data.bitmap = BitmapFactory.decodeByteArray(b.array(), b.position(), length - b.position(), options);
150
+        } catch (RuntimeException e) {
151
+            Log.e(TAG, "decoding failed " + e.toString());
152
+            Log.e(TAG, e.getLocalizedMessage());
153
+            if (AppConfig.LOG) {
154
+                PacketUtil.logHexdump(TAG, b.array(), start, 512);
155
+            }
156
+        }
157
+    }
158
+}

+ 51 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonGetVendorPropCodesCommand.java

@@ -0,0 +1,51 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.NikonCamera;
21
+import com.remoteyourcam.usb.ptp.PacketUtil;
22
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
24
+
25
+public class NikonGetVendorPropCodesCommand extends NikonCommand {
26
+
27
+    private int[] propertyCodes = new int[0];
28
+
29
+    public NikonGetVendorPropCodesCommand(NikonCamera camera) {
30
+        super(camera);
31
+    }
32
+
33
+    public int[] getPropertyCodes() {
34
+        return propertyCodes;
35
+    }
36
+
37
+    @Override
38
+    public void exec(IO io) {
39
+        throw new UnsupportedOperationException();
40
+    }
41
+
42
+    @Override
43
+    public void encodeCommand(ByteBuffer b) {
44
+        encodeCommand(b, Operation.NikonGetVendorPropCodes);
45
+    }
46
+
47
+    @Override
48
+    protected void decodeData(ByteBuffer b, int length) {
49
+        propertyCodes = PacketUtil.readU16Array(b);
50
+    }
51
+}

+ 69 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonOpenSessionAction.java

@@ -0,0 +1,69 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import com.remoteyourcam.usb.ptp.NikonCamera;
19
+import com.remoteyourcam.usb.ptp.PtpAction;
20
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
21
+import com.remoteyourcam.usb.ptp.PtpConstants;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Datatype;
23
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
24
+import com.remoteyourcam.usb.ptp.PtpConstants.Property;
25
+import com.remoteyourcam.usb.ptp.commands.OpenSessionCommand;
26
+import com.remoteyourcam.usb.ptp.commands.SetDevicePropValueCommand;
27
+
28
+public class NikonOpenSessionAction implements PtpAction {
29
+
30
+    private final NikonCamera camera;
31
+
32
+    public NikonOpenSessionAction(NikonCamera camera) {
33
+        this.camera = camera;
34
+    }
35
+
36
+    @Override
37
+    public void exec(IO io) {
38
+        OpenSessionCommand openSession = new OpenSessionCommand(camera);
39
+        io.handleCommand(openSession);
40
+        if (openSession.getResponseCode() == PtpConstants.Response.Ok) {
41
+            if (camera.hasSupportForOperation(Operation.NikonGetVendorPropCodes)) {
42
+                NikonGetVendorPropCodesCommand getPropCodes = new NikonGetVendorPropCodesCommand(camera);
43
+                io.handleCommand(getPropCodes);
44
+                SetDevicePropValueCommand c = new SetDevicePropValueCommand(camera, Property.NikonRecordingMedia, 1,
45
+                        Datatype.uint8);
46
+                io.handleCommand(c);
47
+                if (getPropCodes.getResponseCode() == PtpConstants.Response.Ok
48
+                        && c.getResponseCode() == PtpConstants.Response.Ok) {
49
+                    camera.setVendorPropCodes(getPropCodes.getPropertyCodes());
50
+                    camera.onSessionOpened();
51
+                } else {
52
+                    camera.onPtpError(String.format(
53
+                            "Couldn't read device property codes! Open session command failed with error code \"%s\"",
54
+                            PtpConstants.responseToString(getPropCodes.getResponseCode())));
55
+                }
56
+            } else {
57
+                camera.onSessionOpened();
58
+            }
59
+        } else {
60
+            camera.onPtpError(String.format(
61
+                    "Couldn't open session! Open session command failed with error code \"%s\"",
62
+                    PtpConstants.responseToString(openSession.getResponseCode())));
63
+        }
64
+    }
65
+
66
+    @Override
67
+    public void reset() {
68
+    }
69
+}

+ 66 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonStartLiveViewAction.java

@@ -0,0 +1,66 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import com.remoteyourcam.usb.ptp.NikonCamera;
19
+import com.remoteyourcam.usb.ptp.PtpAction;
20
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
21
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
23
+import com.remoteyourcam.usb.ptp.commands.SimpleCommand;
24
+
25
+public class NikonStartLiveViewAction implements PtpAction {
26
+
27
+    private final NikonCamera camera;
28
+
29
+    public NikonStartLiveViewAction(NikonCamera camera) {
30
+        this.camera = camera;
31
+    }
32
+
33
+    @Override
34
+    public void exec(IO io) {
35
+        SimpleCommand simpleCmd = new SimpleCommand(camera, Operation.NikonStartLiveView);
36
+        io.handleCommand(simpleCmd);
37
+
38
+        if (simpleCmd.getResponseCode() != Response.Ok) {
39
+            return;
40
+        }
41
+
42
+        SimpleCommand deviceReady = new SimpleCommand(camera, Operation.NikonDeviceReady);
43
+        for (int i = 0; i < 10; ++i) {
44
+            try {
45
+                Thread.sleep(300);
46
+            } catch (InterruptedException e) {
47
+                // nop
48
+            }
49
+
50
+            deviceReady.reset();
51
+            io.handleCommand(deviceReady);
52
+            if (deviceReady.getResponseCode() == Response.DeviceBusy) {
53
+                // still waiting
54
+            } else if (deviceReady.getResponseCode() == Response.Ok) {
55
+                camera.onLiveViewStarted();
56
+                return;
57
+            } else {
58
+                return;
59
+            }
60
+        }
61
+    }
62
+
63
+    @Override
64
+    public void reset() {
65
+    }
66
+}

+ 54 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/commands/nikon/NikonStopLiveViewAction.java

@@ -0,0 +1,54 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.commands.nikon;
17
+
18
+import com.remoteyourcam.usb.ptp.NikonCamera;
19
+import com.remoteyourcam.usb.ptp.PtpAction;
20
+import com.remoteyourcam.usb.ptp.PtpCamera.IO;
21
+import com.remoteyourcam.usb.ptp.PtpConstants.Operation;
22
+import com.remoteyourcam.usb.ptp.PtpConstants.Response;
23
+import com.remoteyourcam.usb.ptp.commands.SimpleCommand;
24
+
25
+public class NikonStopLiveViewAction implements PtpAction {
26
+
27
+    private final NikonCamera camera;
28
+    private final boolean notifyUser;
29
+
30
+    public NikonStopLiveViewAction(NikonCamera camera, boolean notifyUser) {
31
+        this.camera = camera;
32
+        this.notifyUser = notifyUser;
33
+    }
34
+
35
+    @Override
36
+    public void exec(IO io) {
37
+        SimpleCommand simpleCmd = new SimpleCommand(camera, Operation.NikonEndLiveView);
38
+        io.handleCommand(simpleCmd);
39
+
40
+        if (simpleCmd.getResponseCode() == Response.DeviceBusy) {
41
+            camera.onDeviceBusy(this, true);
42
+        } else {
43
+            if (notifyUser) {
44
+                camera.onLiveViewStopped();
45
+            } else {
46
+                camera.onLiveViewStoppedInternal();
47
+            }
48
+        }
49
+    }
50
+
51
+    @Override
52
+    public void reset() {
53
+    }
54
+}

+ 113 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/model/DeviceInfo.java

@@ -0,0 +1,113 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.model;
17
+
18
+import java.nio.ByteBuffer;
19
+import java.util.Arrays;
20
+
21
+import com.remoteyourcam.usb.ptp.PacketUtil;
22
+import com.remoteyourcam.usb.ptp.PtpConstants;
23
+
24
+/**
25
+ * Device info data set as defined by PTP standard.
26
+ */
27
+public class DeviceInfo {
28
+
29
+    public short standardVersion;
30
+    public int vendorExtensionId;
31
+    public short vendorExtensionVersion;
32
+    public String vendorExtensionDesc;
33
+    public short functionalMode;
34
+    public int[] operationsSupported;
35
+    public int[] eventsSupported;
36
+    public int[] devicePropertiesSupported;
37
+    public int[] captureFormats;
38
+    public int[] imageFormats;
39
+    public String manufacture;
40
+    public String model;
41
+    public String deviceVersion;
42
+    public String serialNumber;
43
+
44
+    public DeviceInfo(ByteBuffer b, int length) {
45
+        decode(b, length);
46
+    }
47
+
48
+    public DeviceInfo() {
49
+    }
50
+
51
+    public void decode(ByteBuffer b, int length) {
52
+        standardVersion = b.getShort();
53
+        vendorExtensionId = b.getInt();
54
+        vendorExtensionVersion = b.getShort();
55
+        vendorExtensionDesc = PacketUtil.readString(b);
56
+        functionalMode = b.getShort();
57
+        operationsSupported = PacketUtil.readU16Array(b);
58
+        eventsSupported = PacketUtil.readU16Array(b);
59
+        devicePropertiesSupported = PacketUtil.readU16Array(b);
60
+        captureFormats = PacketUtil.readU16Array(b);
61
+        imageFormats = PacketUtil.readU16Array(b);
62
+        manufacture = PacketUtil.readString(b);
63
+        model = PacketUtil.readString(b);
64
+        deviceVersion = PacketUtil.readString(b);
65
+        serialNumber = PacketUtil.readString(b);
66
+    }
67
+
68
+    public void encode(ByteBuffer b) {
69
+        b.putShort(standardVersion);
70
+        b.putInt(vendorExtensionId);
71
+        b.putInt(vendorExtensionVersion);
72
+        PacketUtil.writeString(b, "");
73
+        b.putShort(functionalMode);
74
+        PacketUtil.writeU16Array(b, new int[0]);
75
+        PacketUtil.writeU16Array(b, new int[0]);
76
+        PacketUtil.writeU16Array(b, new int[0]);
77
+        PacketUtil.writeU16Array(b, new int[0]);
78
+        PacketUtil.writeU16Array(b, new int[0]);
79
+        PacketUtil.writeString(b, "");
80
+        PacketUtil.writeString(b, "");
81
+        PacketUtil.writeString(b, "");
82
+    }
83
+
84
+    @Override
85
+    public String toString() {
86
+        // Changes here have to reflect changes in PtpConstants.main()
87
+        StringBuilder b = new StringBuilder();
88
+        b.append("DeviceInfo\n");
89
+        b.append("StandardVersion: ").append(standardVersion).append('\n');
90
+        b.append("VendorExtensionId: ").append(vendorExtensionId).append('\n');
91
+        b.append("VendorExtensionVersion: ").append(vendorExtensionVersion).append('\n');
92
+        b.append("VendorExtensionDesc: ").append(vendorExtensionDesc).append('\n');
93
+        b.append("FunctionalMode: ").append(functionalMode).append('\n');
94
+        appendU16Array(b, "OperationsSupported", PtpConstants.Operation.class, operationsSupported);
95
+        appendU16Array(b, "EventsSupported", PtpConstants.Event.class, eventsSupported);
96
+        appendU16Array(b, "DevicePropertiesSupported", PtpConstants.Property.class, devicePropertiesSupported);
97
+        appendU16Array(b, "CaptureFormats", PtpConstants.ObjectFormat.class, captureFormats);
98
+        appendU16Array(b, "ImageFormats", PtpConstants.ObjectFormat.class, imageFormats);
99
+        b.append("Manufacture: ").append(manufacture).append('\n');
100
+        b.append("Model: ").append(model).append('\n');
101
+        b.append("DeviceVersion: ").append(deviceVersion).append('\n');
102
+        b.append("SerialNumber: ").append(serialNumber).append('\n');
103
+        return b.toString();
104
+    }
105
+
106
+    private static void appendU16Array(StringBuilder b, String name, Class<?> cl, int[] a) {
107
+        Arrays.sort(a);
108
+        b.append(name).append(":\n");
109
+        for (int i = 0; i < a.length; ++i) {
110
+            b.append("    ").append(PtpConstants.constantToString(cl, a[i])).append('\n');
111
+        }
112
+    }
113
+}

+ 102 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/model/DevicePropDesc.java

@@ -0,0 +1,102 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.model;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.PacketUtil;
21
+import com.remoteyourcam.usb.ptp.PtpConstants.Datatype;
22
+
23
+public class DevicePropDesc {
24
+
25
+    public int code;
26
+    public int datatype;
27
+    public boolean readOnly;
28
+    public int factoryDefault;
29
+    public int currentValue;
30
+    public int[] description;
31
+
32
+    public DevicePropDesc() {
33
+    }
34
+
35
+    public DevicePropDesc(ByteBuffer b, int length) {
36
+        decode(b, length);
37
+    }
38
+
39
+    public void decode(ByteBuffer b, int length) {
40
+        code = b.getShort() & 0xFFFF;
41
+        datatype = b.getShort() & 0xFFFF;
42
+        readOnly = b.get() == 0;
43
+
44
+        if (datatype == Datatype.int8 || datatype == Datatype.uint8) {
45
+            factoryDefault = b.get() & 0xFF;
46
+            currentValue = b.get() & 0xFF;
47
+            int form = b.get();
48
+            if (form == 2) {
49
+                description = PacketUtil.readU8Enumeration(b);
50
+            } else if (form == 1) {
51
+                int mini = b.get();
52
+                int maxi = b.get();
53
+                int step = b.get();
54
+                description = new int[(maxi - mini) / step + 1];
55
+                for (int i = 0; i < description.length; ++i) {
56
+                    description[i] = mini + step * i;
57
+                }
58
+            }
59
+        } else if (datatype == Datatype.uint16) {
60
+            factoryDefault = b.getShort() & 0xFFFF;
61
+            currentValue = b.getShort() & 0xFFFF;
62
+            int form = b.get();
63
+            if (form == 2) {
64
+                description = PacketUtil.readU16Enumeration(b);
65
+            } else if (form == 1) {
66
+                int mini = b.getShort() & 0xFFFF;
67
+                int maxi = b.getShort() & 0xFFFF;
68
+                int step = b.getShort() & 0xFFFF;
69
+                description = new int[(maxi - mini) / step + 1];
70
+                for (int i = 0; i < description.length; ++i) {
71
+                    description[i] = mini + step * i;
72
+                }
73
+            }
74
+        } else if (datatype == Datatype.int16) {
75
+            factoryDefault = b.getShort();
76
+            currentValue = b.getShort();
77
+            int form = b.get();
78
+            if (form == 2) {
79
+                description = PacketUtil.readS16Enumeration(b);
80
+            } else if (form == 1) {
81
+                int mini = b.getShort();
82
+                int maxi = b.getShort();
83
+                int step = b.getShort();
84
+                description = new int[(maxi - mini) / step + 1];
85
+                for (int i = 0; i < description.length; ++i) {
86
+                    description[i] = mini + step * i;
87
+                }
88
+            }
89
+        } else if (datatype == Datatype.int32 || datatype == Datatype.uint32) {
90
+            factoryDefault = b.getInt();
91
+            currentValue = b.getInt();
92
+            int form = b.get();
93
+            if (form == 2) {
94
+                description = PacketUtil.readU32Enumeration(b);
95
+            }
96
+        }
97
+
98
+        if (description == null) {
99
+            description = new int[0];
100
+        }
101
+    }
102
+}

+ 44 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/model/LiveViewData.java

@@ -0,0 +1,44 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.model;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import android.graphics.Bitmap;
21
+
22
+public class LiveViewData {
23
+
24
+    public Bitmap bitmap;
25
+
26
+    public int zoomFactor;
27
+    public int zoomRectLeft;
28
+    public int zoomRectTop;
29
+    public int zoomRectRight;
30
+    public int zoomRectBottom;
31
+
32
+    public boolean hasHistogram;
33
+    public ByteBuffer histogram;
34
+
35
+    // dimensions are in bitmap size
36
+    public boolean hasAfFrame;
37
+    public int nikonAfFrameCenterX;
38
+    public int nikonAfFrameCenterY;
39
+    public int nikonAfFrameWidth;
40
+    public int nikonAfFrameHeight;
41
+
42
+    public int nikonWholeWidth;
43
+    public int nikonWholeHeight;
44
+}

+ 101 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/model/ObjectInfo.java

@@ -0,0 +1,101 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.model;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.PacketUtil;
21
+import com.remoteyourcam.usb.ptp.PtpConstants;
22
+
23
+/**
24
+ * Object info data set as defined by the PTP standard.
25
+ */
26
+public class ObjectInfo {
27
+
28
+    public int storageId;
29
+    public int objectFormat;
30
+    public int protectionStatus;
31
+    public int objectCompressedSize;
32
+    public int thumbFormat;
33
+    public int thumbCompressedSize;
34
+    public int thumbPixWidth;
35
+    public int thumbPixHeight;
36
+    public int imagePixWidth;
37
+    public int imagePixHeight;
38
+    public int imageBitDepth;
39
+    public int parentObject;
40
+    public int associationType;
41
+    public int associationDesc;
42
+    public int sequenceNumber;
43
+    public String filename;
44
+    public String captureDate;
45
+    public String modificationDate;
46
+    public int keywords;
47
+
48
+    public ObjectInfo() {
49
+    }
50
+
51
+    public ObjectInfo(ByteBuffer b, int length) {
52
+        decode(b, length);
53
+    }
54
+
55
+    public void decode(ByteBuffer b, int length) {
56
+        storageId = b.getInt();
57
+        objectFormat = b.getShort();
58
+        protectionStatus = b.getShort();
59
+        objectCompressedSize = b.getInt();
60
+        thumbFormat = b.getShort();
61
+        thumbCompressedSize = b.getInt();
62
+        thumbPixWidth = b.getInt();
63
+        thumbPixHeight = b.getInt();
64
+        imagePixWidth = b.getInt();
65
+        imagePixHeight = b.getInt();
66
+        imageBitDepth = b.getInt();
67
+        parentObject = b.getInt();
68
+        associationType = b.getShort();
69
+        associationDesc = b.getInt();
70
+        sequenceNumber = b.getInt();
71
+        filename = PacketUtil.readString(b);
72
+        captureDate = PacketUtil.readString(b);
73
+        modificationDate = PacketUtil.readString(b);
74
+        keywords = b.get(); // string, not used on camera?
75
+    }
76
+
77
+    @Override
78
+    public String toString() {
79
+        StringBuilder b = new StringBuilder();
80
+        b.append("ObjectInfo\n");
81
+        b.append("StorageId: ").append(String.format("0x%08x\n", storageId));
82
+        b.append("ObjectFormat: ").append(PtpConstants.objectFormatToString(objectFormat)).append('\n');
83
+        b.append("ProtectionStatus: ").append(protectionStatus).append('\n');
84
+        b.append("ObjectCompressedSize: ").append(objectCompressedSize).append('\n');
85
+        b.append("ThumbFormat: ").append(PtpConstants.objectFormatToString(thumbFormat)).append('\n');
86
+        b.append("ThumbCompressedSize: ").append(thumbCompressedSize).append('\n');
87
+        b.append("ThumbPixWdith: ").append(thumbPixWidth).append('\n');
88
+        b.append("ThumbPixHeight: ").append(thumbPixHeight).append('\n');
89
+        b.append("ImagePixWidth: ").append(imagePixWidth).append('\n');
90
+        b.append("ImagePixHeight: ").append(imagePixHeight).append('\n');
91
+        b.append("ImageBitDepth: ").append(imageBitDepth).append('\n');
92
+        b.append("ParentObject: ").append(String.format("0x%08x", parentObject)).append('\n');
93
+        b.append("AssociationType: ").append(associationType).append('\n');
94
+        b.append("AssociatonDesc: ").append(associationDesc).append('\n');
95
+        b.append("Filename: ").append(filename).append('\n');
96
+        b.append("CaptureDate: ").append(captureDate).append('\n');
97
+        b.append("ModificationDate: ").append(modificationDate).append('\n');
98
+        b.append("Keywords: ").append(keywords).append('\n');
99
+        return b.toString();
100
+    }
101
+}

+ 47 - 0
ryc/src/main/java/com/remoteyourcam/usb/ptp/model/StorageInfo.java

@@ -0,0 +1,47 @@
1
+/**
2
+ * Copyright 2013 Nils Assbeck, Guersel Ayaz and Michael Zoech
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ *     http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+package com.remoteyourcam.usb.ptp.model;
17
+
18
+import java.nio.ByteBuffer;
19
+
20
+import com.remoteyourcam.usb.ptp.PacketUtil;
21
+
22
+public class StorageInfo {
23
+
24
+    public int storageType;
25
+    public int filesystemType;
26
+    public int accessCapability;
27
+    public long maxCapacity;
28
+    public long freeSpaceInBytes;
29
+    public int freeSpaceInImages;
30
+    public String storageDescription;
31
+    public String volumeLabel;
32
+
33
+    public StorageInfo(ByteBuffer b, int length) {
34
+        decode(b, length);
35
+    }
36
+
37
+    private void decode(ByteBuffer b, int length) {
38
+        storageType = b.getShort() & 0xffff;
39
+        filesystemType = b.getShort() & 0xffff;
40
+        accessCapability = b.getShort() & 0xff;
41
+        maxCapacity = b.getLong();
42
+        freeSpaceInBytes = b.getLong();
43
+        freeSpaceInImages = b.getInt();
44
+        storageDescription = PacketUtil.readString(b);
45
+        volumeLabel = PacketUtil.readString(b);
46
+    }
47
+}

+ 3 - 0
ryc/src/main/res/values/strings.xml

@@ -0,0 +1,3 @@
1
+<resources>
2
+    <string name="app_name">ryc</string>
3
+</resources>

+ 1 - 1
settings.gradle

@@ -1 +1 @@
1
-include ':app', ':common', ':views'
1
+include ':app', ':common', ':views', ':ryc'

Kodo/kodo - Gogs: Go Git Service

1 Commits (33fb7521a7c22e41ed73e48c6dbbbce5b8f0f358)

Autor SHA1 Mensaje Fecha
  Brightcells af2b3f483f change download.html to be generated from download.tmpl.html %!s(int64=9) %!d(string=hace) años