rpgui.py 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. import PySide6.QtWidgets as QTW
  2. import numpy as np
  3. import struct
  4. import socket
  5. import sys
  6. class Window(QTW.QWidget):
  7. def __init__(self):
  8. super().__init__()
  9. self.genLayout = QTW.QHBoxLayout()
  10. self.genButton = QTW.QPushButton("Generate")
  11. self.genButton.pressed.connect(self.genFileDialog)
  12. self.genLabel = QTW.QLabel("Not generated")
  13. self.genLayout.addWidget(self.genButton)
  14. self.genLayout.addWidget(self.genLabel)
  15. self.paramLayout = QTW.QHBoxLayout()
  16. self.typeGenLabel = QTW.QLabel("Type: ")
  17. self.typeGenCombo = QTW.QComboBox()
  18. self.typeGenCombo.addItem("Rect")
  19. self.typeGenCombo.addItem("Sinc")
  20. self.typeGenCombo.addItem("Triangle")
  21. self.sigWidthLabel = QTW.QLabel("Width (us): ")
  22. self.sigWidthEdit = QTW.QSpinBox()
  23. self.sigWidthEdit.setMaximum(1000000)
  24. self.sigWidthEdit.setValue(1000)
  25. self.delayLabel = QTW.QLabel("Delay (us): ")
  26. self.delayEdit = QTW.QSpinBox()
  27. self.delayEdit.setMaximum(1000000)
  28. self.delayEdit.setValue(500)
  29. self.frontsLabel = QTW.QLabel("Fronts (us): ")
  30. self.frontsEdit = QTW.QSpinBox()
  31. self.frontsEdit.setMaximum(100)
  32. self.frontsEdit.setValue(2)
  33. self.numLabel = QTW.QLabel("Repeats: ")
  34. self.numEdit = QTW.QSpinBox()
  35. self.numEdit.setMaximum(1000)
  36. self.numEdit.setValue(5)
  37. self.paramLayout.addWidget(self.typeGenLabel)
  38. self.paramLayout.addWidget(self.typeGenCombo)
  39. self.paramLayout.addWidget(self.sigWidthLabel)
  40. self.paramLayout.addWidget(self.sigWidthEdit)
  41. self.paramLayout.addWidget(self.delayLabel)
  42. self.paramLayout.addWidget(self.delayEdit)
  43. self.paramLayout.addWidget(self.frontsLabel)
  44. self.paramLayout.addWidget(self.frontsEdit)
  45. self.paramLayout.addWidget(self.numLabel)
  46. self.paramLayout.addWidget(self.numEdit)
  47. self.loadLayout = QTW.QHBoxLayout()
  48. self.loadFileEdit = QTW.QLineEdit()
  49. self.loadFileButton = QTW.QToolButton()
  50. self.freqLabel = QTW.QLabel("Central freq (kHz): ")
  51. self.freqEdit = QTW.QSpinBox()
  52. self.freqEdit.setMaximum(50000)
  53. self.freqEdit.setValue(2950)
  54. self.loadButton = QTW.QPushButton("Load")
  55. self.loadLabel = QTW.QLabel("Not loaded")
  56. self.syncLayout = QTW.QHBoxLayout()
  57. self.syncButton = QTW.QPushButton("Sync Alone Test")
  58. self.syncButton.pressed.connect(self.syncAlone)
  59. self.loadLayout.addWidget(self.freqLabel)
  60. self.loadLayout.addWidget(self.freqEdit)
  61. self.loadLayout.addWidget(self.loadButton)
  62. self.loadLayout.addWidget(self.loadLabel)
  63. self.syncLayout.addWidget(self.syncButton)
  64. self.loadButton.pressed.connect(self.loadFileDialog)
  65. self.mainlayout = QTW.QVBoxLayout()
  66. self.mainlayout.addLayout(self.genLayout)
  67. self.mainlayout.addLayout(self.paramLayout)
  68. self.mainlayout.addLayout(self.loadLayout)
  69. self.mainlayout.addLayout(self.syncLayout)
  70. self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  71. self.setLayout(self.mainlayout)
  72. def syncAlone(self):
  73. self.sock.connect(('rp-f0cf82.local', 5005))
  74. buffer = struct.pack('<B', 0x05)
  75. self.sock.sendall(buffer)
  76. buffer = self.sock.recv(4096)
  77. def genFileDialog(self):
  78. filename, ok = QTW.QFileDialog.getSaveFileName(
  79. self,
  80. "Save a File",
  81. "",
  82. "BIN traject (*.bin)"
  83. )
  84. if filename:
  85. swidth = self.sigWidthEdit.value()
  86. delay = self.delayEdit.value()
  87. fronts = self.frontsEdit.value()
  88. num = self.numEdit.value()
  89. sigtype = self.typeGenCombo.currentText()
  90. array = np.array([], dtype=np.int16)
  91. samples = (swidth + delay) * 2 * num
  92. if sigtype == "Rect":
  93. delaySamples = delay * 125
  94. highSamples = swidth * 125
  95. frontSamples = fronts * 125
  96. for i in range(num):
  97. for j in range(frontSamples):
  98. array = np.append(array, np.int16(32700 * j // frontSamples))
  99. array = np.append(array, np.int16(0))
  100. for j in range(highSamples):
  101. array = np.append(array, np.int16(32700))
  102. array = np.append(array, np.int16(0))
  103. for j in range(frontSamples):
  104. array = np.append(array, np.int16(32700 - 32700 * j // frontSamples))
  105. array = np.append(array, np.int16(0))
  106. for j in range(delaySamples):
  107. array = np.append(array, np.int16(0))
  108. array = np.append(array, np.int16(0))
  109. else:
  110. return -1
  111. with open(filename, "wb") as f:
  112. data = array.tobytes()
  113. f.write(data)
  114. self.genLabel.setText("Generated")
  115. def loadFileDialog(self):
  116. filename, ok = QTW.QFileDialog.getOpenFileName(
  117. self,
  118. "Open a File",
  119. "",
  120. "BIN traject (*.bin)"
  121. )
  122. if filename:
  123. data = b''
  124. with open(filename, "rb") as f:
  125. data = f.read()
  126. alts = np.array([], dtype=np.int16)
  127. phases = np.array([], dtype=np.int16)
  128. test = np.frombuffer(data, dtype=np.int16, count=16)
  129. for i in range(len(data) // 4):
  130. alts = np.append(alts, [np.frombuffer(data, dtype=np.int16, count=1, offset=4*i)])
  131. phases = np.append(phases, [np.frombuffer(data, dtype=np.int16, count=1, offset=4*i+2)])
  132. swidth = self.sigWidthEdit.value()
  133. delay = self.delayEdit.value()
  134. fronts = self.frontsEdit.value()
  135. freq = self.freqEdit.value()
  136. print(len(alts))
  137. print(len(phases))
  138. fbuf = np.array([], dtype=np.float32)
  139. tbuf = np.arange(0, np.float32((swidth + delay + 2 * fronts) * 10e-6), np.float32(8 * 10e-9))
  140. fbuf = np.float32((alts / 32767) * np.float32(np.sin(2 * np.pi * freq * 100 * tbuf + np.pi * phases / (32767 * 2))))
  141. print(fbuf[10000:12000])
  142. self.sock.connect(('rp-f0cf82.local', 5005))
  143. buffer = struct.pack('<BIII', 0x01, (len(fbuf) // 4096 + 1) * 4096, 1, 1)
  144. self.sock.sendall(buffer)
  145. buffer = self.sock.recv(4096)
  146. if buffer[0] == 0x11:
  147. for i in range(0, len(fbuf), 509):
  148. datasize = 509
  149. if len(fbuf) - i < 509:
  150. datasize = len(fbuf) - i
  151. buffer = struct.pack('<BI', 0x11, np.uint32(datasize)) + fbuf[i:(i+datasize)].tobytes()
  152. print(np.frombuffer(fbuf[i:(i+datasize)].tobytes(), dtype=np.float32, count=1, offset=0))
  153. self.sock.sendall(buffer)
  154. buffer = self.sock.recv(4096)
  155. if buffer[0] != 0x11:
  156. self.sock.close()
  157. return -1
  158. else:
  159. self.sock.close()
  160. return -1
  161. buffer = struct.pack('<B', 0x21)
  162. self.sock.sendall(buffer)
  163. buffer = self.sock.recv(1024)
  164. if buffer[0] == 0x01:
  165. self.loadLabel.setText("Loaded")
  166. self.sock.close()
  167. app = QTW.QApplication(sys.argv)
  168. window = Window()
  169. window.show()
  170. sys.exit(app.exec())