mirror of
https://github.com/OpenSolo/OpenSolo.git
synced 2025-04-29 22:24:32 +02:00
81 lines
1.7 KiB
Python
Executable File
81 lines
1.7 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
import mmap
|
|
import posix_ipc
|
|
import rc_pkt
|
|
|
|
# see rc_remap_sample.py for usage
|
|
|
|
# must match rc_ipc.c
|
|
shm_name = "/rc_shm"
|
|
sem_name = "/rc_sem"
|
|
|
|
# must match sizeof(struct rc_pkt)
|
|
shm_size = rc_pkt.LENGTH
|
|
|
|
shm = None
|
|
sem = None
|
|
shm_file = None
|
|
|
|
|
|
def attach():
|
|
global shm
|
|
global sem
|
|
global shm_file
|
|
# create/attach shared memory
|
|
try:
|
|
shm = posix_ipc.SharedMemory(shm_name, posix_ipc.O_CREAT, size=shm_size)
|
|
except:
|
|
print "rc_shm.attach: ERROR creating shared memory", shm_name
|
|
return False
|
|
shm_file = mmap.mmap(shm.fd, shm.size)
|
|
shm.close_fd()
|
|
# create/attach semaphore
|
|
try:
|
|
sem = posix_ipc.Semaphore(sem_name, posix_ipc.O_CREAT)
|
|
except:
|
|
print "rc_shm.attach: ERROR creating semaphore", sem_name
|
|
return False
|
|
return True
|
|
|
|
|
|
# pkt is a tuple (timestamp, sequence, channels[])
|
|
def put(pkt):
|
|
if shm_file is None or sem is None:
|
|
#print "rc_shm.put: must attach first"
|
|
return False
|
|
# convert from tuple to string
|
|
p = rc_pkt.pack(pkt)
|
|
if p is None:
|
|
return False
|
|
# write to shared memory
|
|
sem.acquire()
|
|
shm_file.seek(0)
|
|
shm_file.write(p)
|
|
sem.release()
|
|
return True
|
|
|
|
|
|
# return pkt or None
|
|
# pkt is returned as a tuple (timestamp, sequence, channels[])
|
|
def get():
|
|
if shm_file is None or sem is None:
|
|
#print "rc_shm.get: must attach first"
|
|
return False
|
|
sem.acquire()
|
|
shm_file.seek(0)
|
|
s = shm_file.read(shm_size)
|
|
sem.release()
|
|
return rc_pkt.unpack(s)
|
|
|
|
|
|
def detach():
|
|
global shm
|
|
global sem
|
|
global shm_file
|
|
if shm_file:
|
|
shm_file.close()
|
|
shm_file = None
|
|
shm = None
|
|
sem = None
|