반응형

 

#include <Servo.h>
#include "DHT.h" 
#include <SoftwareSerial.h>

Servo myservo;
Servo Tapservo;
int force_sensor1 = A0;
int force_sensor2 = A1;
int water = A3;

//블루투스 모듈
#define blueTX 5  // BT_TXD를 5로 설정합니다.
#define blueRX 13  // BT_RXD를 13으로 설정합니다.

SoftwareSerial mySerial(blueRX, blueTX);
//5, 13번 data pin사용

int ledPin_bath= 2;

int dhtPin = 3;

int servoPin = 4;

int servoTap = 6;

int ledPin_room = 7;

int Relaypin = 9;

int count = 0;
int alarm = -1;
int ButtonSwitch =0;

//초음파 센서
#define echoPin 12                    // echoPin을 12로 설정합니다.
#define trigPin 11                   // trigPin을 13으로 설정합니다.
//12~13 data pin사용

long duration, distance;

DHT dht(dhtPin,DHT11);

int old_force1=0;
int val = 0;

int angle = 0;

void setup() {
  // put your setup code here, to run once:
   
  Serial.begin(9600);

  mySerial.begin(9600);

  myservo.attach(servoPin);
  Tapservo.attach(servoTap);

  pinMode(Relaypin, OUTPUT);
  
  pinMode(ledPin_bath, OUTPUT);
  pinMode(ledPin_room, OUTPUT);
  
  pinMode(force_sensor1, INPUT);
  pinMode(force_sensor2, INPUT);
  
  pinMode(trigPin, OUTPUT);   // trigPin 핀을 출력핀으로 설정합니다.
  pinMode(echoPin, INPUT);    // echoPin 핀을 입력핀으로 설정합니다.
}

void loop() {

  // put your main code here, to run repeatedly:
  int level = analogRead(water);  // 수분센서의 신호를 측정합니다.


  int force_val1 = analogRead(force_sensor1); 
  int force_val2 = analogRead(force_sensor2);

  
 int angle1 = 0;

//블루투스 모듈 (begin)
  if (mySerial.available()) {
    Serial.write(mySerial.read());  //블루투스측 내용을 시리얼모니터에 출력
    alarm = 1;
    ButtonSwitch++;
    if(ButtonSwitch>1){
      ButtonSwitch=0;
    }
    else if(ButtonSwitch==0){
      alarm=-1;
    }
    if(alarm==1){
      Serial.println("All Sensors ON");
      digitalWrite(ledPin_room, HIGH);
      digitalWrite(ledPin_bath, HIGH);
      digitalWrite(Relaypin, HIGH);
      for(angle1 = 180; angle1 > 0; angle1--) 
      { 
        Tapservo.write(angle1); 
        delay(5); 
      }
    }
    else{
    Serial.println("All Sensors OFF");
    }
  }
  if(Serial.available()){
    mySerial.write(Serial.read());
  }
//블루투스 모듈 (end)




//릴레이1채널 + 진동
/*
  if(val == 1){
    digitalWrite(Relaypin, HIGH);
  }
  else{
    digitalWrite(Relaypin, LOW)
  };*/
//
 
//물 센서
  Serial.println(String("water level :")+level);
//  delay(100);
  if(level >500 && count == 0){
    for(angle1 = 0; angle1 < 180; angle1++) 
    { 
      Tapservo.write(angle1); 
      delay(5); 
      count++;
    }
    angle1 = 0; 
  }

  if(level < 500){
    count = 0;
  }

//압력
  Serial.println("first : "+String(force_val1));
//  delay(100);
  Serial.println("second : "+String(force_val2));
//  delay(100);


//초음파 센서 (begin)
  digitalWrite(trigPin, LOW);                 // trigPin에 LOW를 출력하고
  delayMicroseconds(2);                    // 2 마이크로초가 지나면
  digitalWrite(trigPin, HIGH);                // trigPin에 HIGH를 출력합니다.
  delayMicroseconds(10);                  // trigPin을 10마이크로초 동안 기다렸다가
  digitalWrite(trigPin, LOW);                // trigPin에 LOW를 출력합니다.
  duration = pulseIn(echoPin, HIGH);   // echoPin핀에서 펄스값을 받아옵니다.

  distance = duration * 17 / 1000;          //  duration을 연산하여 센싱한 거리값을 distance에 저장합니다.

  if (distance >= 200 || distance <= 0)       // 거리가 200cm가 넘거나 0보다 작으면
  {
    Serial.println("거리를 측정할 수 없음");   // 에러를 출력합니다.
  }
  else if(distance >= 0 && distance <=7){
    digitalWrite(ledPin_bath, LOW);
    digitalWrite(ledPin_room, LOW);
    Serial.print(distance);
    Serial.println(" cm");
    Serial.println("Passed");    
  }
    else                                               // 거리가 200cm가 넘지 않거나 0보다 작지 않으면
  {
    Serial.print(distance);                        // distance를 시리얼 모니터에 출력합니다.
    Serial.println(" cm");                         // cm를 출력하고 줄을 넘깁니다.
                                                     // distance가 10이면 10 cm로 출력됩니다.
  }
//  delay(100);                                         // 0.5초동안 기다립니다.
//초음파센서 (end)



//압력 값 조건 되면 
  if(force_val1 < 50 && force_val2 != 0 && old_force1 > force_val1+100){
    digitalWrite(Relaypin, LOW);
  }

  old_force1 = force_val1;

 //온습도 측정 데이터 보여줌
  int humidity = dht.readHumidity();
  int temperature = dht.readTemperature();
  
  Serial.print("Humidity: ");  // 문자열 Humidity: 를 출력한다.
  Serial.print(humidity);  // 변수 h(습도)를 출력한다.
  Serial.print("%\t");  // %를 출력한다
  Serial.print("Temperature: ");  // 이하생략
  Serial.print(temperature);
  Serial.println(" C");


  
//습도 높으면 환기 모터 돌아감
  if(humidity  > 75){
    for(angle = 0; angle < 180; angle++) 
    { 
      myservo.write(angle); 
      delay(5); 
    } 
    // now scan back from 180 to 0 degrees
    for(angle = 180; angle > 0; angle--) 
    { 
      myservo.write(angle); 
      delay(5); 
    }
  }

  delay(450);
   
}

1. 사용자가 어플리케이션에서 알람 시간을 설정하면 그 시간에 알람이 울림과 동시에 온수 보일러가 가동된다.

 

2. 침대의 압력센서가 사용자가 침대에 누워있는지를 감지하고 압력이 감지되지 않을 때까지 알람이 울리도록 설계하여 회사나 수업에 지각하는 일을 방지해준다.

 

3. 이런 과정동안 욕조에는 자동으로 데워진 물이 채워지고 일정한 수위가 넘어가면 수도꼭지가 잠겨 더 이상 욕조의 물이 넘치는 일을 방지한다.

 

4. 사용자가 씻는 과정을 마친 후에는 자동으로 화장실의 습도를 측정하여 일정 수준을 넘기면 환풍기가 작동하여 화장실의 습도를 조절해준다.

 

5. 출근 준비가 끝난 사용자는 어플리케이션을 실행하여 메인 화면을 통해 회사 지역의 시간별 날씨를 확인하고 대중교통의 다음 도착시간, 그날 아침의 뉴스 헤드라인을 한번에 확인할 수 있다.

 

6. 또한 오늘 챙겨야 할 물품들을 전날에 미리 어플리케이션에 등록하는 과정을 통해 챙겨야 할 물품들을 다시한번 확인하여 준비물을 까먹고 그냥 출근하는 경우를 예방한다.

 

7. 사용자가 집을 나서기 전, 현관에 위치한 초음파 센서를 통해 사용자가 집을 나가는 것을 확인하면 집 안의 환풍기를 제외한 모든 센서와 조명등이 자동으로 꺼진다.

 

 

728x90
반응형

'공부 > 아두이노' 카테고리의 다른 글

아두이노 압력센서  (0) 2020.07.18
아두이노 온습도 센서  (0) 2020.07.18
아두이노 센서 여러개 사용시 에러  (0) 2020.07.17
블로그 이미지

아상관없어

,
반응형

핀 위치를 바꿔서 꼽아보고 안되면 아두이노 메가 등을 이용하자... 블루투스나 ESP8266같은 와이파이 모듈 사용시 핀 위치 때문에 에러가 많이 난다.

 

(

각각의 센서는 잘되지만 잘 되던 센서들을 한번에 연결하면 특히 오류가 잦다.

그중 블루투스나 와이파이모듈의 RX, TX핀을 어디에 꼽는지에따라 다른 센서가 작동되기도 안되기도 한다 따라서 RX, TX핀 위치를 바꾸어가면서 다른센서가 동작하는지 확인하는 것이 정신건강에 좋다...

 

그리고 가끔 전선의 문제도 잇으니 바꿔서 해보는 것을 추천한다...

 

내가 산 아두이노가 지랄맞은것인진 모르겟으나 여러센서들이 한꺼번에 잘 작동되는것이 자고일어나면 안되는 경우도 많았다....ㅂㄷ..

 

다른 이유론 코딩시 데이터핀 위치를 잘못 지정해주거나 코드상에 오류가 있어 작동을 안하는경우도 있으니 코드도 다시 확인하자.....

(컴퓨터는 거짓말을 하지 않는다... 모두 휴먼탓일뿐이다...)

 

+ 들리는 썰에 의하면 정품 아두이노 UNO보다 짭 UNO보드가 에러를 안일으킨다는 썰이 있다...

)

728x90
반응형

'공부 > 아두이노' 카테고리의 다른 글

아두이노 압력센서  (0) 2020.07.18
아두이노 온습도 센서  (0) 2020.07.18
아두이노 미니 스마트홈  (0) 2020.07.17
블로그 이미지

아상관없어

,
반응형

 

<!DOCTYPE html>
<html>
<style type="text/css">
    canvas { background: blue; }
</style>

<button id = "ButtonX">Rotate X</button>
<button id = "ButtonY">Rotate Y</button>
<button id = "ButtonZ">Rotate Z</button>


<select id = "SelectedImgae" onchange="change();">
    <option value="image1">image1</option>
    <option value="image2">image2</option>
    <option value="image3">image3</option>
</select>


<script id="vertex-shader" type="x-shader/x-vertex">

attribute  vec4 vPosition;
attribute  vec4 vColor;
attribute  vec2 vTexCoord;

varying vec4 fColor;
varying vec2 fTexCoord;

uniform vec3 theta;

void main()
{
    // Compute the sines and cosines of theta for each of
    //   the three axes in one computation.
    vec3 angles = radians( theta );
    vec3 c = cos( angles );
    vec3 s = sin( angles );

    // Remeber: thse matrices are column-major
    mat4 rx = mat4( 1.0,  0.0,  0.0, 0.0,
		    0.0,  c.x,  s.x, 0.0,
		    0.0, -s.x,  c.x, 0.0,
		    0.0,  0.0,  0.0, 1.0 );

    mat4 ry = mat4( c.y, 0.0, -s.y, 0.0,
		    0.0, 1.0,  0.0, 0.0,
		    s.y, 0.0,  c.y, 0.0,
		    0.0, 0.0,  0.0, 1.0 );

    mat4 rz = mat4( c.z, s.z, 0.0, 0.0,
		    -s.z,  c.z, 0.0, 0.0,
		    0.0,  0.0, 1.0, 0.0,
		    0.0,  0.0, 0.0, 1.0 );

    fColor = vColor;
    fTexCoord = vTexCoord;
    gl_Position = rz * ry * rx * vPosition;
    gl_Position.z = -gl_Position.z;
}
</script>

<script id="fragment-shader" type="x-shader/x-fragment">

precision mediump float;

varying vec4 fColor;
varying  vec2 fTexCoord;

//shader에서 텍스쳐 데이터에 접근
uniform sampler2D Tex0;


void
main()
{
    gl_FragColor = fColor*(texture2D(Tex0, fTexCoord)*texture2D(Tex1, fTexCoord)*texture2D(Tex2, fTexCoord));
}
</script>

<script type="text/javascript" src="./webgl-utils.js"></script>
<script type="text/javascript" src="./initShaders.js"></script>
<script type="text/javascript" src="./MV.js"></script>
<script type="text/javascript" src="./textureCube1.js"></script>


<body>
<canvas id="gl-canvas" width="512" height="512">
Oops ... your browser doesn't support the HTML5 canvas element
</canvas>
<img id = "image1" src = "./image1.jpg" ></img>
<img id = "image2" src = "./image2.jpg" ></img>
<img id = "image3" src = "./image3.jpg" ></img>
</body>
</html>

 

"use strict";

var canvas;
var gl;
//삼각형 4개, 사각형 1개(삼각형2개) => 4*3 + 2*4 = 18 개 정점
var numVertices  = 18;

var texSize = 64;


var program;

var pointsArray = [];
var colorsArray = [];
var texCoordsArray = [];

var texture;

//텍스쳐 좌표계
var texCoord = [
    vec2(0, 0),
    vec2(0, 1),
    vec2(1, 1),
    vec2(1, 0)
];

/*
var texCoord2 = [
    vec2(0, 1),
    vec2(0.5, 1),
    vec2(1, 0)
];
*/
/*
    [위에서 쳐다봤을때]
    삼각형 4개 
  1 ㅡㅡㅡㅡㅡㅡ 2
    |*      * |
    |  *  *   |
    |   *4    |  
    | *     * |
   0ㅡㅡㅡㅡㅡㅡ 3
        
*/
var vertices = [
    vec4( -0.5, -0.5,  -0.5, 1.0 ),//0
        vec4( -0.5, -0.5,  0.5, 1.0 ),//1
        vec4(  0.5, -0.5,  0.5, 1.0 ),//2
        vec4(  0.5, -0.5,  -0.5, 1.0 ),//3
        vec4(    0,  0.5,    0, 1.0 )//4
];


var vertexColors = [
    vec4( 0.0, 0.0, 0.0, 1.0 ),  // black
    vec4( 1.0, 0.0, 0.0, 1.0 ),  // red
    vec4( 1.0, 1.0, 0.0, 1.0 ),  // yellow
    vec4( 0.0, 1.0, 0.0, 1.0 ),  // green
    vec4( 0.0, 0.0, 1.0, 1.0 ),  // blue
    vec4( 1.0, 0.0, 1.0, 1.0 ),  // magenta
    vec4( 0.9, 0.9, 0.9, 1.0 ),  // white
    vec4( 0.0, 1.0, 1.0, 1.0 )   // cyan
];

var xAxis = 0;
var yAxis = 1;
var zAxis = 2;
var axis = xAxis;
var theta = [45.0, 45.0, 45.0];

var thetaLoc;

function configureTexture( image ) {
//1--------------------------------------------------------------------
	//텍스쳐 생성
    texture = gl.createTexture();
	//사용하기전에 바인딩
    gl.bindTexture( gl.TEXTURE_2D, texture );
	//webGL 애플리케이션은 Y축기준으로 텍스쳐 로딩
    gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
	//바인딩 후 이미지 데이터 생성 => 이미지를 textImage2D 함수로 넘김
    gl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB,
         gl.RGB, gl.UNSIGNED_BYTE, image );
       //밉맵 생성
    gl.generateMipmap( gl.TEXTURE_2D );
	//텍스쳐 필터 지정
    gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER,
                      gl.NEAREST_MIPMAP_LINEAR );
    gl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST );
    gl.uniform1i(gl.getUniformLocation(program, "texture"), 0);
   
//--------------------------------------------------------------------
}

function quad(a, b, c, d) {

     pointsArray.push(vertices[a]);
     colorsArray.push(vertexColors[6]);
     texCoordsArray.push(texCoord[0]);

     pointsArray.push(vertices[b]);
     colorsArray.push(vertexColors[6]);
     texCoordsArray.push(texCoord[1]);

     pointsArray.push(vertices[c]);
     colorsArray.push(vertexColors[6]);
     texCoordsArray.push(texCoord[2]);

     pointsArray.push(vertices[a]);
     colorsArray.push(vertexColors[6]);
     texCoordsArray.push(texCoord[0]);

     pointsArray.push(vertices[c]);
     colorsArray.push(vertexColors[6]);
     texCoordsArray.push(texCoord[2]);

     pointsArray.push(vertices[d]);
     colorsArray.push(vertexColors[6]);
     texCoordsArray.push(texCoord[3]);
}

function triple(a, b, c) {
     pointsArray.push(vertices[a]);
     colorsArray.push(vertexColors[6]);
     texCoordsArray.push(texCoord[0]);

     pointsArray.push(vertices[b]);
     colorsArray.push(vertexColors[6]);
     texCoordsArray.push(texCoord[1]);

     pointsArray.push(vertices[c]);
     colorsArray.push(vertexColors[6]);
     texCoordsArray.push(texCoord[2]);

} 

function colorCube()
{
   triple( 0, 4, 1);
   triple( 3, 4, 0 );
   triple( 2, 4, 3);
   triple( 1, 4, 2 );
   quad( 0, 1, 2,3 );
}

function chageSelectedValue(){
    var SelectedImg = document.getElementById("Selected Imgae");
    var selectedValue = SelectedImg.options[SelectedImg.selectedIndex].value;
  
}


window.onload = function init() {

    canvas = document.getElementById( "gl-canvas" );

    gl = WebGLUtils.setupWebGL( canvas );
    if ( !gl ) { alert( "WebGL isn't available" ); }

    gl.viewport( 0, 0, canvas.width, canvas.height );
    gl.clearColor( 1.0, 1.0, 1.0, 1.0 );

    gl.enable(gl.DEPTH_TEST);

    //
    //  Load shaders and initialize attribute buffers
    //
    program = initShaders( gl, "vertex-shader", "fragment-shader" );
    gl.useProgram( program );

    colorCube();


    var cBuffer = gl.createBuffer();
    gl.bindBuffer( gl.ARRAY_BUFFER, cBuffer );
    gl.bufferData( gl.ARRAY_BUFFER, flatten(colorsArray), gl.STATIC_DRAW );

    var vColor = gl.getAttribLocation( program, "vColor" );
    gl.vertexAttribPointer( vColor, 4, gl.FLOAT, false, 0, 0 );
    gl.enableVertexAttribArray( vColor );

    var vBuffer = gl.createBuffer();
    gl.bindBuffer( gl.ARRAY_BUFFER, vBuffer );
    gl.bufferData( gl.ARRAY_BUFFER, flatten(pointsArray), gl.STATIC_DRAW );

    var vPosition = gl.getAttribLocation( program, "vPosition" );
    gl.vertexAttribPointer( vPosition, 4, gl.FLOAT, false, 0, 0 );
    gl.enableVertexAttribArray( vPosition );

    var tBuffer = gl.createBuffer();
    gl.bindBuffer( gl.ARRAY_BUFFER, tBuffer );
    gl.bufferData( gl.ARRAY_BUFFER, flatten(texCoordsArray), gl.STATIC_DRAW );

    var vTexCoord = gl.getAttribLocation( program, "vTexCoord" );
    gl.vertexAttribPointer( vTexCoord, 2, gl.FLOAT, false, 0, 0 );
    gl.enableVertexAttribArray( vTexCoord );






    change();

    thetaLoc = gl.getUniformLocation(program, "theta");

    document.getElementById("ButtonX").onclick = function(){axis = xAxis;};
    document.getElementById("ButtonY").onclick = function(){axis = yAxis;};
    document.getElementById("ButtonZ").onclick = function(){axis = zAxis;};

    render();

}

function change(){

    var SelectedImg = document.getElementById("SelectedImgae");
    var id = SelectedImg.options[SelectedImg.selectedIndex].value;

    var image = document.getElementById(id);
    configureTexture( image );
}



var render = function(){
    gl.clear( gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    theta[axis] += 2.0;
    gl.uniform3fv(thetaLoc, flatten(theta));
    gl.drawArrays( gl.TRIANGLES, 0, numVertices );
    requestAnimFrame(render);
}

참고: 만약 로컬에서 이걸 실행하는 경우 WebGL에서 이미지를 로드할 수 있도록 하기 위해 간단한 웹 서버가 필요합니다 => 가장 간단하게 만들 수 있는 웹 서버인 “Web Server for Chrome”

728x90
반응형

'공부 > WebGL' 카테고리의 다른 글

WebGL 피라미드  (0) 2020.07.17
WebGL sierpinski carpet  (0) 2020.07.17
블로그 이미지

아상관없어

,

WebGL 피라미드

공부/WebGL 2020. 7. 17. 02:33
반응형

<html>

<html>

<script id="vertex-shader" type="x-shader/x-vertex">

attribute  vec4 vPosition;
attribute  vec4 vColor;
varying vec4 fColor;

uniform vec3 theta;

void main() 
{
    // Compute the sines and cosines of theta for each of
    //   the three axes in one computation.
    vec3 angles = radians( theta );//각도입력
    vec3 c = cos( angles );//cos
    vec3 s = sin( angles );//sin

    // Remeber: thse matrices are column-major
    //x축 회전인데, column major로 표현
    mat4 rx = mat4( 1.0,  0.0,  0.0, 0.0,
		    0.0,  c.x,  s.x, 0.0,
		    0.0, -s.x,  c.x, 0.0,
		    0.0,  0.0,  0.0, 1.0 );
    //y축 회전인데, column major로 표현
    mat4 ry = mat4( c.y, 0.0, -s.y, 0.0,
		    0.0, 1.0,  0.0, 0.0,
		    s.y, 0.0,  c.y, 0.0,
		    0.0, 0.0,  0.0, 1.0 );

    //z축 회전인데, column major로 표현
    mat4 rz = mat4( c.z, -s.z, 0.0, 0.0,
		    s.z,  c.z, 0.0, 0.0,
		    0.0,  0.0, 1.0, 0.0,
		    0.0,  0.0, 0.0, 1.0 );

    fColor = vColor;
    gl_Position = rz * ry * rx * vPosition;
    //x, y, z순으로 곱해져야
    //새로운 vPosition
} 
</script>

<script id="fragment-shader" type="x-shader/x-fragment">

precision mediump float;
   
varying vec4 fColor;

void
main()
{
    gl_FragColor = fColor;
}
</script>

<script type="text/javascript" src="webgl-utils.js"></script>
<script type="text/javascript" src="initShaders.js"></script>
<script type="text/javascript" src="MV.js"></script>
<script type="text/javascript" src="cube.js"></script>

<body>
<canvas id="gl-canvas" width="512"" height="512">
Oops ... your browser doesn't support the HTML5 canvas element
</canvas>
   
<br/>

<button id= "xButton">Rotate X</button>
<button id= "yButton">Rotate Y</button>
<button id= "zButton">Rotate Z</button>

</body>
</html>

 

js

//=====================================================================
//변수들 선언
//=====================================================================
var canvas;
var gl;

//삼각형 4개, 사각형 1개(삼각형2개) => 4*3 + 2*4 = 18 개 정점
var NumVertices  = 18;

//정점을 저장하는 배열
var points = [];

//색상을 저장하는 배열
var colors = [];

//x, y, z축
var xAxis = 0;
var yAxis = 1;
var zAxis = 2;

//기본축
var axis = 0;

//x, y, z만큼 각도
var theta = [ 0, 0, 0 ];

var thetaLoc;
//=====================================================================
window.onload = function init()// 콜백함수, onload = 모든코드가 로드된 후 시작할 위치를 지정
//모든 action은 init()과 render()같은 함수 안에 잇는데, 
//onload 이벤트가 발생할때, init()함수를 실행하게함.
{
    canvas = document.getElementById( "gl-canvas" );
    // 캔버스를 읽어옴, getElementById 함수로 "gl-canvas"를 불러옴

    gl = WebGLUtils.setupWebGL( canvas );
    // 불러온 canvas를 인자로 넘겨, WebGL코드를 설정해줌
    if ( !gl ) { alert( "WebGL isn't available" ); }

    //함수 실행
    colorCube();
    //=====================================================================
    gl.viewport( 0, 0, canvas.width, canvas.height );//크기
    gl.clearColor( 1.0, 1.0, 1.0, 1.0 );//배경색
    //depth buffer의 내용에 따라 fragment의 깊이 값을 테스트합니다.
    //OpenGL은 depth test를 수행하고 이 테스트가 통과되면 이 depth buffer는 새로운 깊이 값으로 수정됩니다. 
    //이 테스트가 실패한다면 해당 fragment는 폐기됩니다.
    gl.enable(gl.DEPTH_TEST);
    //=====================================================================


    //=====================================================================
    //  Load shaders and initialize attribute buffers
    //=====================================================================
    //GPU에 넘겨줄 Program 객체
    //initShaders사용하여 shader 로드, 컴파일, 링크하여 Program객체 생성
    var program = initShaders( gl, "vertex-shader", "fragment-shader" );
    gl.useProgram( program );
    
    //-------------------------------------------------------------------
    //color 버퍼를 만들고 컬러를 넣음
    var cBuffer = gl.createBuffer();
    gl.bindBuffer( gl.ARRAY_BUFFER, cBuffer );
    gl.bufferData( gl.ARRAY_BUFFER, flatten(colors), gl.STATIC_DRAW );

    var vColor = gl.getAttribLocation( program, "vColor" );
    gl.vertexAttribPointer( vColor, 4, gl.FLOAT, false, 0, 0 );
    gl.enableVertexAttribArray( vColor );
    //-------------------------------------------------------------------

    //-------------------------------------------------------------------
    //data를 넣을 버펄르 만들고 데이터를 줌
    var vBuffer = gl.createBuffer();
    gl.bindBuffer( gl.ARRAY_BUFFER, vBuffer );
    gl.bufferData( gl.ARRAY_BUFFER, flatten(points), gl.STATIC_DRAW );
    

    var vPosition = gl.getAttribLocation( program, "vPosition" );
    gl.vertexAttribPointer( vPosition, 4, gl.FLOAT, false, 0, 0 );
    gl.enableVertexAttribArray( vPosition );
    //------------------------------------------------------------------- 

    //getUniformLocation함수로 theta값 가져옴.
    thetaLoc = gl.getUniformLocation(program, "theta");
     
    //=====================================================================


    //=====================================================================
    //버튼 이벤트 리스너 (축에 버튼에 해당하는 축을 넣음)
    //=====================================================================
    document.getElementById( "xButton" ).onclick = function () {
        axis = xAxis;
    };
    document.getElementById( "yButton" ).onclick = function () {
        axis = yAxis;
    };
    document.getElementById( "zButton" ).onclick = function () {
        axis = zAxis;
    };
    //=====================================================================   


    render();
}

//=====================================================================   
function colorCube()
{
    //피라미드는 삼각형 4개, 정육면체 1개
   triple( 1, 0, 4 );
   triple( 0, 3, 4 );
   triple( 3, 2, 4 );
   triple( 1, 4, 2 );
   quad( 0, 4, 7, 3 );
}
//=====================================================================   



//=====================================================================   
//삼각형을 그려줌, abc인자로
//=====================================================================   
/*
    [위에서 쳐다봤을때]
    삼각형 4개 
  1 ㅡㅡㅡㅡㅡㅡ 2
    |*      * |
    |  *  *   |
    |   *4    |  
    | *     * |
   0ㅡㅡㅡㅡㅡㅡ 3
        
*/
//사각뿔의 꼭지 위 점과, 밑 사각형의 점로 삼각형을 그림
function triple(a, b, c){
    //삼각형 4개 정점
    var vertices = [
        vec4( -0.5, -0.5,  -0.5, 1.0 ),//0
        vec4( -0.5, -0.5,  0.5, 1.0 ),//1
        vec4(  0.5, -0.5,  0.5, 1.0 ),//2
        vec4(  0.5, -0.5,  -0.5, 1.0 ),//3
        vec4(    0,  0.5,    0, 1.0 )//4
    ];
    var vertexColors = [
        [ 0.0, 0.0, 0.0, 1.0 ],  // black
        [ 1.0, 0.0, 0.0, 1.0 ],  // red
        [ 1.0, 1.0, 0.0, 1.0 ],  // yellow
        [ 0.0, 1.0, 0.0, 1.0 ],  // green
        [ 0.0, 0.0, 1.0, 1.0 ],  // blue
        [ 1.0, 0.0, 1.0, 1.0 ],  // magenta
        [ 0.0, 1.0, 1.0, 1.0 ],  // cyan
        [ 1.0, 1.0, 1.0, 1.0 ]   // white
    ];

    
    //삼각형이므로 인자를 3개 받음
    var indices = [ a, b, c ];

    for ( var i = 0; i < indices.length; ++i ) {
        //vertices[a], vertices[b], vertices[c]를 넣음
        points.push( vertices[indices[i]] );
            //평면의 색을 그라데이션효과 처럼 해줌        
        //colors.push( vertexColors[indices[i]] );
    
        //평면이 모두 같은 색(vertexColors[b]으로 되게 해줌 => 2번째 인자를 안겹치게 했음
        colors.push(vertexColors[b]);
        
    }
}
//=====================================================================   







//=====================================================================   
//4개의 인자로, abc, acd 사각형을 그려줌
//=====================================================================   
/*
[밑에서 쳐다봤을때] 
정육면체1개(삼각형 2개) 
        
   4ㅡㅡㅡㅡㅡㅡ7
    |         |
    |         |
    |         |  
    |         |
   0ㅡㅡㅡㅡㅡㅡ3
 =>예제 cube코드를 가져와 사용.       
*/
function quad(a, b, c, d) 
{
    //=> ppt그림 참고함
    var vertices = [
        vec4( -0.5, -0.5,  0.5, 1.0 ),//0
        vec4( -0.5,  0.5,  0.5, 1.0 ),//1
        vec4(  0.5,  0.5,  0.5, 1.0 ),//2
        vec4(  0.5, -0.5,  0.5, 1.0 ),//3
        vec4( -0.5, -0.5, -0.5, 1.0 ),//4
        vec4( -0.5,  0.5, -0.5, 1.0 ),//5
        vec4(  0.5,  0.5, -0.5, 1.0 ),//6
        vec4(  0.5, -0.5, -0.5, 1.0 )//7
    ];

    var vertexColors = [
        [ 0.0, 0.0, 0.0, 1.0 ],  // black
        [ 1.0, 0.0, 0.0, 1.0 ],  // red
        [ 1.0, 1.0, 0.0, 1.0 ],  // yellow
        [ 0.0, 1.0, 0.0, 1.0 ],  // green
        [ 0.0, 0.0, 1.0, 1.0 ],  // blue
        [ 1.0, 0.0, 1.0, 1.0 ],  // magenta
        [ 0.0, 1.0, 1.0, 1.0 ],  // cyan
        [ 1.0, 1.0, 1.0, 1.0 ]   // white
    ];

    
    var indices = [ a, b, c, a, c, d ];

    for ( var i = 0; i < indices.length; ++i ) {
        //vertices[a] ~ [b] ~ [c] ~ [a] ~ [c] ~[d]를 넣음
        points.push( vertices[indices[i]] );
        //colors.push( vertexColors[indices[i]] );
    
        // 위 삼각형들의 색상과 겹치지 않게 하기위해 6번째 색 사용 
        colors.push(vertexColors[5]);
        
    }
}
//=====================================================================   








//=====================================================================   
function render()
{
    gl.clear( gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);

    //aixs축 기준으로 각도 2도 만큼
    theta[axis] += 2.0;
    //uniform 변수로 theta 전달, vertex shader가 그릴수 있게 해줌.
    gl.uniform3fv(thetaLoc, theta);
    
    /* 밑의 코드와 동일 코드
    for(i = 0; i< points.length; i = i+3){ 
        gl.drawArrays( gl.TRIANGLES, i, 3);
    }*/
    gl.drawArrays( gl.TRIANGLES, 0, NumVertices );

    requestAnimFrame( render );
    //render 함수를 애니메이션으로 실행
}
//=====================================================================   

 

 

옆면의 삼각형 4개와 밑면의 사각형 하나가 필요하다. 밑면의 사각형은 2개의 삼각형으로 만들어지므로, 결국 6개의 삼각형으로 구성된다. 따라서 Numvertex18개가 된다.

 

 

꼭지점을 위 그림처럼 잡아주었고 그리고 순서를 0,1,2,3,4로주어 그림을 그렸다.

colorCube함수에 삼각형을 그려주는 triple함수를 구현하여, 삼각형과 사각형을 따로 구분 지어 그렸다.

728x90
반응형

'공부 > WebGL' 카테고리의 다른 글

WebGL 피라미드 텍스쳐  (0) 2020.07.17
WebGL sierpinski carpet  (0) 2020.07.17
블로그 이미지

아상관없어

,
반응형

 

carpet.html

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
<title>2D Sierpinski carpet LAST</title>

<!--Vertex Shader에 전송하는 변수 'v'Position-->
<script id="vertex-shader" type="x-shader/x-vertex">
attribute vec4 vPosition;

void
main()
{
    gl_Position = vPosition;
}
</script>

<!--fragment shader-->
<!--정밀도는 medium으로-->
<!--X => (배경색을 빨강으로 하고 안의 네모를 힌색으로 구현)-->
<script id="fragment-shader" type="x-shader/x-fragment">
precision mediump float;

void
main()
{
    gl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );
}
</script>


<script type="text/javascript" src="webgl-utils.js"></script>
<script type="text/javascript" src="initShaders.js"></script>
<!--
gasket2.js 에서 사용할 라이브러리, Web GL구동을 위한 기본적인 라이브러리
webgl-utils.js = 웹사이트의 Common 디렉토리에 있는 WebGL context를 설정하는 표준 유틸리티
initShaders.js = shader를 읽고, 컴파일하고, 링크하는 JS와 WebGL 코드
-->
<script type="text/javascript" src="MV.js"></script>
<!--수학함수 벡터관리 함수, 자체 행렬 벡터 패키지(책의 저자가 제공)-->
<script type="text/javascript" src="carpet.js"></script>
<!-- 실행 하려는 프로그램, 응용 프로그램 파일-->
</head>   

<body>
	<!-- 캔버스 정의-->
<canvas id="gl-canvas" width="512" height="512">
Oops ... your browser doesn't support the HTML5 canvas element
</canvas>
</body>
</html>

carpet.js

"use strict";

var canvas;
var gl;
var i;
var points = [];

var NumTimesToSubdivide = 7;



//onload함수로 시작함
window.onload = function init()// 콜백함수, onload = 모든코드가 로드된 후 시작할 위치를 지정
{
    canvas = document.getElementById( "gl-canvas" );
    // 캔버스를 읽어옴, getElementById 함수로 "gl-canvas"를 불러옴

    gl = WebGLUtils.setupWebGL( canvas );
    // 불러온 canvas를 인자로 넘겨, WebGL코드를 설정해줌

    if ( !gl ) { alert( "WebGL isn't available" ); }
    //예외처리

    //
    //  Initialize our data 
    //

    // 네 점 초기ㅗ하

    var vertices = [
        vec2(-1,-1),//a
        vec2(-1, 1),//b
        vec2(1, 1),//c
        vec2(1, -1)//d
    ];
    /*
     b     c
     *-----* 
     |   * |
     | *   |
     *-----*
     a     d

    */
    divideTriangle(vertices[0], vertices[1], vertices[2], vertices[3], NumTimesToSubdivide);
    

    /*==========================================================*/
    //WebGL 기본 코드 
    //
    //  Configure WebGL
    //
    gl.viewport( 0, 0, canvas.width, canvas.height );
    gl.clearColor( 1.0, 1.0, 1.0, 1.0  ); // X => (//색상 흰색으로)
    /*==========================================================*/


    /*====================================================================*/
    //  Load shaders and initialize attribute buffers
    //GPU에 넘겨줄 Program 객체
    //initShaders사용하여 shader 로드, 컴파일, 링크하여 Program객체 생성
    var program = initShaders( gl, "vertex-shader", "fragment-shader" );
    gl.useProgram( program );
    /*====================================================================*/


    /*========================================================================================*/
    // Load the data into the GPU
    //Vertex buffer 객체를 GPU에 로드함
    //버퍼를 만들어서 data를 줌성
    var bufferId = gl.createBuffer();//버퍼 생성
    gl.bindBuffer( gl.ARRAY_BUFFER, bufferId );//bufferId에 binding
    gl.bufferData( gl.ARRAY_BUFFER, flatten(points), gl.STATIC_DRAW );//데이터를 버퍼에
    //flatten() => js배열을 float32 배열로 변환 (OpenGL - JS간 배열 해석이 다르므로 row -> column)
    /*========================================================================================*/


    /*========================================================================================*/
    // Associate out shader variables with our data buffer
    //프로그램 내 변수와 shader변수를 연결해야함 => 버퍼내 이름, 타입, 위치가 필요
    //vPosition 변수에 실어 보냄, vPosition => 그 변수의 위치를 받아오겠다
    var vPosition = gl.getAttribLocation( program, "vPosition" );//getAttributeLocation = 위치
    gl.vertexAttribPointer( vPosition, 2, gl.FLOAT, false, 0, 0 );//vertex 속성, 2차원
    gl.enableVertexAttribArray( vPosition );
    /*========================================================================================*/


    //랜더링 = 그림을 그려줌
    render();
};

/*==========================*/
//WebGL은 삼각형만 디스플레이함/
/*==========================*/

//스택에 4개 넣고
//기본요소 TRIANGLE_FAN를 사용, 인자 4개
function triangle( a, b, c, d )
{
    points.push( a, b, c, d );
}


// X => (/* 배경을 빨간색으로 지정하고 안의 사각형을 힌색으로 지정해 안의 사각형만 그려주면됌*/)
//사각형을 그려줌, 중간 공간은 안그림
function divideTriangle( a, b, c, d, count )
{

    // check for end of recursion
    //더이상 쪼갤 필요가 없을때 
   if ( count === 0 ) {
        triangle( a, b, c, d);
    }

   else {
        //위
        var bc1 = mix( b, c, 1/3);
        var bc2 = mix( b, c, 2/3);

        //왼쪽
        var ab1 = mix( a, b, 1/3);
        var ab2 = mix( a, b, 2/3);

        //오른쪽
        var cd1 = mix( c, d, 1/3);
        var cd2 = mix( c, d, 2/3);

        //밑
        var ad1 = mix( a, d, 1/3);
        var ad2 = mix( a, d, 2/3);

        //중간 사각형 vertex
        var ma = mix( ab1, cd2, 1/3);
        var mb = mix( ab2, cd1, 1/3);
        var mc = mix( ab2, cd1, 2/3);
        var md = mix( ab1, cd2, 2/3);
        //=> 중간에 있는 4개 vertex를 사용해서 삼각형 두개로 사각형 만듬  
        //최종적 실행은 triangle(ma, mb, mc, md) => 각 사각형 마다 해주면됌      


        /*

            b  bc1 bc2  c
            *---*---*---*
            | 1 | 2 | 3 |
         ab2*---*---*---*cd1
            | 4 | 5 | 6 |
         ab1*---*---*---*cd2
            | 7 | 8 | 9 |
            *---*---*---* 
            a  ad1 ad2  d

        */
         --count;


        divideTriangle(ab2, b, bc1, mb, count);  //1번사각형
        divideTriangle(mb, bc1, bc2, mc, count); //2번사각형
        divideTriangle(mc, bc2, c, cd1, count);  //3번사각형
        divideTriangle(ab1, ab2, mb, ma, count); //4번사각형

        //중간 사각형은그리지 않으므로
        //divideTriangle(ma, mb, mc, md, count); //5번사각형 

        divideTriangle(md, mc, cd1, cd2, count); //6번사각형
        divideTriangle(a, ab1, ma, ad1, count);  //7번사각형
        divideTriangle(ad1, ma, md, ad2, count); //8번사각형
        divideTriangle(ad2, md, cd2, d, count);  //9번사각형
    }
}

function render()
{
    gl.clear( gl.COLOR_BUFFER_BIT );
    for(i = 0; i< points.length; i = i+4){ 
        gl.drawArrays( gl.TRIANGLE_FAN, i, 4);
    }
    //삼각형 두개 로 나눠서 위 삼각형 아래 삼각형 따로 함수 구현하지 않기 위해 Triganles 대신 Triangles_fan 사용
}

 

728x90
반응형

'공부 > WebGL' 카테고리의 다른 글

WebGL 피라미드 텍스쳐  (0) 2020.07.17
WebGL 피라미드  (0) 2020.07.17
블로그 이미지

아상관없어

,
반응형

mysh.h

//header for myshell by 이창민, ckdals0115@naver.com

//mysh.h

#include<unistd.h>

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<wait.h>

#include<sys/stat.h>

#include<sys/types.h>

#include<fcntl.h>

#include<signal.h>

#include<errno.h>

#define MAX 100

//static int child_pid = 0;

//static int COUNT = 0;

//static char* COMMAND_PATH = "Desktop/Sys/mysh/";

void redirection_com(char** commands, int i);

void background_com(char** commands, int i);

char** get_tokens(char* CommandLine);

void execute_com(char** command);

 

mysh.c

//myshell by 이창민, ckdals0115@naver.com
//mysh.c 
#include"mysh.h"
void main(){
	write(STDOUT_FILENO,"+------------------------------------------------------------------------------------+\n",88);
	write(STDOUT_FILENO,"|MYSHELL                                                                             |\n",88);
	write(STDOUT_FILENO,"|------------------------------------------------------------------------------------|\n",88);
	write(STDOUT_FILENO,"|QUIT : quit                                                                         |\n",88);
	write(STDOUT_FILENO,"+------------------------------------------------------------------------------------+\n",88);

	while(1){
		//write시 쓰레기값 없게 초기화
		char CommandLine[MAX]={0};
		char PWD[MAX]={0};
		char** command;
		int read_size;
		int errno;
		/*char *getcwd(char *buf, int maxlen); => get pwd "unistd.h*/
		getcwd(PWD,MAX);
 	/////////////////////////////////////////////////////////////////
	//화면에 출력, write가 printf보다 빠르므로 write를 써봣음..
		write(STDOUT_FILENO, "@myshell:~", 20);
		write(STDOUT_FILENO, PWD, MAX);
		write(STDOUT_FILENO, "$ ",3);
	/////////////////////////////////////////////////////////////////
	//읽기
		/*입력받은 커맨드 command로 읽음*/
		read_size = read(STDIN_FILENO, CommandLine, MAX);
		//input enter
		if(read_size == 1){
			continue;}
	////////////////////////////////////////////////////////////////
	//명령어 구분하고 실행
		command = get_tokens(CommandLine);
		if(!strcmp(command[0],"quit")){
			printf("+------------------------------------------------------------------------------------+\n");
			printf("|BASH                                                                                |\n");
			printf("+------------------------------------------------------------------------------------+\n");
			exit(1);}
		else{
			execute_com(command);
		}
		
	}
}

mysh_funcs.c

//functions for myshell by 이창민, ckdals0115@naver.com
//mysh_funcs.c
/*
token구하기
명령수행
-shell bulitin
-/bin
-redirection
-background
 */
#include"mysh.h"
/////////////////////////////////////////////////////////////////////////////////////
////////CommandLine 쪼갬
char** get_tokens(char* CommandLine) {
	char **tokens;//토큰들을 저장할 배열
	char *token;
	int COUNT=0;
	//\n 대신 \0넣음
	CommandLine[strlen(CommandLine) - 1] = '\0';
	//토큰 저장할 배열 크기
	tokens = malloc((sizeof(char*))*MAX);
	//" "을 구분자로 자름
	token = strtok(CommandLine, " ");
	while(token != NULL){
		//\0포함해야하므로 +1
		tokens[COUNT] =malloc(strlen(token)+1);
		//동적할당 후 내용복사 
		strncpy(tokens[COUNT], token, strlen(token)+1);
		token = strtok(NULL, " ");
		COUNT++;
	}
	//토큰들 입력 끝나면 null
	tokens[COUNT] = NULL;
	return tokens;
}
//////////////////////////////////////////////////////////////////////////////////////
/////명령을 받으면 수행 
void execute_com(char **commands){
	int fork_process;
	int status;
	int i=0;
	char *dir;
	///////////////////////////////////////////////
	/////////shell builtin command  
	if(!strcmp(commands[0], "cd")){
		if(commands[1] == NULL){
			printf("USEAGE : cd directory\n");
			}
		chdir(commands[1]);
	}
	else if(!strcmp(commands[0], "pwd")){
		printf("Present Working Directory: %s\n",getcwd(dir, MAX));
	}
	///////////////////////////////////////////////
	///////////저장되어있는 명령어(/bin안에 존재)
	else {
		if((fork_process = fork())==0){
		//execv'P' 는 PATH에 등록된 모든 디렉토리에 있는 프로그램을 실행
			//명령어 끝까지 읽어서 각각 상황에 따라 실행
			while(commands[i]){
				if(!strcmp(commands[i],">")){
					redirection_com(commands, i);
				}
				else if(!strcmp(commands[i],"&")){
					background_com(commands, i);
				}
				i++;
			}
			//잘못된 commands[0]가 들어오면 -1 반환함
			if(execvp(commands[0],commands)==-1){
				printf("%s : command not found\n",commands[0]);
				exit(1);
			}
		}
		else if(fork_process < 0){
			printf("fork error\n");
			exit(1);
		}
		else
			wait(&status);
	}
}

//////////////////////////////////////////////////////////////////////
///////////명령어에 리다이렉션이 있을경우 수행
//ex) cat a.txt > b.txt
void redirection_com(char** commands, int i){
	char* to = commands[i+1];
	char* from = commands[i-1];
	int to_fd;

	to_fd = open(to, O_WRONLY | O_CREAT, 0641);
	if(to_fd < 0){
		printf("open error\n");
		exit(1);
	}
	//STDOUT_FILENO이 to_fd를 가리키게함
	dup2(to_fd, STDOUT_FILENO);
	//>자리를 NULL로
	commands[i] = NULL;
	//명령어 수행
	if(execvp(commands[0], commands)==-1){
		printf("No such command : %s\n",commands[0]);
                exit(1);
	}
}
/////////////////////////////////////////////////////////////////////////
////////명령어에 &이 있을경우 background processing 수행
void background_com(char** commands, int i){
	commands[i]=NULL;
	int fork_process;
	if((fork_process = fork())==0){
		if(execvp(commands[0], commands)==-1){
                printf("No such command : %s\n",commands[0]);
                exit(1);
		}
	}
	else if(fork_process<0){
		printf("fork error\n");
		exit(1);
	}
	//기다리지 않음
	else{
		exit(1);
	}
};

while1.c (단순 무한 루프)

#include<stdio.h>
int main(){
	while(1){
	}
	return 0;
}

Makefile

mysh: mysh.o mysh_funcs.o
gcc -o mysh mysh.o mysh_funcs.o

mysh.o: mysh.h mysh.c
gcc -c mysh.c

mysh_funcs.o: mysh.h mysh_funcs.c
gcc -c mysh_funcs.c

 

현재 ~디렉토리 $를 해주기 위해 getcwd를 사용하여 현재 디렉토리를 가져와 터미널에 출력하였다.

read systemcall을 사용하여 STDIN을 읽었다. 그리고 만약 엔터 \n만 치게된다면 다시 커맨드를 입력받을 수 있게 하였다.

명령어가 들어오면 execute_com를 실행하여 명령어를 실행하게 하였고, quit를 입력하면 myshell이 종료되게 하였다.

 

execute_com을 하려면 일단 입력받은 커맨드를 쪼개서 구분을 하여 명령을 처리해야한다. 따라서 get_tokens라는 토큰을 얻는 함수를 생성하였다. strtok함수를 이용하여 “ ”을 구분자로 하여 token화 하였다.

 

커멘드를 token으로 쪼개어 명령을 수행하는데, shell builtin 명령어들은 /bin에 저장되어있는 것이 아니라 bash가 동작할 때 수행하므로 각 명령어에 맞는 함수들을 사용하여 구현하였다.

shell builtin명령어들은 종류가 많이 있지만 각각 경우들을 비교하려면 수행시간이 길어지므로 cdpwd만 구현을 하였다.

 

따라서, strcmp함수를 사용하여 shell builtin명령어가 들어오면 builtin명령어인지 구분하여 실행을 한다.

 

그 외의 명령어들은 /bin에 있으므로 execvp를 사용하여 명령어를 실행한다. 환경변수 path에 디렉토리가 있으면 파일명만 입력하면 되므로 commands[0]을 인자로 넘겨준다.

 

리다이렉션의 경우, “from_file > to_file”의 형태이므로 STDOUT_FILENOto_file fd를 가리키게 한다.

그리고 “>” 앞의 명령어들을 실행하여 to_file에 그 결과들이 수행되게 한다.

 

백그라운드의 경우, fork를 한 후 부모프로세스는 자식프로세스를 wait하지 않게 하여 자식 프로세스가 백그라운드 프로세스로 돌아가도록 한다.

 

나머지 잘못된 사용을 하였을 시 잘못되었다고 예외처리들을 해주었다.

 

bashbuiltin 명령어들을 모두 구현하기 위해선 모든 builtin 명령어에 해당하는지 검사를 하고, 또 그에 따른 적절한 함수들을 사용해야하므로 코드가 길어지고 명령어 수행시간이 길어질 것 같았다.

따라서 cd, pwd와 같은 간단한 명령어만 수행하였다.

여기서 굳이 shell에서 builtin 명령어, 그 외 명령어로 구분지어 하나는 파일로 저장을 하고 하나는 쉘 내부에서 작동하게 하였는지 궁금하여 찾아보니, builtin 명령어들은 자주 사용되어 파일로 디스크에 저장해두면 매번 디스크에서 불러와야하므로 효율을 높이기 위해 램에 상주시키는 것을 알게 되었다.

728x90
반응형
블로그 이미지

아상관없어

,
반응형

 

//mycp app by changmin, ckdals0115@naver.com

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#define MAX 64

void main(int argc,char* argv[]){

	int original, copy, r_size;
	char buf[MAX];
	struct stat attribute;//stat 구조체선언  mode_t st_mode로 파일 권한을 가져오기위해 

	//쓰기잘못	
	if(argc != 3){
		printf("Wrong useage! USAGE : %s \"original_file\" \"copy_file\" \n",argv[0]);
		exit(-1);}
	//orignal 파일 열기
	original = open(argv[1],O_RDONLY);
	//파일 open 실패시
	if(original < 0){
		printf("can't open file\n");
		exit(-1);}
	
	if(stat(argv[1], &attribute)==-1){//original file 속성가져옴 실패시 에러
		printf("getting attribute error\n");
		exit(-1);}
	
	
	mode_t original_permisson = attribute.st_mode;//original의 st_mode를 가져옴
	



	copy = open(argv[2],O_WRONLY|O_CREAT|O_EXCL,original_permisson);//쓰기로 읽고 권한을 original파일의 권한을 줌
	//파일 open 실패시
	if(original < 0){
                printf("can't open file\n");
                exit(-1);}
	//파일끝까지 읽고 씀
	while((r_size = read(original,buf,MAX)) >0){
		write(copy,buf,r_size);
	}
}
728x90
반응형
블로그 이미지

아상관없어

,
반응형

www.google.com/maps/d/edit?mid=1STNkMbZbYZUpAut7cfg_xItN5yRqHkBt&usp=sharing

728x90
반응형

'기타 > 여행 지도 공유(구글맵)' 카테고리의 다른 글

도쿄 지도  (0) 2020.07.16
블라디보스토크 지도  (0) 2020.07.16
제주도 지도  (0) 2020.07.16
괌 지도  (0) 2020.07.16
블로그 이미지

아상관없어

,
반응형

www.google.com/maps/d/edit?mid=1tOOrkbGAebK1Z8trGOIdFouVbsY&usp=sharing

728x90
반응형

'기타 > 여행 지도 공유(구글맵)' 카테고리의 다른 글

오사카 지도  (0) 2020.07.16
블라디보스토크 지도  (0) 2020.07.16
제주도 지도  (0) 2020.07.16
괌 지도  (0) 2020.07.16
블로그 이미지

아상관없어

,
반응형

www.google.com/maps/d/edit?mid=1CZKN0355ykP1_FRHKYy5mxR6L7cZ8FCT&usp=sharing

728x90
반응형

'기타 > 여행 지도 공유(구글맵)' 카테고리의 다른 글

오사카 지도  (0) 2020.07.16
도쿄 지도  (0) 2020.07.16
제주도 지도  (0) 2020.07.16
괌 지도  (0) 2020.07.16
블로그 이미지

아상관없어

,
반응형

www.google.com/maps/d/edit?mid=1q_DFwZ124alhrhalxabfZaYy816TPqoZ&usp=sharing

728x90
반응형

'기타 > 여행 지도 공유(구글맵)' 카테고리의 다른 글

오사카 지도  (0) 2020.07.16
도쿄 지도  (0) 2020.07.16
블라디보스토크 지도  (0) 2020.07.16
괌 지도  (0) 2020.07.16
블로그 이미지

아상관없어

,
반응형

www.google.com/maps/d/edit?mid=1Z0ydP650Fr0XxX-ebqMbHCZFmu1mM7kj&usp=sharing

728x90
반응형

'기타 > 여행 지도 공유(구글맵)' 카테고리의 다른 글

오사카 지도  (0) 2020.07.16
도쿄 지도  (0) 2020.07.16
블라디보스토크 지도  (0) 2020.07.16
제주도 지도  (0) 2020.07.16
블로그 이미지

아상관없어

,
반응형

Boot Sector의 크기는 2 Sector = 1KB(0x400)이므로 Super Block의 위치는 0x400부터 시작한다.

해당위치로 이동하면,

Log Block Size( 블록 크기 ) = 0x2000, Inode Per Group( 각 블록그룹에 속한 inode ) = 0xef53, Block Per Group( 각 블록 그룹에 속한 block ) = 0x8000을 얻을 수 있다.

Ext2에서 Root inode number2이다. 따라서 (inode number – 1)/block per group을 하면 Rootinode가 속한 그룹은 0번임을 알 수 있다. 그리고 (inode number -1)%block per group을 하여 Root index1임을 알 수 있다.

그리고 Root안의 데이터를 보기위해 Group Descriptor Table을 보아 Group 0 inode Table 시작위치를 얻는다.

 

첫 번째 Group Descriptor Tableramdisk1블록(4KB = 0x1000) 이후부터 시작하므로 해당 위치로 이동하면

각 그룹의 inode Table을 구하면

(단위 : block)

Group 0 = 0x23

Group 1 = 0x8023

Group 2 = 0x10002

Group 3 = 0x18023

이다.

 

Root가 속한 Group 0inode Table에서 1번째 inode를 찾는다. ( Inode의 크기는 0x100byte, index = 1 )

첫번째 블록 포인터인 0x223000을 찾아서 데이터 영역으로 이동을 한다.

Record len으로 디렉토리 엔트리의 크기를 알아내고, file type으로 디렉토리를 찾고, 이름을 얻는다. 그중 32153”6/82”에 해당하는 6번 디렉토리의 inode를 찾는다.

6번 디렉토리 inode number = 0x6066

속한 Block Group = (0x6066 – 1)/0x2000 = 3

Inode Table Index = (0x6066 – 1)%0x2000 = 101

 

6번 디렉토리가 Block Group 3 inode Table101번째에 있음을 알 수 있다.

 

Block Group 3inode Table에서 101번째 inode로 이동을 한다.

=>0x18029600

Block pointer 0번을 얻고 이동을 한다.

=>0x8458000

6번 디렉토리가 있음을 확인할 수 있다.

 

학번의 끝이 682이므로 0x18029600에서 82번 뒤로 이동을 한다.

=>0x1802e800

Block Pointer 0 = 0x84aa000

Block Pointer 1 = 0x107ba000

Block Pointer 2 = 0x107d2000

 

Indirect Block Pointer 0 = 0x10204000

을 얻을 수 있다.

 

해당 블록의 위치로 이동을 하면 다음의 그림과 같이 데이터를 찾을 수 잇다.

 

 

마지막 indirect block pointer13번째 blockinode를 찾아내고 이동하여 데이터를 찾았다.

728x90
반응형

'공부 > 운영체제&시스템프로그래밍' 카테고리의 다른 글

New Architectural state structure  (0) 2021.06.21
myshell  (0) 2020.07.16
mycp  (0) 2020.07.16
블로그 이미지

아상관없어

,