2015.05.18 00:21


Java Code Examples for javax.bluetooth.DiscoveryAgent

The following code examples are extracted from open source projects. You can click  to vote up the examples you like. Your votes will be used in an intelligent system to get more and better code examples.

Code Example 1:

  9 
vote

From project lego-mindstorms-praktikum, under directory /src/basis/.

Source BTRaceStartClient.java

public void searchForDevices(){
  LocalDevice localDevice;
  DiscoveryAgent discoveryAgent;
  try {
    localDevice=LocalDevice.getLocalDevice();
    discoveryAgent=localDevice.getDiscoveryAgent();
    discoveryAgent.startInquiry(DiscoveryAgent.GIAC,this);
  }
 catch (  BluetoothStateException ex) {
  }
}
 

Code Example 2:

  7 
vote

From project j2mepolish, under directory /enough-polish-j2me/source/src/de/enough/polish/bluetooth/.

Source DiscoveryHelper.java

/** 
 * Finds all nearby devices in the specified search mode
 * @param searchMode the search mode, either DiscoveryAgent.GIAC or DiscoveryAgent.LIAC. If in doubt use GIAC.
 * @param deviceClassMajor the major version of device classes that should be returned, -1 if all devices should be retrieved
 * @param deviceClassMinor the minor version of device classes that should be returned, -1 if all devices should be retrieved
 * @return an array of all found devices, can be empty but not null
 * @throws BluetoothStateException when there was an error during search
 */
private BluetoothDevice[] findDevicesImpl(int searchMode,int deviceClassMajor,int deviceClassMinor) throws BluetoothStateException {
  this.searchedClassMajor=deviceClassMajor;
  this.searchedClassMinor=deviceClassMinor;
  LocalDevice device=LocalDevice.getLocalDevice();
  if (device == null) {
    return new BluetoothDevice[0];
  }
  DiscoveryAgent discAgent=device.getDiscoveryAgent();
  device.setDiscoverable(searchMode);
synchronized (INSTANCE) {
    discAgent.startInquiry(searchMode,INSTANCE);
    try {
      INSTANCE.wait();
    }
 catch (    InterruptedException e) {
    }
  }
  BluetoothDevice[] devices=new BluetoothDevice[INSTANCE.discoveredDevices.size()];
  Arrays.cast(INSTANCE.discoveredDevices.getInternalArray(),devices);
  INSTANCE.discoveredDevices.clear();
  return devices;
}
 

Code Example 3:

  7 
vote

From project j2mepolish, under directory /enough-polish-j2me/source/src/de/enough/polish/bluetooth/.

Source DiscoveryHelper.java

/** 
 * Searches all nearby devices for a service with the specified UUID
 * @param ids the unique bluetooth identifiers of the service
 * @param attributes the attributes that should be queried, use null for not searching for any attributes
 * @param devices the devices that should be searched for the service
 * @return the first found service or null if none is found
 * @throws BluetoothStateException when the service search fails unexpectetly
 */
private ServiceRecord findServicesImpl(UUID[] ids,int[] attributes,Object[] devices) throws BluetoothStateException {
  LocalDevice localDevice=LocalDevice.getLocalDevice();
  if (localDevice == null) {
    return null;
  }
  DiscoveryAgent discAgent=localDevice.getDiscoveryAgent();
  for (int i=0; i < devices.length; i++) {
    Object obj=devices[i];
    RemoteDevice remoteDevice=(obj instanceof RemoteDevice ? (RemoteDevice)obj : ((BluetoothDevice)obj).getDevice());
    this.transctionId=discAgent.searchServices(attributes,ids,remoteDevice,this);
synchronized (this) {
      try {
        wait();
      }
 catch (      InterruptedException e) {
      }
    }
    if (this.discoveredServices.size() > 0) {
      break;
    }
  }
  if (this.discoveredServices.size() > 0) {
    ServiceRecord serviceRecord=(ServiceRecord)this.discoveredServices.get(0);
    this.discoveredServices.clear();
    return serviceRecord;
  }
  return null;
}
 

Code Example 4:

  7 
vote

From project j2mepolish, under directory /enough-polish-sample-nutiteq/nutiteq_maps_lib_src_1_1_0/src/com/nutiteq/bluetooth/.

Source BluetoothAPIDevice.java

private void findDevices(){
  try {
    btDevicesFound.removeAllElements();
    isBTSearchComplete=false;
    final LocalDevice local=LocalDevice.getLocalDevice();
    final DiscoveryAgent discoveryAgent=local.getDiscoveryAgent();
    discoveryAgent.startInquiry(DiscoveryAgent.GIAC,this);
    while (!isBTSearchComplete) {
synchronized (this) {
        this.wait(BLUETOOTH_TIMEOUT);
      }
      if (!isBTSearchComplete) {
        discoveryAgent.cancelInquiry(this);
      }
    }
  }
 catch (  final Exception e) {
    Log.error("BT: find " + e.getMessage());
    Log.printStackTrace(e);
  }
}
 

Code Example 5:

  7 
vote

From project maps-lib-nutiteq, under directory /src/com/nutiteq/bluetooth/.

Source BluetoothAPIDevice.java

private void findDevices(){
  try {
    btDevicesFound.removeAllElements();
    isBTSearchComplete=false;
    final LocalDevice local=LocalDevice.getLocalDevice();
    final DiscoveryAgent discoveryAgent=local.getDiscoveryAgent();
    discoveryAgent.startInquiry(DiscoveryAgent.GIAC,this);
    while (!isBTSearchComplete) {
synchronized (this) {
        this.wait(BLUETOOTH_TIMEOUT);
      }
      if (!isBTSearchComplete) {
        discoveryAgent.cancelInquiry(this);
      }
    }
  }
 catch (  final Exception e) {
    Log.error("BT: find " + e.getMessage());
    Log.printStackTrace(e);
  }
}
 

Code Example 6:

  5 
vote

From project colloqmote, under directory /Computer/ColloQmoteAccelerometerPC/src/.

Source Bluetooth.java

private DiscoveryAgent getAgent(){
  try {
    return LocalDevice.getLocalDevice().getDiscoveryAgent();
  }
 catch (  BluetoothStateException e) {
    log(e);
    log("ERROR detected and all operations stopped.");
    throw new Error("No discovery agent available.");
  }
}
 

Code Example 7:

  5 
vote

From project colloqmote, under directory /Computer/ColloQmoteKeypadPC/src/.

Source Bluetooth.java

private DiscoveryAgent getAgent(){
  try {
    return LocalDevice.getLocalDevice().getDiscoveryAgent();
  }
 catch (  BluetoothStateException e) {
    log(e);
    log("ERROR detected and all operations stopped.");
    throw new Error("No discovery agent available.");
  }
}
 

Code Example 8:

  5 
vote

From project colloqmote, under directory /Mobile/ColloqmoteAccelerometer/build/preprocessed/.

Source Bluetooth.java

protected void startApp() throws MIDletStateChangeException {
  display=Display.getDisplay(this);
  display.setCurrent(infoArea);
  infoArea.deleteAll();
  try {
    LocalDevice device=LocalDevice.getLocalDevice();
    device.setDiscoverable(DiscoveryAgent.GIAC);
    String url="btspp://localhost:" + UUID + ";name=DeviceServerCOMM";
    log("Create server by uri: " + url);
    StreamConnectionNotifier notifier=(StreamConnectionNotifier)Connector.open(url);
    serverLoop(notifier);
  }
 catch (  Throwable e) {
    log(e);
  }
}
 

Code Example 9:

  5 
vote

From project colloqmote, under directory /Mobile/ColloqmoteAccelerometer/src/.

Source Bluetooth.java

protected void startApp() throws MIDletStateChangeException {
  display=Display.getDisplay(this);
  display.setCurrent(infoArea);
  infoArea.deleteAll();
  try {
    LocalDevice device=LocalDevice.getLocalDevice();
    device.setDiscoverable(DiscoveryAgent.GIAC);
    String url="btspp://localhost:" + UUID + ";name=DeviceServerCOMM";
    log("Create server by uri: " + url);
    StreamConnectionNotifier notifier=(StreamConnectionNotifier)Connector.open(url);
    serverLoop(notifier);
  }
 catch (  Throwable e) {
    log(e);
  }
}
 

Code Example 10:

  5 
vote

From project colloqmote, under directory /Mobile/ColloQmoteKeypad/build/preprocessed/.

Source Bluetooth.java

void initSensor(){
  infoArea.deleteAll();
  display.setCurrent(infoArea);
  try {
    LocalDevice device=LocalDevice.getLocalDevice();
    device.setDiscoverable(DiscoveryAgent.GIAC);
    String url="btspp://localhost:" + UUID + ";name=DeviceServerCOMM";
    log("Create server by uri: " + url);
    StreamConnectionNotifier notifier=(StreamConnectionNotifier)Connector.open(url);
    serverLoop(notifier);
  }
 catch (  Throwable e) {
    log(e);
  }
}
 

Code Example 11:

  5 
vote

From project colloqmote, under directory /Mobile/ColloQmoteKeypad/src/.

Source Bluetooth.java

void initSensor(){
  infoArea.deleteAll();
  display.setCurrent(infoArea);
  try {
    LocalDevice device=LocalDevice.getLocalDevice();
    device.setDiscoverable(DiscoveryAgent.GIAC);
    String url="btspp://localhost:" + UUID + ";name=DeviceServerCOMM";
    log("Create server by uri: " + url);
    StreamConnectionNotifier notifier=(StreamConnectionNotifier)Connector.open(url);
    serverLoop(notifier);
  }
 catch (  Throwable e) {
    log(e);
  }
}
 

Code Example 12:

  5 
vote

From project Eclipse, under directory/com.mobilesorcery.sdk.ui.targetphone/src/com/mobilesorcery/sdk/ui/targetphone/internal/bt/.

Source BluetoothDialog.java

public void discoverDevices(){
  clearDevices();
  updateUI();
  LocalDevice dongle=null;
  try {
    dongle=LocalDevice.getLocalDevice();
    agent=dongle.getDiscoveryAgent();
    agent.startInquiry(DiscoveryAgent.GIAC,this);
  }
 catch (  BluetoothStateException e) {
    setRefreshInProgress(false);
    Policy.getStatusHandler().show(new Status(IStatus.ERROR,TargetPhonePlugin.PLUGIN_ID,e.getMessage()),"Could not scan for devices");
  }
}
 

Code Example 13:

  5 
vote

From project emergency-service-drools-app, under directory /emergency-service-sensor/src/main/java/com/wordpress/salaboy/sensor/wii/.

Source MyMoteFinder.java

public void startDiscovery(){
  try {
    discoveryAgent.startInquiry(DiscoveryAgent.LIAC,listener);
  }
 catch (  BluetoothStateException ex) {
    throw new RuntimeException(ex);
  }
}
 

Code Example 14:

  5 
vote

From project Gome, under directory /sources/com/indigonauts/gome/multiplayer/bt/.

Source Discoverer.java

public Vector findOtherGome(){
  RemoteDevice[] devList=null;
  try {
    agent.startInquiry(DiscoveryAgent.GIAC,this);
synchronized (this) {
      try {
        this.wait();
      }
 catch (      Exception e) {
      }
    }
  }
 catch (  BluetoothStateException e) {
    System.out.println("Unable to find devices to search");
  }
  if (deviceList.size() > 0) {
    devList=new RemoteDevice[deviceList.size()];
    deviceList.copyInto(devList);
    System.out.println("calling ss");
    searchServices(devList);
    return serviceList;
  }
  log.info("No Devices found.");
  log.info("No Services found.");
  return serviceList;
}
 

Code Example 15:

  5 
vote

From project j2mepolish, under directory /enough-polish-build/source/src/de/enough/polish/rmi/bluetooth/.

Source L2CapServer.java

/** 
 * Generates the URL that fits for the given UUID
 * @param uuid the UUID
 * @return the local connection URL for establishing an L2CAP based service
 * @throws BluetoothStateException when the URL could not be generated
 */
public static String generateLocalUrl(String uuid) throws BluetoothStateException {
  LocalDevice device=LocalDevice.getLocalDevice();
  device.setDiscoverable(DiscoveryAgent.GIAC);
  String url="btl2cap://localhost:" + uuid;
  String max=LocalDevice.getProperty("bluetooth.l2cap.receiveMTU.max");
  if (max != null) {
    if (max.equals("0")) {
      max="762";
    }
    url+=";ReceiveMTU=" + max + ";TransmitMTU="+ max;
  }
  return url;
}
 

Code Example 16:

  5 
vote

From project Remote-Bluetooth-Android, under directory/RemoteBluetoothServer/src/com/luugiathuy/apps/remotebluetooth/.

Source WaitThread.java

/** 
 * Waiting for connection from devices 
 */
private void waitForConnection(){
  LocalDevice local=null;
  StreamConnectionNotifier notifier;
  StreamConnection connection=null;
  try {
    local=LocalDevice.getLocalDevice();
    local.setDiscoverable(DiscoveryAgent.GIAC);
    UUID uuid=new UUID("04c6093b00001000800000805f9b34fb",false);
    System.out.println(uuid.toString());
    String url="btspp://localhost:" + uuid.toString() + ";name=RemoteBluetooth";
    notifier=(StreamConnectionNotifier)Connector.open(url);
  }
 catch (  BluetoothStateException e) {
    System.out.println("Bluetooth is not turned on.");
    e.printStackTrace();
    return;
  }
catch (  IOException e) {
    e.printStackTrace();
    return;
  }
  while (true) {
    try {
      System.out.println("waiting for connection...");
      connection=notifier.acceptAndOpen();
      Thread processThread=new Thread(new ProcessConnectionThread(connection));
      processThread.start();
    }
 catch (    Exception e) {
      e.printStackTrace();
      return;
    }
  }
}
 

Code Example 17:

  5 
vote

From project Sphero-Desktop-API, under directory /bluecove/com/intel/bluetooth/.

Source BluetoothStackBlueSoleil.java

/** 
 * There are no functions to find BlueSoleil discoverable status.
 */
public int getLocalDeviceDiscoverable(){
  if (isBluetoothReady(2)) {
    return DiscoveryAgent.GIAC;
  }
 else {
    return DiscoveryAgent.NOT_DISCOVERABLE;
  }
}
 

Code Example 18:

  5 
vote

From project Sphero-Desktop-API, under directory /bluecove/com/intel/bluetooth/.

Source BluetoothStackMicrosoft.java

public boolean setLocalDeviceDiscoverable(int mode) throws BluetoothStateException {
switch (mode) {
case DiscoveryAgent.NOT_DISCOVERABLE:
    cancelLimitedDiscoverableTimer();
  DebugLog.debug("setDiscoverable(false)");
setDiscoverable(false);
return (DiscoveryAgent.NOT_DISCOVERABLE == getLocalDeviceDiscoverable());
case DiscoveryAgent.GIAC:
cancelLimitedDiscoverableTimer();
DebugLog.debug("setDiscoverable(true)");
setDiscoverable(true);
return (DiscoveryAgent.GIAC == getLocalDeviceDiscoverable());
case DiscoveryAgent.LIAC:
cancelLimitedDiscoverableTimer();
DebugLog.debug("setDiscoverable(LIAC)");
setDiscoverable(true);
if (!(DiscoveryAgent.GIAC == getLocalDeviceDiscoverable())) {
return false;
}
limitedDiscoverableTimer=Utils.schedule(60 * 1000,new Runnable(){
public void run(){
try {
setDiscoverable(false);
}
 catch (BluetoothStateException e) {
DebugLog.debug("error setDiscoverable",e);
}
 finally {
limitedDiscoverableTimer=null;
}
}
}
);
return true;
}
return false;
}
 

Code Example 19:

  5 
vote

From project Sphero-Desktop-API, under directory /bluecove/com/intel/bluetooth/.

Source BluetoothStackMicrosoft.java

public int getLocalDeviceDiscoverable(){
  int mode=getBluetoothRadioMode();
  if (mode == BTH_MODE_DISCOVERABLE) {
    if (limitedDiscoverableTimer != null) {
      DebugLog.debug("Discoverable = LIAC");
      return DiscoveryAgent.LIAC;
    }
 else {
      DebugLog.debug("Discoverable = GIAC");
      return DiscoveryAgent.GIAC;
    }
  }
 else {
    DebugLog.debug("Discoverable = NOT_DISCOVERABLE");
    return DiscoveryAgent.NOT_DISCOVERABLE;
  }
}
 

Code Example 20:

  5 
vote

From project Sphero-Desktop-API, under directory /bluecove/com/intel/bluetooth/.

Source BluetoothStackOSX.java

public int getLocalDeviceDiscoverable(){
  if (getLocalDeviceDiscoverableImpl()) {
    return DiscoveryAgent.GIAC;
  }
 else {
    return DiscoveryAgent.NOT_DISCOVERABLE;
  }
}
 


신고

'Programming > JAVA' 카테고리의 다른 글

[JAVA] ArrayList - Java API  (0) 2017.02.27
Java 문자열 숫자 자료형 변환  (0) 2016.11.14
[Java] Bluetooth Examples for javax.bluetooth.DiscoveryAgent  (0) 2015.05.18
JNA (Java Native Access)  (0) 2015.03.14
[JAVA] 자바 실행파일 만들기  (0) 2015.03.01
JGoodies JAVA Swing API  (0) 2015.02.07


Posted by injunech
2015.05.13 20:01


Table of Content
  1. Intro
  2. 쉬운 API
  3. 어려운  API
  4. 어려운 API 와 쉬운 API?
  5. CPU 소모성 API
  6. CPU 소모가 없는 API
  7. msleep()
  8. msleep_interruptible()
  9. ssleep()
  10. schedule_timeout_interrupt()
  11. schedule_timeout_uninterrupt() 
  12. schedule_timeout() 
  13. ndelay(), udelay(), mdelay()  


1. Intro
 커널에서 시간 지연 함수는 여러가지가 있습니다. 
 굳이 분류를 하자면 쉬운 API, 어려운 API, CPU 소모성 API, CPU 소모가 없는 API 정도로 나눌 수 있습니다. 

2. 쉬운 API
 쉬운 API는 크게 보면 아래와 같습니다. 
  #include <linux/delay.h>
  #include <linux/timer.h>

  msleep()
  ssleep()

 이 API들은 함수명대로 micro  second, milli second, 1 second 을 뜻합니다. 
 그냥 사용하시면 됩니다. 

3. 어려운 API
 어려운 API 는 크게 보면 아래와 같습니다. 

 
  #include <linux/delay.h>
   #include <linux/timer.h>
   
   msleep_interruptible()
   schedule_timeout_interruptible();
   schedule_timerout_uninterruptible();
   schedule_timeout();

 이것도 그냥 사용하면 됩니다.

4. 어려운 API 와 쉬운 API ?
  어려운 API 와 쉬운 API 의 차이점은 무엇일까요? 

  가장 기본이 되는 지연 함수는 schedule_timeout() 입니다. 
  관계를 살펴보면

      ssleep()
    -----------------------------------------
      msleep()

    -----------------------------------------
      schedule_timeout_interruptible(), schedule_timeout_uninterruptible
 
    -----------------------------------------
      schedule_timeout()

 입니다. 위에 그림만으로는 잘 설명이 안될 수도 있는데, 커널 소스를 살펴보면 관계를 확실히 확인 할 수 있습니다. 

  ssleep() 는 msleep() 를 호출합니다. 
  msleep() 는 schedule_timeout_uninterrupt() 를 호출합니다. 
  schedule_timeout_uninterrupt() 는 schedule_timeout() 을 호출합니다. 

 결국 최종으로 호출되는 것은 schedule_timeout() 인데 시간 지연이라는게 인터럽트를 허용할 수도, 아닐수도 있고 또한 사용상의 편의상 ssleep() 나 msleep() 같은 front-end 를 만들어 쓴다고 생각하면 됩니다. 

8. CPU 소모성 API
 지정한 지연시간까지 loop 를 돌면서 cpu 시간을 소모하는 형태의 API 입니다. 
 
 ndelay();
 udelay();
 mdelay();

 위와 같이 delay 라는 이름이 붙은 API 들이 CPU 소모성 API 이며 아래와 같이 구현할 경우에도 CPU 소모성 API 입니다. 
 
 while(time_before(jiffies, j1))
 {
   cpu_relax();
 }

9. CPU 소모가 없는 API
 CPU 점유가 없이 시간 지연을 구현하려면 현재 자기자신한테 할당된 프로세스 시간을 반납하고 대기하는 방식을 사용하면 됩니다. 

 schedule_timeout_interruptible()
 schedule_timeout_uninterruptible()

 등이 그런 계통입니다. 

7. msleep()
  header : 
asm/delay.h
  void msleep(unsigned int msecs);
  unsigned long msleep_interruptible(unsigned int msecs);

 => 밀리세컨드 동안 지연해 줍니다. 지연시간동안에는 인터럽트를 받을 수 없습니다. 

example

 #include <asm/delay.h>

static void example_msleep(void)
{
  msleep(1000);


 
8. msleep_interruptible()
  header : 
asm/delay.h
  unsigned long msleep_interruptible(unsigned int msecs);

 => 밀리세컨드 동안 지연해 줍니다. 지연시간동안에는 인터럽트를 받을 수 있습니다. 

example)

 #include <asm/delay.h>

static void example_msleep(void)
{
  msleep_interruptible(1000);


 
9. ssleep()
  
  header : asm/delay.h
    void ssleep(unsigned int seconds);

 => 초단위로 지연해 줍니다. 지연시간동안에는 인터럽트를 받을 수 없습니다. 

example)

 #include <linux/sched.h>

static void example_ssleep(void)
{
  ssleep(2);



10. schedule_timeout_interruptible()

  
  header : linux/sched.h
    void schedule_timeout_interruptible(unsigned long timeout);

 => timeout 시간만큼 지연해 줍니다.  

example)

 #include <linux/sched.h>

static void example_ssleep(void)
{
  schedule_timeout_interruptible(1 * HZ); /* 1 초간 지연 */


11. schedule_timeout_uninterruptible()

  
  header : linux/sched.h
    void schedule_timeout_uninterruptible(unsigned long timeout);

 => timeout 시간만큼 지연해 줍니다. 지연시간도중에는 인터럽트를 받을 수 없습니다. 
  
  
example)

 #include <linux/sched.h>

static void example_ssleep(void)
{
  schedule_timeout_uninterruptible(1 * HZ); /* 1 초간 지연 */


 
12. schedule_timeout()

  
  header : linux/sched.h
    void schedule_timeout(unsigned long timeout);

 => timeout 시간만큼 지연해 줍니다. 가장 기본이 되는 함수입니다. 그렇기 때문에 직접 호출하여 사용하지는 않습니다. 

example)

 #include <linux/sched.h>

static void __sched schedule_timeout_interruptible(void long timeout)
{
  __set_current_state(TASK_INTERRUPTIBLE);
 
 return schedule_timeout(timeout); 



13. ndelay, udelay, mdelay
   header : linux/delay.h
   #define ndelay(n);
   #define udelay(n); 
   #define mdelay(n);

  busy wait 방식이어서 cpu 로드가 많은 편입니다. 하지만 간단하게 쓸 수 있는 장점이 있습니다. 

example)


#include <linux/delay.h>

void delay_test(void long timeout)
{
  ndelay(1000);
  udelay(1000);
  mdelay(1000); 
 


신고


Posted by injunech
2015.04.12 16:19


[Android] onTouchEvent 에서의 MotionEvent 터치 구분



@Override

public boolean onTouchEvent(MotionEvent event) {

int action = event.getAction();

int touch_id = ((action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> 8 );

int actionEvent = action & MotionEvent.ACTION_MASK; // MotionEvent.ACTION_MASK = 0xff

pointerCount = event.getPointerCount();


switch (actionEvent) {

case MotionEvent.ACTION_DOWN: {

...

}


위와 같이 action 값을 받게 되면 해당 action 값에는 Touch 동작 관련 HEX 값이 들어가게 된다

Integer.toHexString(action) 를 통해 int 값을 HEX 로 출력하면 16진수로 다음과같은 값으로 터치를 구분할 수 있다

0x___

세번째 두번째 첫번째


첫번째 값은 터치의 Up, Down, Move 를 판별 가능하며, 첫번째 터치인경우와 두번째 터치 이후의 터치의 경우 Up 과 Down 구분 값이 다음과 같이 달라진다.

     Primary Finger DOWN = 0        Primary Finger UP     = 1

non-Primary Finger DOWN 5   non-Primary Finger UP     = 6

All Finger MOVE             = 2


두번째 값은 0 이 입력되고 0 이외의 값은 본적이 없다. (나중에 추가로 조사를 해봐야 할듯)


세번째 값은 touch ID 값으로 첫번째 터치인경우 0의 값 두번째 터치인 경우 1의값 세번째 터치인 경우 2의 값이 들어가며 멀티 터치를 지원하는 최대 값까지 입력된다. 한개의 터치가 Release 되는 경우에는 아직 터치상태인 나머지 터치의 action 의 세번째 Hex 값은 첫번째 터치 값인 0부터 다시 차례대로 터치한 상태로 매겨지게 된다. 자세한 사항은 아래 참고의 예를 확인

- 참고 : 첫번째 터치시에 값은 0 두번째 터치시에 값은 1, 세번째 터치시에 값은 2 이다.

이상태에서 터치를 Release 하는 경우에는 해당 터치 ID 의 값이 입력된다.

예를 들면 3번째까지 터치한 상태에서 두번째 터치한 손가락을 Release 하는 경우에는 action의 세번째 Hex 값은 1이된다.

또한 이상태에서 현재 터치한 Count 값은 총 2개이다. 그리고 나머지 첫번째 터치한 action의 세번째 Hex 값은 그대로 0이고 세번째 터치한 action 의 세번째 Hex 값은 기존의 2에서 1로 변경되게 된다.





나같은 경우에는 위 코드와 같이 action 값을 세번째 Hex 값, 첫번째 두번째 Hex 값으로 아래와 같이 저장하여 이용한다.

int action = event.getAction();

int touch_id = ((action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> 8 );

int actionEvent = action & MotionEvent.ACTION_MASK; // MotionEvent.ACTION_MASK = 0xff






신고


Posted by injunech
2015.04.11 11:01


Android에서 'Android library projects cannot be launched' 에러가 발생 할 수 있다. 이 문제는 project를 application이 아닌 Library로 인식하기 때문에 발생할 수 있다. 다음을 체크해 보자


Project Properties > Android > Is Library 가 체크되어 있는지를 확인한다.

만약 체크되어 있다면 체크해제 후 재 실행하면 해결 할 수 있다.

신고


Posted by injunech
2015.04.10 22:47



디바이스는 하드웨어를 말한다. 

드라이버는 하드웨어를 다루는 소프트웨어를 말한다.

예를 들어보자.

UART 칩이 16개 달려있다고 했을 때 이를 제어하는 드라이버는 하나이다.

하지만 UART 칩이 16개 이니 디바이스는 16개 이다.

 

이제 리눅스 커널로 확장해 보자

arm 코아의 커널을 다루게 되면 항상 수정하거나 참고하는 파일이 있다.

EM-S5PV210  기준으로

arch/arm/mach-s5pv210/mach-ezs5pv210.c  파일이다.

 

이곳에서 보면 struct platform_device  구조체를 흔히 볼수 있다.

이 구조체의 몇몇 멤버를  보자

  • name           문자열 이름
  • id                 정수형 아이디
  • resource      리소스 구조체 포인터 (리소스 구조체는 하드웨의 주소나 인터럽트 정보가 나열된다.)   
  • num_resources    리소스 구조체 개수

다신한번 이 구조체의 이름이 struct platform_device 이다.   즉 디바이스인 것이다.

이 구조체는  아래의 함수를 통해 등록된다.

  • platform_add_devices()       여러개의 디바이스들을 한번에 등록
  • platform_device_register()  하나의 디바이스를 등록

 

 

이제  커널의 driver  디렉토리의 무수한 소스파일들을 보자 

모두다  struct platform_driver  구조체를 품고 있다.

이제 struct platform_driver 구조체의 주요한 멤버를 보자

  • probe         초기 실행함수
  • remove       드라이버 제거시 실행되는 함수
  • driver  =  {  .name       드라이버 이름

이 구조체는  platform_driver_register() 함수를 통해 등록된다.

 

 

이제 흐름을 따라가 보자

커널 시작시 디바이스들이 등록된다.  리소스가 등록되는 것이다.  UART칩이  16개 있다면 디바이스가 16 등록된다.

잠시후에 커널 드라이버가 등록된다.  이때 드라이버의 이름과 동일한 디바이스의 이름이 발견되면 probe() 함수가 호출된다.

동일한 이름의 디바이스가 16개 있다면 이 probe() 함수가 16번 호출된다.

 

참고해야 할것은 struct platform_device 구조체의 id 이다.

디바이스가 하나만 있다면 이값은 -1 로 설정한다.  하지만 2개 이상일 경우 id 는 0 부터 시작해서 각 디바이스마다  고유한 값을 넣는다.,

대게 1씩 순서대로 값을 넣는다.

 

struct platform_device 의 멤버 name 과  struct platform_driver 의  멤버 driver.name 은 동일한 값을 갖는다.

디바이스가 하나일 경우 디바이스의 이름과  드라이버의 이름은 같다.

하지만 디바이스가 여러개 일 경우  드라이버 이름은 보이는 대로의 이름이지만

디바이스의 경우   uart.0   uart.1  이렇게  숫자를 달고 나온다.   id 로 확장된 것이다.

아래의 매크로를 이용하여 디바이스 이름을 얻는다.

  • dev_name(&platform_device->dev)

이제 디바이스 드라이버가  한결 쉬워질 것이다.

신고


Posted by injunech
2015.04.10 22:08


함수포인터


포인터가 무엇인지는 다들 아실텐데요, 특정 변수에 대한 메모리 주소를 담을 수 있는 변수를 포인터 변수라고 합니다. 그렇다면 함수포인터란, 특정 함수에 대한 메모리 주소를 담을 수 있는 것 이라고 정의할 수 있겠습니다.


함수포인터를 쓰는 이유는 무엇일까요?

  1. 프로그램 코드가 간결해집니다.

  2. 함수포인터를 배열에 담아서도 사용할 수 있으므로 중복되는 코드를 줄일 수 있습니다.

  3. 상황에 따라 해당되는 함수를 호출할 수 있으므로 굉장히 유용합니다.

그 외에도 함수 포인터를 이용하여 콜백함수를 구현할 수 있게 되는 등 편리하고 유용한 코드를 작성할 수 있게 됩니다.



우선 함수포인터의 모양에 대해 알아보도록 하겠습니다.

int (*FuncPtr) (intint)


함수포인터는 위와 같은 모양을 띕니다. 함수의 프로토타입 선언과 모양이 비슷하죠?

함수의 프로토타입과 다른점이 있다면 함수 이름앞에 포인터를 가르키는 *이 붙는 다는 것인데요. 이렇게 선언이 되게 되면 FuncPtr 이라는 함수의 주소를 담을수 있는 '변수'가 생기는 것입니다. 

이 FuncPtr 함수포인터가 담을 수 있는 함수는 위와 같은 모양을 띄어야 합니다. 즉, 함수의 리턴형은 int 여야하고, int형 파라미터 2개를 받는 함수여야 하는 것입니다.


예를 들어,

1:  int add (int first, int second)

2: double div (double first, double second)

위의 보이는 두 함수가 있다고 가정할 때, 함수포인터의 선언 모양과 똑같이 생긴 add 라는 함수의 주소만을 담을 수 있는 것입니다. 


아래의 사용 예제를 한 번 더 보시겠습니다.

1
2
3
4
FuncPtr = add    (o)
FuncPtr = &add   (o)
FuncPtr = div    (x)
FuncPtr = add()  (x)


1, 2 :  2가지 방법 모두 괜찮은 사용 방법입니다. 어떤 것을 쓰셔도 무관합니다.
: div는 FuncPtr의 선언 모양과 프로토타입이 달라서 사용할 수 없습니다. 에러가 발생합니다.
4 : add() 처럼 함수를 호출할 때 처럼 쓰는 것은 결과값이 함수의 호출 이후 리턴 값이 되는 것입니다. 따라서 add() 는 int형을 가리키게 되는 것이므로 사용방법 자체가 잘 못 되었습니다. 에러가 발생합니다.



이렇듯 함수포인터는 담고 싶은 함수의 프로토타입을 따라 선언하여 사용하시면 됩니다. 하지만, 이 모양이 복잡하기 때문에 typedef를 이용하여 타입의 모양을 단순화 시키는 작업을 해 줄수도 있습니다.

typedef int (*FuncPtr)(intint)


프로그램 상단에 위와 같이 선언한 후, 실제 사용을 하실 때에는 FuncPtr 이라는 Type으로 새로운 변수를 사용하실 수 있습니다.


1
2
FuncPtr testFP = NULL;
testFP = add;


이렇게 말이죠. 아, 참고로 모든 변수 특히 포인터 변수를 선언해 주실 때, 초기화 해주는 습관은 정말 좋은 습관이십니다 :) 크리티컬 에러를 미리 예방할 수 있는 방법 중 하나입니다.



자 이제 마지막으로, 함수포인터를 이용해서 만든 실제 예제를 한 번 보여드리도록 하겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdio.h>
 
// 함수포인터 타입 정의
typedef int (*calcFuncPtr)(int, int);
 
 
// 덧셈 함수
int plus (int first, int second)
{
    return first + second;
}
// 뺄셈 함수
int minus (int first, int second)
{
    return first - second;
}
// 곱셈 함수
int multiple (int first, int second)
{
    return first * second;
}
// 나눗셈 함수
int division (int first, int second)
{
    return first / second;
}
 
// 매개변수로 함수포인터를 갖는 calculator 함수
int calculator (int first, int second, calcFuncPtr func)
{
    return func (first, second);     // 함수포인터의 사용
}
 
int main(int argc, char** argv)
{
    calcFuncPtr calc = NULL;
    int a = 0, b = 0;
    char op = 0;
    int result = 0;
     
    scanf ("%d %c %d", &a, &op, &b);
     
    switch (op)    // 함수포인터 calc에 op에 맞는 함수들의 주소를 담음
    {
        case '+' :
            calc = plus;
            break;
 
        case '-':
            calc = minus;
            break;
 
        case '*':
            calc = multiple;
            break;
 
        case '/':
            calc = division;
            break;
    }
     
    result = calculator (a, b, calc);
 
    printf ("result : %d", result);
     
    return 0;
}


실행결과는 다음과 같습니다.


간단한 소스코드라 어려운 점은 없을 겁니다. 혹시 코드에 이해 안가는 부분이 있다면 댓글 남겨주시면 바로 답변 드립니다.



신고


Posted by injunech
2015.04.06 12:27


쉘 스크립트를 만들때,  가장 첫 라인에 

#!/bin/bash 

를 왜 써야 하는지에 대하여 알아 보도록 하겠습니다.


쉘 스크립트의 가장 첫 라인에  !/bain/bash 를 쓰게 됨으로 해서, 내가 사용 하려는 명령어 해석기가 bash 쉘 임을 미리 알려주는 것입니다.


일반적으로 스크립트에서 #는 주석기호이지만, 첫라인의 #!/bin/bash 에서의 #은 주석기호가 아닙니다.


스크립트의 가장 첫라인에 있는 #! 은 스크립트의 제일 앞에서 이 파일이 어떤 명령어 해석기의 명령어 집합인지를 시스템에게 알려주는 역할을 합니다.


#! 은 두 바이트의 "매직넘버"("magic number")로서, 실행 가능한 쉘 스크립트라는 것을 나타내는 특별한 표시자입니다.


#! 바로 뒤에 나오는 것은 경로명으로, 스크립트에 들어있는 명령어들을 해석할 프로그램의 위치를 나타내는데 그 프로그램이 쉘인지, 프로그램 언어인지, 유틸리티인지를 나타냅니다. 


이 명령어 해석기가 주석은 무시하면서 스크립트의 첫 번째 줄부터 명령어들을 실행시킵니다. 


거의 대부분의 상업용 유닉스 및 리눅스 에서 기본 본쉘인 #!/bin/sh을 쓰면 비록 Bash 만 가지고 있는 몇몇 기능들을 못 쓰게 

되겠지만 리눅스가 아닌 다른 머신에 쉽게 포팅 할 수 있게 해 줍니다. (이렇게 작성된 스크립트는 POSIX sh 표준을 따르게 됩니다. )

"#!" 뒤에 나오는 경로는 정확히 Full PATH를 기록 해야 합니다. 

만약 PATH를 잘못 적게 되면, 스크립트를 돌렸을 때 거의 대부분 "Command not found"라는 에러 메세지만 보게 될 것입니다.


이상으로 쉘 스크립트 처음에 왜 "#!/bin/bash"를 반드시 써야만 하는지에 대하여 알아 보았습니다.

신고


Posted by injunech
2015.04.05 22:18


FAQ : 프로그래밍적으로 키보드 숨김/감춤/보기. 액티비티 시작시 키보드 숨김/감춤/보기, EditText선택시 키보드 안뜨게하기 등 소프트 키보드 동작 관련 질문에 대한 답변

1. 키보드 감추기

EditText editText = (EditText) findViewById(R.id.myEdit);
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

2. 키보드 보여주기
EditText editText = (EditText) findViewById(R.id.myEdit);
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);

위 코드로 안보이는 경우 아래코드도 시도해보세요
- imm.showSoftInputFromInputMethod (editText .getApplicationWindowToken(),InputMethodManager.SHOW_FORCED);

onCreate등에서 제대로 동작하지 않는다면 
Handler로 post를 해서 위 코드를 실행시켜보세요.

3. 키보드 토글 - 위 두가지 방법으로 안되는 경우 다음과 같은 코드로 동작하는 경우가 있습니다.
imm.toggleSoftInputFromWindow(editText.getApplicationWindowToken(),  InputMethodManager.SHOW_FORCED, 0); 

4. 액티비티 시작시 자동으로 키보드 보여주기
AndroidManifest.xml의 activity 태그의 속성에 android:windowSoftInputMode="stateVisible" 혹은 "stateAlwaysVisible"삽입

5. 액티비티 시작시 자동으로 키보드 보여주지 않기
AndroidManifest.xml의 activity 태그의 속성에 android:windowSoftInputMode="stateHidden" 혹은 "stateAlwaysHidden" 삽입

6. 에디트 텍스트 선택해도 키보드 안뜨게 하기
EditText xml 속성에서 inputType 을 0으로 주면 안뜹니다.


신고


Posted by injunech
2015.04.05 17:01


IPv4 유효성 검사 정규식


설명 하기 앞서  정규식의 간단한 개념?적 의미는

일정한 규칙을 가진 문자열의 집합을 어떠한 형식으로 나타낼수 있는 형식 언어 라고 한다.


정규식을 이용하여 유효성 검사를 할때 / /로 감싸주어야 한다.

"를 사용하면 잘못된 방법


 IPv4 정규식은 아래와 같다.


/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/

?

분석


?크게 정규식을 2개로 나누어 보았다.

1. ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}


2. ([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$

?



1번부터 해석을 해보겠다.

?

 ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}

 

? ^  :  뒤에오는 문자, 숫자로 정규식을 시작하겠다는 의미

 -> 위의 정규식을 보면 ^로 시작하고 소괄호로 감싸주었는데 다음 소괄호 안에 있는 정규식으로 시작 하겠다는 의미 이다.


[] 를 정규식에서는 META ?문자 라고 하는데 [] 안에 있는 문자로 정규식에 들어갈 범위를 지정해주는 것


[0-9] 0 ~ 9 까지 문자열을 사용하겠다는 의미

[1-9] 1 ~ 9 까지 문자열을 사용하겠다는 의미

[0-4] 0 ~ 4 까지 문자열을 사용하겠다는 의미

[0-5] 0 ~ 5 까지 문자열을 사용하겠다는 의미


이 정도 설명했으면 대충은 의미가 갈것이라고 생각한다.


뭐.. 0~9, 1~9 , 0~9 등등 뒤에 문자의 조합으로 시작하겠다는  의미구나

이제 나머지 이해가 되도록 설명을 하겠다.


| :  프로그래밍 공부를 조금이라도 한사람이라면  OR 라는 의미라는것을 대충 짐작을 했을텐데 맞다

     OR와 같은 의미


자 그럼 한층더 이해도가 높아 지지 않는가??!

정규식 안에 들어가는 1, 2, 25 는 그 형태 그대로 문자, 문자열 그대로 인식된다.

\. 은 문자열  comma 를 의미


 ^    ((  [0-9]  |  [1-9][0-9]   |   1[0-9]{2}  |    2[0-4][0-9]  |   25 [0-5]) \.){3}

시작    0~9  OR  1~9  0~9   OR   1 0~9       OR  2 0~4 0~9   OR  25 0~5   .


{n}을 설명하면 이제 모두 이해가 될것이다.

x{n} : n반 큼 반복하다. 즉 앞의 x가 n만큼 반복 될것이라는 의미



 ^    ((  [0-9]  |  [1-9][0-9]   |   1[0-9]{2}  |    2[0-4][0-9]  |   25 [0-5]) \.){3}

시작  (( 0~9  OR  1~9  0~9   OR   1 0~9       OR  2 0~4 0~9   OR  25 0~5   . ) <-앞의 모든 식이 3번 반복

                                                  ↑ 앞의 식이 2번 반복


자 다시한번 정리를 한다면

 ^  : 시작    

 [0-9]  : 0~9  - 1 자리 숫자   1,2,3,4,5,6,7,8,9,

 [1-9][0-9] : 1~9, 0~9  - 2자리 숫자  10~99

 1[0-9]{2}  : 1, 0~9, 0~9 - 3자리 숫자 100 ~ 199

 2[0-4][0-9] : 2, 0~4, 0~9 -  3자리 숫자 200 ~ 249

 25 [0-5] : 25, 0~5 - 3자리 숫자 250~ 255

--------여기까지 각 식마다 |가 붙었기때문에 1자리, 2자리, 3자리 숫자중 위의 조건에 맞춰 다 들어 갈수있다는것을 알수 있다.

  \.   :  . comma

{3} : 위의 숫자가  3번 반복 즉  Ip주소 1.255.11. 이런식의 문자가 들어갈수 있다는 의미

        최대 숫자가 255 인것은 ip주소에서 쓸수 있는 숫자가 255까지 표현 할수 있기 때문에


여기까지 1번 식의 설명이였다.. 1번이 이해가 된다면 2번도 마찬가지 이기때문에 충분이 분석이 가능할 것이다.


1. ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}


2. ([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$


$ :  예) x$  x로 끝내겠다는 의미

즉 마지막에 $표시는 앞의 식으로 끝내겠다는 의미이다.



즉 77.11.22.33

이런식으로 끝내겠다는 의미이다.


JavaScript에 다음 정규식을 적용 시켜보는 예제이다.



function checkIpForm(ip_addr){
 
 var filter = /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/;

 if (filter.test(ip_addr) == true){
  return false;
 } else{
  alert("IP 주소 형식이 틀립니다.");
  return true;
 }

}



참조 site

http://www.nextree.co.kr/p4327/


정규식을 테스트 해 볼수 있는 website이다. 정규식을 만들어보고 잘 맞는치 테스트 해볼수 있다.http://gskinner.com/RegExr/  


신고

'Programming > Etc' 카테고리의 다른 글

ASCII Code Table  (0) 2017.02.21
정규식 문법 이해  (0) 2015.04.05
2015년 프로그래밍 언어 사용률  (0) 2015.03.05
[Tistory] 티스토리 본문 폭 변경하기  (0) 2015.02.22
[Git] Git 설치 및 초기 설정  (0) 2015.02.16


Posted by injunech
2015.03.26 13:45


디바이스 드라이버 작업을 하다 보면 자주 보게 되는 매크로중으 히나가

바로  container_of 매크로 입니다.

이해가 가는 것 같기도 하고 아니것 같기도 하고 묻는 사람도 있고 해서

오늘은 이 매크로에 대해서 한번 알아 볼가 합니다.


일단 함수 원형을 한번 볼까요?


lxr 사이트에서 긁어 왔습니다.

위치는 include/linux/kernel.h 입니다.


 650#define container_of(ptr, type, member) ({                      \
 651        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
 652        (type *)( (char *)__mptr - offsetof(type,member) );})


이건 뭐 상당히 거시기 하군요.

뜯기 전에 좀 쉬운 예를 들어 보겠습니다.


 




위의 그림이 보이십니까?

뽀글이 structure 는 인자가 4개 입니다.

시작 번지는 1000 번지구요.  

라면 번지 1000

수프 번지 1008

가격 번지 1016

봉지 번지 1020


이렇게 되는 군요.

그런데 어떤 함수를 호출하면서 가격의 포인터를 넘겨주었습니다.


그래서...  가격포인터를 인자로 받은 함수가 아래와 같습니다.


int   how_much( short *가격)

{

     printk(" 가격위치는 0x%p\n", 가격)

     return 0;

}


자 이제 how_much 함수는 가격포인터를 프린트해줍니다.

당연히 그 값은 1016 번지가 되겠죠.


자 이제 how_much 함수는 가격의 포인터를 알고 있습니다.

처음 그림에서 보면 가격 인자는 뽀글이 자료 구조의 멤버네요?


how_much 에서 short * 형태로 인자를 받았지만

그 포인터가 struct 뽀글이 멤버라는 것을 알고 있고

struct 뽀글이 다른 멤버를 필요로 하는 경우가 생겼습니다.


쉽게 얘기해서 내가 받은 인자를 이용해서 그 인자를 포함하고 있는

자료구조가 필요한 것입니다.


직관적으로 그림에서 보면 뽀글이 자료구조의 주소는 1000 번지 입니다.

가격 포인터가 1016 이므로 16 만 빼면 1000 번지가 나오죠?

이제 우리는 struct 뽀글이 의 변수 위치를 찾은겁니다.


함수를 다시 써보죠.


int   how_much( short *내가격)

{

     struct 뽀글이 *myboggle = containerof(내가격, struct 뽀글이, 가격);


     printk(" 내가격을 멤버로 갖는 boggle 구조체의 위치는 0x%p\n", myboggle)


     myboggle->라면 = 봉지라면;


     return 0;

}


이 결과는 0x1000 이 나오게 됩니다.


컨테이너 매크로에서 필요한 것은 세가지 조건입니다.

현재 알고 있는 변수포인터.

구조체함수원형.

구조체멤버의 변수명.


복잡해 보이기도 하지만 결론적으로는


1000 = container_of(1006, struct 뽀글이, 가격)


이렇게 되는데 1006 이라는 위치를 가르쳐주고

1006 이 뽀글이의 가격이라는 멤버의 주소이다.


뽀글이 구조체에서 가격의 변수 위치는 항상 6이라는 오프셋이니까

1006 - 6 = 1000.


이렇게 되도록 짜여져 있는 매크로 입니다.


복잡한가요?


정리합니다.

container_of (prt, type, member) 

prt           :  임의의 포인터값.

type         :  ptr 을 멤버로 갖는 자료구조형(구하고자 하는 자료구조의 형).

member    :  자료구조형에서 ptr 의 멤머 이름.




출처 : http://forum.falinux.com/zbxe/index.php?document_srl=531954

신고


Posted by injunech

티스토리 툴바