lightmeter_helper.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "lightmeter_helper.h"
  2. #include "lightmeter_config.h"
  3. static const float aperture_numbers[] = {
  4. [AP_1] = 1.0,
  5. [AP_1_4] = 1.4,
  6. [AP_2] = 2.0,
  7. [AP_2_8] = 2.8,
  8. [AP_4] = 4.0,
  9. [AP_5_6] = 5.6,
  10. [AP_8] = 8,
  11. [AP_11] = 11,
  12. [AP_16] = 16,
  13. [AP_22] = 22,
  14. [AP_32] = 32,
  15. [AP_45] = 45,
  16. [AP_64] = 64,
  17. [AP_90] = 90,
  18. [AP_128] = 128,
  19. };
  20. static const float time_numbers[] = {
  21. [SPEED_8000] = 1.0 / 8000, [SPEED_4000] = 1.0 / 4000, [SPEED_2000] = 1.0 / 2000,
  22. [SPEED_1000] = 1.0 / 1000, [SPEED_500] = 1.0 / 500, [SPEED_250] = 1.0 / 250,
  23. [SPEED_125] = 1.0 / 125, [SPEED_60] = 1.0 / 60, [SPEED_30] = 1.0 / 30,
  24. [SPEED_15] = 1.0 / 15, [SPEED_8] = 1.0 / 8, [SPEED_4] = 1.0 / 4,
  25. [SPEED_2] = 1.0 / 2, [SPEED_1S] = 1.0, [SPEED_2S] = 2.0,
  26. [SPEED_4S] = 4.0, [SPEED_8S] = 8.0, [SPEED_15S] = 15.0,
  27. [SPEED_30S] = 30.0,
  28. };
  29. float lux2ev(float lux) {
  30. return log2(lux / 2.5);
  31. }
  32. float getMinDistance(float x, float v1, float v2) {
  33. if(x - v1 > v2 - x) {
  34. return v2;
  35. }
  36. return v1;
  37. }
  38. // Convert calculated aperture value to photography style aperture value.
  39. float normalizeAperture(float a) {
  40. for(int i = 0; i < AP_NUM; i++) {
  41. float a1 = aperture_numbers[i];
  42. float a2 = aperture_numbers[i + 1];
  43. if(a1 < a && a2 >= a) {
  44. return getMinDistance(a, a1, a2);
  45. }
  46. }
  47. return 0;
  48. }
  49. float normalizeTime(float a) {
  50. for(int i = 0; i < SPEED_NUM; i++) {
  51. float a1 = time_numbers[i];
  52. float a2 = time_numbers[i + 1];
  53. if(a1 < a && a2 >= a) {
  54. return getMinDistance(a, a1, a2);
  55. }
  56. }
  57. return 0;
  58. }