2016-01-01 6 views
7

मैं एक साधारण मोर्स कोड ऐप विकसित कर रहा हूं जो अंग्रेजी को मोर्स में बदल देता है और इसके विपरीत। जब उपयोगकर्ता एक विशिष्ट पत्र में प्रवेश करता है तो डिवाइस पर कैमरा लाइट को उस मोर्से अनुक्रम को फ्लैश करना होता है, उदाहरण के लिए:एक विशिष्ट अनुक्रम में कैमरा लाइट फ्लैश कैसे बनाएं?

ए = डॉट डैश 200 एमएस के साथ डॉट डैश और डैश 500ms है।

समस्या यह है कि मुझे यकीन नहीं है कि यह कैसे प्राप्त किया जाए। मैं लूप का उपयोग करके इसे हल करने का प्रयास कर रहा हूं लेकिन मुझे इसे हल करने के लिए प्रतीत नहीं होता है। नीचे कोड है जिसे मैं वर्तमान में समायोजित करने की कोशिश कर रहा हूं - मुझे यकीन नहीं है कि लूप का उपयोग करना सबसे अच्छा तरीका है लेकिन मैं किसी अन्य तरीके से नहीं सोच सकता। क्या किसी के पास कोई सुझाव/विचार हैं, यदि ऐसा है तो उनकी बहुत सराहना की जाएगी।

public void flashTranslation() { 

    char[] cArray = message.toCharArray(); 

    for (int i = 0; i < cArray.length; i++) { 


     if (cArray[i] == '.') { 
      turnOn(); 

      new Handler().postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        turnOff(); 

        camera.release(); 
       } 
      }, dot); 

     } else { 

      turnOn(); 

      new Handler().postDelayed(new Runnable() { 

       @Override 
       public void run() { 
        turnOff(); 

        camera.release(); 
       } 
      }, dash); 
     } 

    } 
} 

public void turnOn() { 

    if (camera != null) { 
     Camera.Parameters p = camera.getParameters(); 
     p.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
     camera.setParameters(p); 
     camera.startPreview(); 
    } 


} 

public void turnOff() { 

    if (camera != null) { 
     Camera.Parameters p = camera.getParameters(); 
     p.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 
     camera.setParameters(p); 
     camera.stopPreview(); 
    } 
} 

उत्तर

1

कारण इस कोड को आप मुद्दों दे रही है हो सकता है इस तथ्य के बीच प्रकाश को बंद करने और पर फिर से वापस मोड़ में कुछ ही समय है कि वहाँ के कारण है।

एक पल में, प्रकाश चालू हो जाता है। फिर, रननेबल इसे बंद करने से पहले 200ms इंतजार कर रहा है। इसे बंद करने के बाद, यह तुरंत इसे फिर से चालू कर देगा, जिसका अर्थ यह है कि यद्यपि इसे चालू करने के बीच का बिंदु 200ms था, लेकिन इसे वापस चालू करने के बीच का समय (निकट) 0ms था। यह प्रकाश को किसी भी उद्देश्य के बिना लगातार चालू होने का कारण बन सकता है।

अगर मुझे गलत नहीं लगता है, तो एक नया पोस्ट तैयार करने वाला हैडलर बस एक नए धागे पर एक रननेबल निष्पादित करता है, जो वास्तव में आप चाहते हैं कि आप इस कतार में मोर्स को पढ़ना चाहते हैं। इस तरह

कोशिश कुछ:

public void flashTranslation() { 
    int offIntervalTime = 50; 

    char[] cArray = message.toCharArray(); 

    for (int i = 0; i < cArray.length; i++) { 
     if (cArray[i] == '.') { 
      turnOn(); 
      Thread.sleep(dot); 

      turnOff(); 
      Thread.sleep(offIntervalTime); 
     } else { 
      turnOn(); 
      Thread.sleep(dash); 

      turnOff(); 
      Thread.sleep(offIntervalTime); 
     } 
    } 
} 

आप शायद भी अपवाद धागा रुकावट के लिए से निपटने को लागू करने की आवश्यकता होगी, लेकिन यह है कि तुम क्या उपयोग कर सकते हैं की बुनियादी संरचना है। ध्यान दें कि एक अंतरालटाइम चर है। इसका उपयोग निरंतर अंतराल को परिभाषित करने के लिए किया जाता है जिसमें प्रकाश बंद होना चाहिए, इस प्रकार यह वास्तव में फ्लैश करने की इजाजत देता है।

जब आप फ़ंक्शन को कॉल करें, यकीन है कि यह प्राथमिक धागा ऑन नहीं है, तो यह है जहाँ आप इसे कहते तरह कुछ कार्य करें:

Thread morseMessageThread = new Thread(new Runnable() { flashTranslation() }); 
morseMessageThread.start(); 
+0

आप अपने जवाब के लिए बहुत बहुत धन्यवाद। इस बारे में शोध करते समय मैं थ्रेड में आया लेकिन मैं उन्हें पूरी तरह से समझ नहीं पा रहा हूं - लेकिन मैं निश्चित रूप से यह सीखने जा रहा हूं कि वे कैसे काम करते हैं। मैंने प्रकाश मोड़ने के दौरान एक समय अंतराल को शामिल करने के बारे में नहीं सोचा था - यह ऐसा कुछ है जो मेरे साथ कभी नहीं हुआ। मैंने आपके द्वारा प्रदान किए गए कोड को शामिल किया है और मुझे लगता है कि कुछ समय के साथ मैं इसे एक तरह से काम करने के लिए प्राप्त कर सकता हूं! फिर से धन्यवाद, एक बहुत स्पष्ट और संक्षिप्त जवाब। –

संबंधित मुद्दे