Class: Apiotics::Hardware

Inherits:
Object
  • Object
show all
Defined in:
lib/apiotics/hardware.rb

Class Method Summary collapse

Class Method Details

.bitsObject



6
7
8
# File 'lib/apiotics/hardware.rb', line 6

def self.bits
  OS.bits
end

.install_firmware(config_script, firmware_path, starting_address) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/apiotics/hardware.rb', line 62

def self.install_firmware(config_script, firmware_path, starting_address)
  directory = Rails.root.join('lib', 'openocd', 'gnuarmeclipse')
  unless Dir.exist?(directory)
    self.save_openocd
    self.unpack_openocd
  end
  directory = Rails.root.join('lib', 'openocd', 'gnuarmeclipse', 'openocd')
  Dir.chdir directory
  version_folder = Dir['*/'].first[0..-2]
  directory = Rails.root.join('lib', 'openocd', 'gnuarmeclipse', 'openocd', version_folder)
  Dir.chdir directory
  string = "bin/openocd -f \"scripts/board/" + config_script + "\"" + " -c \"program " + firmware_path.to_s + " exit " + starting_address.to_s + "\""
  msg = system(string)
end

.linuxObject



10
11
12
# File 'lib/apiotics/hardware.rb', line 10

def self.linux
  OS.linux?
end

.macObject



14
15
16
# File 'lib/apiotics/hardware.rb', line 14

def self.mac
  OS.mac?
end

.openocd(worker_name, name) ⇒ Object



77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/apiotics/hardware.rb', line 77

def self.openocd(worker_name, name)
  download_directory = Rails.root.join('lib', 'openocd')
  Dir.mkdir download_directory unless Dir.exist?(download_directory)
  download_directory = Rails.root.join('lib', 'openocd', 'downloads')
  Dir.mkdir download_directory unless Dir.exist?(download_directory)
  Dir.chdir download_directory
  config = Apiotics::Portal.openocd_worker_config(worker_name)
  config = JSON.parse(config)
  unless config["openocd_config_file_name"] == nil || config["openocd_config_file_name"] == ""
    path = Rails.root.join('lib', 'openocd', 'downloads', config["openocd_config_file_name"])
    if File.exist?(path)
    else
      firmware_data = Apiotics::Portal.download_firmware(worker_name)
      file = File.new(path, 'w')
      file.write firmware_data.force_encoding(Encoding::UTF_8)
      file.close
    end
    clean_string = "1" * 68 * 8
    clean = Array.new
    clean[0] = clean_string
    clean_bits = clean.pack("B*")
    if name != nil
      if name.length > 64
        name = name[0..63]
      end
      data = File.open(path, 'r+')
      version_offset = 2048
      offset = version_offset + 4 + 68 + 68 + 68
      IO.write(data, clean_bits.force_encoding(Encoding::UTF_8), offset)
      name = name + "\0"
      IO.write(data, name, offset)
      data.close
    else
      data = File.open(path, 'r+')
      version_offset = 2048
      offset = version_offset + 4 + 68 + 68 + 68
      IO.write(data, clean_bits.force_encoding(Encoding::UTF_8), offset)
      data.close
    end
    msg = self.install_firmware(config["openocd_config_file_name"], path, config["openocd_start_address"])
  end
  return msg
end

.save_openocdObject



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/apiotics/hardware.rb', line 18

def self.save_openocd
  os = nil
  if self.linux == true 
    if self.bits == 64
      os = "debian64"
    elsif self.bits == 32
      os = "debian32"
    end
  elsif self.mac == true
    os = "mac"
  end
  if os == "debian64" || os == "debian32"
    group = Etc.getgrnam('plugdev')
     = Etc.getlogin
    info = Etc.getpwnam()
    username = info.gecos.split(/,/).first
    unless group.mem.include?(username)
      puts "Please enter your password: \n"
      password = system "stty -echo"
      `usermod -a -G plugdev #{username} -p #{password}`
      `exec $SHELL`
    end
  end
  unless os == nil
    data = Apiotics::Portal.openocd(os)
    directory = Rails.root.join('lib', 'openocd')
    Dir.mkdir directory unless Dir.exist?(directory)
    path = Rails.root.join('lib', 'openocd', 'openocd.tgz')
    file = File.new(path, 'w')
    file.write data.force_encoding(Encoding::UTF_8)
    file.close
  end
end

.unpack_openocdObject



52
53
54
55
56
57
58
59
60
# File 'lib/apiotics/hardware.rb', line 52

def self.unpack_openocd
  directory = Rails.root.join('lib', 'openocd')
  Dir.chdir directory
  path = Rails.root.join('lib', 'openocd', 'openocd.tgz')
  msg = system("tar -xvzf #{path}")
  if msg == true
    File.delete(path) if File.exist?(path)
  end
end