Simulation Core
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

132 lines
4.9 KiB

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