1'''
2I2C - I2C_write_read.py with asynchronous mode.
3
4This example demonstrates how to communicate with USBDAQF1D. (master) and 24C08C (slave) with I2C interface.
5
6First, it shows how to open I2C port and configure I2C parameters.
7Second, write some bytes with address into EEPROM (24C08C). We have to make sure that bytes written in address is correct however read address from EEPROM (24C08C).
8Last, close I2C port
9
10The sensor used in this example is a 24C08C expecially for Two-wore Serial EEPROM.
11
12-------------------------------------------------------------------------------------
13Please change correct serial number or IP and port number BEFORE you run example code.
14
15For other examples please check:
16 https://github.com/WPC-Systems-Ltd/WPC_Python_driver_release/tree/main/examples
17See README.md file to get detailed usage of this example.
18
19Copyright (c) 2022-2025 WPC Systems Ltd. All rights reserved.
20'''
21
22## WPC
23from wpcsys import pywpc
24
25## Python
26import asyncio
27import sys
28sys.path.insert(0, 'src/')
29
30
31async def main():
32 ## Get Python driver version
33 print(f'{pywpc.PKG_FULL_NAME} - Version {pywpc.__version__}')
34
35 ## Create device handle
36 dev = pywpc.USBDAQF1D()
37
38 ## Connect to device
39 try:
40 dev.connect("default") ## Depend on your device
41 except Exception as err:
42 pywpc.printGenericError(err)
43 ## Release device handle
44 dev.close()
45 return
46
47 try:
48 ## Parameters setting
49 port = 1 ## Depend on your device
50 mode = 0
51 device_address = 0x50 ## 01010000
52
53 ## Generate random data
54 import numpy as np
55 word_address = np.random.randint(8) ## Generate a random address
56 value = np.random.randint(256) ## Generate a random value
57
58 '''
59 Take 24C08C for example
60 '''
61
62 ## Get firmware model & version
63 driver_info = await dev.Sys_getDriverInfo_async()
64 print(f"Model name: {driver_info[0]}, Firmware version: {driver_info[-1]} ")
65
66 '''
67 Open I2C port
68 '''
69
70 ## Open I2C
71 err = await dev.I2C_open_async(port)
72 print(f"I2C_open_async in port {port}, status: {err}")
73
74 '''
75 Set I2C parameter
76 '''
77
78 ## Set I2C port and set clock rate to standard mode
79 err = await dev.I2C_setClockRate_async(port, mode)
80 print(f"I2C_setClockRate_async in port {port}, status: {err}")
81
82 '''
83 Write data via I2C
84 '''
85
86 ## Write WREN byte
87 err = await dev.I2C_write_async(port, device_address, [word_address, value])
88 print(f"I2C_write_async in port {port}, status: {err}")
89 print(f"write data: 0x{value:02X}")
90
91 '''
92 Read data via I2C
93 '''
94
95 err = await dev.I2C_write_async(port, device_address, [word_address])
96 print(f"I2C_write_async in port {port}, status: {err}")
97
98 data = await dev.I2C_read_async(port, device_address, 1)
99 print(f"read data: 0x{data[0]:02X}")
100
101 '''
102 Close I2C port
103 '''
104
105 ## Close I2C
106 err = await dev.I2C_close_async(port)
107 print(f"I2C_close_async in port {port}, status: {err}")
108 except Exception as err:
109 pywpc.printGenericError(err)
110
111 finally:
112 ## Disconnect device
113 dev.disconnect()
114
115 ## Release device handle
116 dev.close()
117
118
119def main_for_spyder(*args):
120 if asyncio.get_event_loop().is_running():
121 return asyncio.create_task(main(*args)).result()
122 else:
123 return asyncio.run(main(*args))
124
125
126if __name__ == '__main__':
127 asyncio.run(main()) ## Use terminal
128 # await main() ## Use Jupyter or IPython(>=7.0)
129 # main_for_spyder() ## Use Spyder