김유현

Merge branch 'yunseok' into yhkim

1 +#-*- coding:utf-8 -*-
2 +
3 +import time
4 +import RPi.GPIO as GPIO
5 +from multiprocessing import Queue
6 +import os
7 +
8 +PIN = {
9 + 'Motor_MT_N':17,
10 + 'Motor_MT_P':4
11 +}
12 +
13 +class Motor:
14 + LEFT = 0
15 + RIGHT = 1
16 +
17 + def __init__(self):
18 + self.pwmN = GPIO.PWM(PIN['Motor_MT_N'], 100)
19 + self.pwmP = GPIO.PWM(PIN['Motor_MT_P'], 100)
20 + self.pwmN.start(0)
21 + self.pwmP.start(0)
22 +
23 + def rotate(self, direction):
24 + if direction == Motor.LEFT:
25 + GPIO.output(PIN['Motor_MT_N'], GPIO.HIGH)
26 + GPIO.output(PIN['Motor_MT_P'], GPIO.LOW)
27 + self.pwmN.ChangeDutyCycle(50)
28 + else:
29 + GPIO.output(PIN['Motor_MT_N'], GPIO.LOW)
30 + GPIO.output(PIN['Motor_MT_P'], GPIO.HIGH)
31 + self.pwmP.ChangeDutyCycle(50)
32 +
33 + def stop(self):
34 + self.pwmP.ChangeDutyCycle(0)
35 + self.pwmN.ChangeDutyCycle(0)
36 +
37 +def RFIDProcess(signalQueue):
38 + while True:
39 + ################## 이곳을 지우고 코드를 작성해주세요 ################
40 + # RFID ID가 등록된 기기의 ID인 경우 success에 True를 넣습니다.
41 + #
42 + # RFID 태그가 된 경우 API에 요청을 보내 (GET /api/device) ID 목록을
43 + # 가져온 후 이 목록 안에 태그된 기기의 ID가 있는지 여부를 확인하는 방식으로
44 + # 동작하면 될 것 같습니다.
45 + #
46 + # ID 목록을 미리 받아온 후 비교하도록 하면 ID 목록 업데이트가 안 될 수 있으니
47 + # 태그가 된 경우 ID 목록을 받아오도록 해주세요.
48 + #
49 + # 기기 추가 상태인 경우를 확인해 기기 추가 상태라면 success를 True로 하지 않고
50 + # 그냥 기기 목록에 태그된 기기의 ID를 추가합니다.
51 + #
52 + # success가 True인 경우 모터가 회전합니다.
53 + #
54 + # 아래 코드는 테스트를 위한 코드입니다. 아래 코드까지 지우고 작성해주세요.
55 + time.sleep(30)
56 + success = True
57 + ##############################################################
58 + #
59 + # 복잡한 것 같아 수도코드를 첨부합니다.
60 + #
61 + # success = False
62 + # if RFID 태그가 됨:
63 + # deviceId = 방금 태그된 RFID 장치의 ID
64 + # devices = callApi(GET /api/device)
65 + # state = getFromIPC(원격 잠금해제 여부)
66 + #
67 + # if state == 원격 잠금해제:
68 + # try:
69 + # if devices.find(deviceId):
70 + # raise 이미 등록된 RFID 장치
71 + # else:
72 + # callApi(POST /api/device, {rfid_id:deviceId})
73 + # (가능하다면) 완료됐다는 소리 출력 (딩동댕 정도?)
74 + # except:
75 + # (가능하다면) 경고음 출력 (삑!)
76 + # finally:
77 + # setToIPC(원격 잠금해제 여부, 원격 잠금해제 아님)
78 + # else: # 원격 잠금해제 상태가 아님 = 도어락 해제 프로세스
79 + # try:
80 + # if not devices.find(deviceId):
81 + # raise 등록되지 않은 RFID 장치
82 + # else:
83 + # success = True
84 + # except:
85 + # (가능하다면) 경고음 출력 (삑!)
86 + #
87 + ##############################################################
88 + if success:
89 + print("등록된 RFID ID가 확인됨")
90 + signalQueue.put("RFID")
91 +
92 +def RemoteProcess(signalQueue):
93 + while True:
94 + ################## 이곳을 지우고 코드를 작성해주세요 ################
95 + # 원격 잠금해제 요청이 들어온 경우 success에 True를 넣습니다.
96 + # 원격 잠금해제 요청은 IPC로 처리합니다.
97 + # 지우님과 협업하여 작업해주세요.
98 + #
99 + # 제 생각으로는 한 파일에 대해서 (ex ~/IPC.txt) API에서는 write하고
100 + # 도어락 프로세스에서는 read하는 방법으로 하면 될 것 같습니다.
101 + # 원격 잠금해제 요청이 들어온 경우 API에서 write하도록 하면 되겠죠..?
102 + #
103 + # success가 True인 경우 모터가 회전합니다.
104 + #
105 + # 아래 코드는 테스트를 위한 코드입니다. 아래 코드까지 지우고 작성해주세요.
106 + time.sleep(13)
107 + success = True
108 + ##############################################################
109 + if success:
110 + print("원격 잠금해제 요청이 들어옴")
111 + signalQueue.put("Remote")
112 +
113 +def signalProcess(signalQueue):
114 + pid = os.fork()
115 + if pid == 0:
116 + RFIDProcess(signalQueue)
117 + else:
118 + RemoteProcess(signalQueue)
119 +
120 +def doorProcess(doorQueue):
121 + motor = Motor()
122 + while True:
123 + signal = doorQueue.get()
124 + print("{} 신호를 받아 문 열기 동작 수행 시작".format(signal))
125 + if signal is not None:
126 + print("문 열림")
127 + motor.rotate(Motor.LEFT)
128 + time.sleep(0.5)
129 + motor.stop()
130 + time.sleep(5) # 열린 후 5초 지나면 닫힘
131 + print("문 닫힘")
132 + motor.rotate(Motor.RIGHT)
133 + time.sleep(0.5)
134 + motor.stop()
135 +
136 +if __name__ == '__main__':
137 + try:
138 + GPIO.setmode(GPIO.BCM)
139 + GPIO.setup(PIN['Motor_MT_N'], GPIO.OUT, initial=GPIO.LOW)
140 + GPIO.setup(PIN['Motor_MT_P'], GPIO.OUT, initial=GPIO.LOW)
141 +
142 + signalQueue = Queue()
143 + pid = os.fork()
144 + if pid == 0:
145 + doorQueue = Queue()
146 + pid = os.fork()
147 + if pid == 0:
148 + while True:
149 + signal = signalQueue.get()
150 + print("{} 신호가 들어와 전달 준비".format(signal))
151 + if signal is not None:
152 + doorQueue.put(signal)
153 + else:
154 + doorProcess(doorQueue)
155 + else:
156 + signalProcess(signalQueue)
157 + except Exception as e:
158 + print(e)
159 + finally:
160 + GPIO.cleanup()
...\ No newline at end of file ...\ No newline at end of file