Simulation Core
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

134 строки
4.8 KiB

  1. # 1 "/mnt/c/Projects/VSIM/SimulationCore2/Redis/Redis_Interface.f90"
  2. Module RedisInterface
  3. ! use iso_c_binding, only: c_char
  4. Interface
  5. SUBROUTINE addnums(a, b) BIND(C,name='addnums')
  6. USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_INT
  7. IMPLICIT NONE
  8. INTEGER(C_INT) :: a, b
  9. END SUBROUTINE addnums
  10. SUBROUTINE initConnection_C(address,port,password,datakey) BIND(C, name='initConnection')
  11. use iso_c_binding, only: c_char,c_int
  12. character(kind=c_char) :: address(*)
  13. integer(kind=c_int)::port
  14. character(kind=c_char) :: password(*),datakey(*)
  15. END SUBROUTINE initConnection_C
  16. SUBROUTINE setData_C(part,str) BIND(C,name='setData')
  17. use iso_c_binding, only: c_char
  18. character(kind=c_char) :: str(*)
  19. character(kind=c_char) :: part(*)
  20. END SUBROUTINE setData_C
  21. FUNCTION getData_C(len) BIND(C,name='getData')
  22. use iso_c_binding, only: c_ptr,c_int
  23. integer(kind=c_int)::len
  24. type(c_ptr) :: getData_C
  25. END FUNCTION getData_C
  26. SUBROUTINE deallocateData() BIND(C, name='deallocData')
  27. END SUBROUTINE deallocateData
  28. End Interface
  29. contains
  30. SUBROUTINE initConnection(configFilename)
  31. use json_module
  32. use iso_c_binding, only: c_null_char,c_char
  33. character(len=*) :: configFilename
  34. integer::port
  35. type(json_file) :: jsonfile
  36. type(json_value),pointer :: jsonvalue,jsonvalue2
  37. type(json_core) :: jsoncore
  38. logical :: is_found
  39. character(len=:),allocatable :: password,address,datakey
  40. character(len=:),allocatable::c_address,c_password,c_datakey
  41. call jsonfile%initialize()
  42. print *,"Initilized: ",configFilename
  43. call jsonfile%load_file(configFilename);
  44. if (jsonfile%failed()) then
  45. print *,"can not open config file: ",configFilename ;
  46. stop
  47. endif
  48. print *,"file read"
  49. call jsonfile%json_file_get_root(jsonvalue)
  50. call jsoncore%get(jsonvalue,'redis',jsonvalue2)
  51. call jsoncore%get(jsonvalue2,"address",address);
  52. call jsoncore%get(jsonvalue2,"port",port);
  53. call jsoncore%get(jsonvalue2,"password",password);
  54. call jsoncore%get(jsonvalue2,"datakey",datakey);
  55. c_datakey = datakey//c_null_char
  56. c_password = password//c_null_char
  57. c_address = address//c_null_char
  58. call initConnection_C(c_address,port,c_password,c_datakey)
  59. print *,"returned to initConnection"
  60. END SUBROUTINE initConnection
  61. SUBROUTINE setData(str)
  62. use iso_c_binding, only: c_null_char
  63. character(len=*):: str
  64. character(len=len_trim(str)+1)::c_str
  65. character(len=4)::part
  66. part = "out"//c_null_char
  67. c_str = str//c_null_char
  68. print *,"setting Data: ",len_trim(str)
  69. call setData_C(part,c_str)
  70. END SUBROUTINE setData
  71. SUBROUTINE setInput(str)
  72. use iso_c_binding, only: c_null_char
  73. character(len=*):: str
  74. character(len=len_trim(str)+1)::c_str
  75. character(len=4)::part
  76. part = "in"//c_null_char
  77. c_str = str//c_null_char
  78. print *,"setting Data: ",len_trim(str)
  79. call setData_C(part,c_str)
  80. END SUBROUTINE setInput
  81. SUBROUTINE getData(string) !result(string)
  82. use iso_c_binding, only: c_char,c_ptr,c_f_pointer,c_null_ptr
  83. ! character(:),allocatable :: getData2
  84. character(:),allocatable :: string
  85. integer :: string_shape(1)
  86. type(c_ptr) :: c_string
  87. integer::l
  88. ! print *,"reading data (getData2)"
  89. c_string = getData_C(l)
  90. ! string = c_str
  91. ! len = int(c_len,kind=kind(len))
  92. string_shape(1) = int(l,kind=kind(integer))
  93. if(.not. allocated(string)) allocate(character(l) :: string)
  94. call c_f_pointer(c_string, string, string_shape)
  95. c_string=c_null_ptr
  96. ! print *,len_trim(string), "chars read."
  97. ! print *,string(1:l)
  98. ! getData2=string
  99. END SUBROUTINE getData
  100. SUBROUTINE getData2(string) !result(string)
  101. use iso_c_binding, only: c_char,c_ptr,c_f_pointer,c_null_ptr
  102. ! character(:),allocatable :: getData2
  103. character(:),allocatable :: string
  104. integer :: string_shape(1)
  105. type(c_ptr) :: c_string
  106. integer::l
  107. ! print *,"reading data (getData2)"
  108. c_string = getData_C(l)
  109. ! string = c_str
  110. ! len = int(c_len,kind=kind(len))
  111. string_shape(1) = int(l,kind=kind(integer))
  112. if(.not. allocated(string)) allocate(character(l) :: string)
  113. call c_f_pointer(c_string, string, string_shape)
  114. c_string=c_null_ptr
  115. ! print *,len_trim(string), "chars read."
  116. ! print *,string(1:l)
  117. ! getData2=string
  118. END SUBROUTINE getData2
  119. END Module RedisInterface