From 602402b8784f28f768719593dff0433743f84f17 Mon Sep 17 00:00:00 2001
From: jjunohj <jjunohj@gmail.com>
Date: Thu, 22 Jun 2023 15:31:04 +0900
Subject: [PATCH] Add RPI 1

---
 .DS_Store      | Bin 0 -> 6148 bytes
 README.md      |  90 +---------
 RPI1/Makefile  |  24 +++
 RPI1/RC522.c   | 449 +++++++++++++++++++++++++++++++++++++++++++++++++
 RPI1/RC522.h   | 142 ++++++++++++++++
 RPI1/RC522.o   | Bin 0 -> 6488 bytes
 RPI1/README.md |   9 +
 RPI1/rfid      | Bin 0 -> 18124 bytes
 RPI1/rfid.c    | 325 +++++++++++++++++++++++++++++++++++
 RPI1/rfid.o    | Bin 0 -> 8156 bytes
 10 files changed, 954 insertions(+), 85 deletions(-)
 create mode 100644 .DS_Store
 create mode 100644 RPI1/Makefile
 create mode 100644 RPI1/RC522.c
 create mode 100644 RPI1/RC522.h
 create mode 100644 RPI1/RC522.o
 create mode 100644 RPI1/README.md
 create mode 100755 RPI1/rfid
 create mode 100644 RPI1/rfid.c
 create mode 100644 RPI1/rfid.o

diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..c9f57c50f012224aebfda08201cdcc755f3e2c6c
GIT binary patch
literal 6148
zcmZQzU|@7AO)+F(5MW?n;9!8zOq>i@0Z1N%F(jFwA}k>Dz-IU|xH9N5<T9jq=0N2}
zslgorpt$2?2x4$$aAa^{K#ITo<fNSZBxurbWME*>`ws?S@31fgF$6GpG8lU1pr~7q
zOI=cVaRJo49Z3Z_nZ+dr2G<ywm|0la*g4oaxH)2jGxE!WOA<>;i=7gSqCvcn{QR6G
z7&|d3EHkw{UO>b-Kd&S)GcUCWq$D^qB{eCrC?-5JFD1X+DZex?r5LOiD#5|Y!5J?g
zQC)3hW}u^BY-Cxhqfl*WWT2y9Vr*7h%gG_CtZy9@pPiGNm)`~U83Q9Dgl6D{(lDx<
zfq?<;@3P>cyqx^JbV$mFDH)|lLtr!nMnhnTgaEXp<KP}5?j3dJXb6mk0R2J$R6Zy`
zTR09-x&cCiq!<_(7{FZsMo_~D>MTZZKY#%w2hs|nL0UmHNGk&)hy^wStd)V00n`Eo
zsfTni7{Of<5Ff0afsp~Moq>@7tR3DwV}xjDV1#IAV1#IAU<CDOK;}cVGcZE5LtQsY
zjfTKz2*5&s8Nv_%)&H&x47mFL5LKh(Xb6mkz_1JfMi!S~7bj4qiNkxKx)xNQCP3vu
xwLhpjW(3vK2r+O~%mf)wlz<9@s(X-D5Dl)185tlo`DjA`7DA)+Xb8|h1OUD2Uhn__

literal 0
HcmV?d00001

diff --git a/README.md b/README.md
index cfe4230..c0ed053 100644
--- a/README.md
+++ b/README.md
@@ -1,92 +1,12 @@
 # Smart_Library
 
+## 전체 구조도
 
+<img width="1285" alt="스크린샷 2023-06-22 오후 3 23 21" src="https://github.com/jjunohj/MCU-JS/assets/121740394/0bd5fe49-1a69-4c91-9ea8-2fdb693ca08f">
 
-## Getting started
-
-To make it easy for you to get started with GitLab, here's a list of recommended next steps.
-
-Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
-
-## Add your files
-
-- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
-- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
+### RPI 1 (도서관 중앙부)
 
 ```
-cd existing_repo
-git remote add origin https://git.ajou.ac.kr/sys_programming_seven/smart_library.git
-git branch -M main
-git push -uf origin main
+rfid.c 내부의 server_address[], port를 도서관 개폐부와 연결
+make run
 ```
-
-## Integrate with your tools
-
-- [ ] [Set up project integrations](https://git.ajou.ac.kr/sys_programming_seven/smart_library/-/settings/integrations)
-
-## Collaborate with your team
-
-- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
-- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
-- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
-- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
-- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
-
-## Test and Deploy
-
-Use the built-in continuous integration in GitLab.
-
-- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
-- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
-- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
-- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
-- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
-
-***
-
-# Editing this README
-
-When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template.
-
-## Suggestions for a good README
-Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
-
-## Name
-Choose a self-explaining name for your project.
-
-## Description
-Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
-
-## Badges
-On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
-
-## Visuals
-Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
-
-## Installation
-Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
-
-## Usage
-Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
-
-## Support
-Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
-
-## Roadmap
-If you have ideas for releases in the future, it is a good idea to list them in the README.
-
-## Contributing
-State if you are open to contributions and what your requirements are for accepting them.
-
-For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
-
-You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
-
-## Authors and acknowledgment
-Show your appreciation to those who have contributed to the project.
-
-## License
-For open source projects, say how it is licensed.
-
-## Project status
-If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
diff --git a/RPI1/Makefile b/RPI1/Makefile
new file mode 100644
index 0000000..833e18a
--- /dev/null
+++ b/RPI1/Makefile
@@ -0,0 +1,24 @@
+
+VPATH = _build
+objects = rfid.o RC522.o
+.PHONY : clear run
+
+top:
+	make clear
+	make compile
+
+compile: $(objects)
+	gcc $(objects) -o rfid -lwiringPi
+
+clear: 
+	rm -f rfid
+	rm -f $(objects)
+
+run: clear compile
+	./rfid
+
+./$(VPATH)/rfid.o:RC522.o
+	gcc -c rfid.c
+
+./$(VPATH)/RCC522.o:
+	gcc -c RC522.c RC522.h
diff --git a/RPI1/RC522.c b/RPI1/RC522.c
new file mode 100644
index 0000000..5841dc3
--- /dev/null
+++ b/RPI1/RC522.c
@@ -0,0 +1,449 @@
+#include <wiringPi.h>
+#include <wiringPiSPI.h>
+#include <stdio.h>
+#include <string.h>
+#include "RC522.h"
+
+uint8_t rst_pin;
+void RC522_setup(uint8_t rst) {
+    rst_pin = rst;
+    wiringPiSetup();
+    pinMode(rst_pin, OUTPUT);
+    digitalWrite(rst_pin, 1);
+    wiringPiSPISetup(0, 100000);
+}
+
+void RC522_RST(uint8_t v) {
+    digitalWrite(rst_pin, v);
+}
+
+/**
+ * @brief Reads an RC522 register
+ * @param ucAddress, register address
+ * @retval Current value of the register
+ */
+uint8_t ReadRawRC(uint8_t ucAddress) {
+    static uint8_t _buf1[0x2];
+    uint8_t ucAddr, ucReturn;
+
+    ucAddr = ((ucAddress << 1) & 0x7E) | 0x80;
+    _buf1[0] = ucAddr;
+    wiringPiSPIDataRW(0, _buf1, 2);
+    ucReturn = _buf1[1];
+
+    return ucReturn;
+}
+
+/**
+ * @brief Writes to an RC522 register
+ * @param ucAddress, register address
+ * @param ucValue, value to write to the register
+ * @retval None
+ */
+void WriteRawRC(uint8_t ucAddress, uint8_t ucValue) {
+    static uint8_t _buf1[0x2];
+    uint8_t ucAddr;
+
+    ucAddr = (ucAddress << 1) & 0x7E;
+    _buf1[0] = ucAddr;
+    _buf1[1] = ucValue;
+    wiringPiSPIDataRW(0, _buf1, 2);
+}
+
+/**
+ * @brief Sets a bit in an RC522 register
+ * @param ucReg, register address
+ * @param ucMask, bit value to set
+ * @retval None
+ */
+void SetBitMask(uint8_t ucReg, uint8_t ucMask) {
+    uint8_t ucTemp;
+
+    ucTemp = ReadRawRC(ucReg);
+    WriteRawRC(ucReg, ucTemp | ucMask); // set bit mask
+}
+
+/**
+ * @brief Clears a bit in an RC522 register
+ * @param ucReg, register address
+ * @param ucMask, bit value to clear
+ * @retval None
+ */
+void ClearBitMask(uint8_t ucReg, uint8_t ucMask) {
+    uint8_t ucTemp;
+
+    ucTemp = ReadRawRC(ucReg);
+    WriteRawRC(ucReg, ucTemp & (~ucMask)); // clear bit mask
+}
+
+/**
+ * @brief Turns on the antenna of the RC522
+ * @param None
+ * @retval None
+ */
+void PcdAntennaOn(void) {
+    uint8_t uc;
+
+    uc = ReadRawRC(TxControlReg);
+    if (!(uc & 0x03)) {
+        SetBitMask(TxControlReg, 0x03);
+    }
+}
+
+/**
+ * @brief Turns off the antenna of the RC522
+ * @param None
+ * @retval None
+ */
+void PcdAntennaOff(void) {
+    ClearBitMask(TxControlReg, 0x03);
+}
+
+/**
+ * @brief Resets the RC522
+ * @param None
+ * @retval None
+ */
+void PcdReset(void) {
+    RC522_RST(1);
+    delayMicroseconds(1);
+    RC522_RST(0);
+    delayMicroseconds(1);
+    RC522_RST(1);
+    delayMicroseconds(1);
+    WriteRawRC(CommandReg, 0x0F);
+    while (ReadRawRC(CommandReg) & 0x10);
+    delayMicroseconds(1);
+    //Configures commonly used modes for sending and receiving and communication with Mifare cards, initializes CRC value to 0x6363
+    WriteRawRC(ModeReg, 0x3D);
+    WriteRawRC(TReloadRegL, 30);      // Low 16 bits of the 16- bit timer
+    WriteRawRC(TReloadRegH, 0);	      // High 16 bits of the 16-bit timer
+    WriteRawRC(TModeReg, 0x8D);	      // Defines settings for internal timer
+    WriteRawRC(TPrescalerReg, 0x3E);   // Sets the timer's prescaler coefficient
+    WriteRawRC(TxAutoReg, 0x40);	      // Modulates the transmitted signal 100% ASK
+}
+
+/**
+ * @brief Sets the operating mode of the RC522
+ * @param ucType, operating mode
+ * @retval None
+ */
+void M500PcdConfigISOType(uint8_t ucType) {
+    if (ucType == 'A') {                   //ISO14443_A
+        ClearBitMask(Status2Reg, 0x08);
+        WriteRawRC(ModeReg, 0x3D);         //3F
+        WriteRawRC(RxSelReg, 0x86);        //84
+        WriteRawRC(RFCfgReg, 0x7F);        //4F
+        WriteRawRC(TReloadRegL, 30);
+        WriteRawRC(TReloadRegH, 0);
+        WriteRawRC(TModeReg, 0x8D);
+        WriteRawRC(TPrescalerReg, 0x3E);
+        delayMicroseconds(2);
+        PcdAntennaOn(); //Open antenna
+    }
+}
+
+/**
+ * @brief Communicates with an ISO14443 card using RC522
+ * @param ucCommand, RC522 command word
+ * @param pInData, data to send to the card through RC522
+ * @param ucInLenByte, byte length of the data to send
+ * @param pOutData, returned data from the card
+ * @param pOutLenBit, bit length of the returned data
+ * @retval Status value = MI_OK, success
+ */
+char PcdComMF522(uint8_t ucCommand, uint8_t* pInData, uint8_t ucInLenByte, uint8_t* pOutData, uint32_t* pOutLenBit) 
+{
+    char cStatus = MI_ERR;
+    uint8_t ucIrqEn   = 0x00;
+    uint8_t ucWaitFor = 0x00;
+    uint8_t ucLastBits;
+    uint8_t ucN;
+    uint32_t ul;
+
+    switch (ucCommand) {
+        case PCD_AUTHENT:
+            ucIrqEn   = 0x12;
+            ucWaitFor = 0x10;
+            break;
+
+        case PCD_TRANSCEIVE:
+            ucIrqEn   = 0x77;
+            ucWaitFor = 0x30;
+            break;
+
+        default:
+            break;
+    }
+
+    WriteRawRC(ComIEnReg, ucIrqEn | 0x80);
+    ClearBitMask(ComIrqReg, 0x80);
+    WriteRawRC(CommandReg, PCD_IDLE);
+    SetBitMask(FIFOLevelReg, 0x80);
+
+    for (ul = 0; ul < ucInLenByte; ul++) {
+        WriteRawRC(FIFODataReg, pInData[ul]);
+    }
+
+    WriteRawRC(CommandReg, ucCommand);
+
+    if (ucCommand == PCD_TRANSCEIVE) {
+        SetBitMask(BitFramingReg, 0x80);
+    }
+
+    ul = 1000;
+
+    do {
+        ucN = ReadRawRC(ComIrqReg);
+        ul--;
+    } while ((ul != 0) && (!(ucN & 0x01)) && (!(ucN & ucWaitFor)));
+
+    ClearBitMask(BitFramingReg, 0x80);
+
+    if (ul != 0) {
+        if (!(ReadRawRC(ErrorReg) & 0x1B)) {
+            cStatus = MI_OK;
+
+            if (ucN & ucIrqEn & 0x01) {
+                cStatus = MI_NOTAGERR;
+            }
+
+            if (ucCommand == PCD_TRANSCEIVE) {
+                ucN = ReadRawRC(FIFOLevelReg);
+                ucLastBits = ReadRawRC(ControlReg) & 0x07;
+
+                if (ucLastBits) {
+                    *pOutLenBit = (ucN - 1) * 8 + ucLastBits;
+                } else {
+                    *pOutLenBit = ucN * 8;
+                }
+
+                if (ucN == 0) {
+                    ucN = 1;
+                }
+
+                if (ucN > MAXRLEN) {
+                    ucN = MAXRLEN;
+                }
+
+                for (ul = 0; ul < ucN; ul++) {
+                    pOutData[ul] = ReadRawRC(FIFODataReg);
+                }
+            }
+		} else {
+            cStatus = MI_ERR;
+        }
+    }
+
+    SetBitMask(ControlReg, 0x80);
+    WriteRawRC(CommandReg, PCD_IDLE);
+
+    return cStatus;
+}
+
+char PcdRequest(uint8_t ucReq_code, uint8_t* pTagType) { //Request cards, read card type number
+    char cStatus;
+    uint8_t ucComMF522Buf[MAXRLEN];
+    uint32_t ulLen;
+
+    ClearBitMask(Status2Reg, 0x08);
+    WriteRawRC(BitFramingReg, 0x07);
+    SetBitMask(TxControlReg, 0x03);
+
+    ucComMF522Buf[0] = ucReq_code;
+    cStatus = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 1, ucComMF522Buf, &ulLen);
+
+    if ((cStatus == MI_OK) && (ulLen == 0x10)) {
+        * pTagType     = ucComMF522Buf[0];
+        *(pTagType+1) = ucComMF522Buf[1];
+    } else {
+        cStatus = MI_ERR;
+    }
+
+    return cStatus;
+}
+
+char PcdAnticoll(uint8_t* pSnr ){ //Anti-collision detection, reading selected card serial number card
+    char cStatus;
+    uint8_t uc, ucSnr_check = 0;
+    uint8_t ucComMF522Buf[MAXRLEN];
+    uint32_t ulLen;
+
+    ClearBitMask(Status2Reg, 0x08);
+    WriteRawRC(BitFramingReg, 0x00);
+    ClearBitMask(CollReg, 0x80);
+
+    ucComMF522Buf[0] = 0x93;
+    ucComMF522Buf[1] = 0x20;
+    cStatus = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 2, ucComMF522Buf, &ulLen);
+
+    if (cStatus == MI_OK) {
+        for (uc = 0; uc < 4; uc++) {
+            *(pSnr + uc)  = ucComMF522Buf[uc];
+            ucSnr_check ^= ucComMF522Buf[uc];
+        }
+
+        if (ucSnr_check != ucComMF522Buf[uc]) {
+            cStatus = MI_ERR;
+        }
+    }
+
+    SetBitMask(CollReg, 0x80);
+
+    return cStatus;
+}
+
+void CalulateCRC(uint8_t* pIndata, uint8_t ucLen, uint8_t* pOutData) {
+    uint8_t uc, ucN;
+    ClearBitMask(DivIrqReg, 0x04);
+    WriteRawRC(CommandReg, PCD_IDLE);
+    SetBitMask(FIFOLevelReg, 0x80);
+
+    for (uc = 0; uc < ucLen; uc++) {
+        WriteRawRC(FIFODataReg, *(pIndata+uc));
+    }
+
+    WriteRawRC(CommandReg, PCD_CALCCRC);
+    uc = 0xFF;
+
+    do {
+        ucN = ReadRawRC(DivIrqReg);
+        uc--;
+    } while ((uc != 0) && !(ucN & 0x04));
+
+    pOutData[0] = ReadRawRC(CRCResultRegL);
+    pOutData[1] = ReadRawRC(CRCResultRegM);
+}
+
+char PcdSelect(uint8_t* pSnr) {
+    char ucN;
+    uint8_t uc, ucComMF522Buf[MAXRLEN];
+    uint32_t ulLen;
+
+    ucComMF522Buf[0] = PICC_ANTICOLL1;
+    ucComMF522Buf[1] = 0x70;
+    ucComMF522Buf[6] = 0;
+
+    for (uc = 0; uc < 4; uc++) {
+        ucComMF522Buf[uc+2] = *(pSnr+uc);
+        ucComMF522Buf[6]   ^= *(pSnr+uc);
+    }
+
+    CalulateCRC(ucComMF522Buf, 7, &ucComMF522Buf[7]);
+    ClearBitMask(Status2Reg, 0x08);
+
+    ucN = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 9, ucComMF522Buf, &ulLen);
+
+    if ((ucN == MI_OK) && (ulLen == 0x18)) {
+        ucN = MI_OK;
+    } else {
+        ucN = MI_ERR;
+    }
+
+    return ucN;
+}
+
+char PcdAuthState(uint8_t ucAuth_mode, uint8_t ucAddr, uint8_t* pKey, uint8_t* pSnr) {
+    char cStatus;
+    uint8_t uc, ucComMF522Buf[MAXRLEN];
+    uint32_t ulLen;
+
+    ucComMF522Buf[0] = ucAuth_mode;
+    ucComMF522Buf[1] = ucAddr;
+
+    for (uc = 0; uc < 6; uc++) {
+        ucComMF522Buf[uc+2] = *(pKey+uc);
+    }
+
+    for (uc = 0; uc < 6; uc++) {
+        ucComMF522Buf[uc+8] = *(pSnr+uc);
+    }
+
+    cStatus = PcdComMF522(PCD_AUTHENT, ucComMF522Buf, 12, ucComMF522Buf, &ulLen);
+
+    if ((cStatus != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08))) {
+        cStatus = MI_ERR;
+    }
+
+    return cStatus;
+}
+
+char PcdWrite(uint8_t ucAddr, uint8_t* pData) { // Write block data
+    char cStatus;
+    uint8_t uc, ucComMF522Buf[MAXRLEN];
+    uint32_t ulLen;
+
+    ucComMF522Buf[0] = PICC_WRITE;
+    ucComMF522Buf[1] = ucAddr;
+    CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]);
+
+    cStatus = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &ulLen);
+
+    if ((cStatus == MI_OK) && (ulLen == 4) && ((ucComMF522Buf[0] & 0x0F) == 0x0A)) {
+        for (uc = 0; uc < 16; uc++) {
+            ucComMF522Buf[uc] = *(pData+uc);
+        }
+
+        CalulateCRC(ucComMF522Buf, 16, &ucComMF522Buf[16]);
+        cStatus = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 18, ucComMF522Buf, &ulLen);
+
+        if ((cStatus != MI_OK) || (ulLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) {
+            cStatus = MI_ERR;
+        }
+    } else {
+        cStatus = MI_ERR;
+    }
+
+    return cStatus;
+}
+
+char PcdRead(uint8_t ucAddr, uint8_t* pData) { // Read block data
+    char cStatus;
+    uint8_t uc, ucComMF522Buf[MAXRLEN];
+    uint32_t ulLen;
+
+    ucComMF522Buf[0] = PICC_READ;
+    ucComMF522Buf[1] = ucAddr;
+    CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]);
+
+    cStatus = PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &ulLen);
+
+    if ((cStatus == MI_OK) && (ulLen == 0x90)) {
+        for (uc = 0; uc < 16; uc++) {
+            *(pData + uc) = ucComMF522Buf[uc];
+        }
+    } else {
+        cStatus = MI_ERR;
+    }
+
+    return cStatus;
+}
+
+char PcdHalt() { // Command the cards into sleep mode
+    uint8_t ucComMF522Buf[MAXRLEN];
+    uint32_t ulLen;
+
+    ucComMF522Buf[0] = PICC_HALT;
+    ucComMF522Buf[1] = 0;
+    CalulateCRC(ucComMF522Buf, 2, &ucComMF522Buf[2]);
+
+    PcdComMF522(PCD_TRANSCEIVE, ucComMF522Buf, 4, ucComMF522Buf, &ulLen);
+
+    return MI_OK;
+}
+
+void IC_CMT(uint8_t* UID, uint8_t* KEY, uint8_t RW, uint8_t* Dat) { // IC Card Communication
+    uint8_t ucArray_ID[4] = {0};
+    PcdRequest(0x52, ucArray_ID);
+    PcdAnticoll(ucArray_ID);
+    PcdSelect(UID);
+    PcdAuthState(0x60, 0x10, KEY, UID);
+
+    if (RW) {
+        PcdRead(0x10, Dat);
+    } else {
+        PcdWrite(0x10, Dat);
+    }
+
+    PcdHalt();
+}
diff --git a/RPI1/RC522.h b/RPI1/RC522.h
new file mode 100644
index 0000000..06d72f7
--- /dev/null
+++ b/RPI1/RC522.h
@@ -0,0 +1,142 @@
+#ifndef __RC522_CONFIG_H
+#define	__RC522_CONFIG_H
+
+/////////////////////////////////////////////////////////////////////
+//MF522 Command word
+/////////////////////////////////////////////////////////////////////
+#define PCD_IDLE              0x00               //현재 명령 취소
+#define PCD_AUTHENT           0x0E               //인증 키
+#define PCD_RECEIVE           0x08               //데이터 수신
+#define PCD_TRANSMIT          0x04               //데이터 전송
+#define PCD_TRANSCEIVE        0x0C               //데이터 전송 및 수신
+#define PCD_RESETPHASE        0x0F               //재설정
+#define PCD_CALCCRC           0x03               //CRC 계산
+
+/////////////////////////////////////////////////////////////////////
+//Mifare_One 카드 Command word
+/////////////////////////////////////////////////////////////////////
+#define PICC_REQIDL           0x26               //수신기간 내에 대기중인 카드 대기열 찾기
+#define PICC_REQALL           0x52               // 수신기 안에 있는 모든 카드 찾기
+#define PICC_ANTICOLL1        0x93               //충돌 방지
+#define PICC_ANTICOLL2        0x95
+
+#define PICC_AUTHENT1A        0x60               //A키 검증
+#define PICC_AUTHENT1B        0x61               //B키 검증
+#define PICC_READ             0x30               //블록 읽기
+#define PICC_WRITE            0xA0               //블록 쓰기
+#define PICC_DECREMENT        0xC0               //차감
+#define PICC_INCREMENT        0xC1               //충전
+#define PICC_RESTORE          0xC2               //블록 데이터를 버퍼로 복원
+#define PICC_TRANSFER         0xB0               //버퍼에 있는 데이터 보관
+#define PICC_HALT             0x50               //카드 비활성화
+
+/////////////////////////////////////////////////////////////////////
+//MF522 FIFO 길이 정의
+/////////////////////////////////////////////////////////////////////
+#define DEF_FIFO_LENGTH       64                 //FIFO 크기 = 64바이트
+#define MAXRLEN  18
+
+/////////////////////////////////////////////////////////////////////
+//MF522 레지스터 정의
+/////////////////////////////////////////////////////////////////////
+// PAGE 0
+#define     RFU00                 0x00
+#define     CommandReg            0x01
+#define     ComIEnReg             0x02
+#define     DivlEnReg             0x03
+#define     ComIrqReg             0x04
+#define     DivIrqReg             0x05
+#define     ErrorReg              0x06
+#define     Status1Reg            0x07
+#define     Status2Reg            0x08
+#define     FIFODataReg           0x09
+#define     FIFOLevelReg          0x0A
+#define     WaterLevelReg         0x0B
+#define     ControlReg            0x0C
+#define     BitFramingReg         0x0D
+#define     CollReg               0x0E
+#define     RFU0F                 0x0F
+// PAGE 1
+#define     RFU10                 0x10
+#define     ModeReg               0x11
+#define     TxModeReg             0x12
+#define     RxModeReg             0x13
+#define     TxControlReg          0x14
+#define     TxAutoReg             0x15
+#define     TxSelReg              0x16
+#define     RxSelReg              0x17
+#define     RxThresholdReg        0x18
+#define     DemodReg              0x19
+#define     RFU1A                 0x1A
+#define     RFU1B                 0x1B
+#define     MifareReg             0x1C
+#define     RFU1D                 0x1D
+#define     RFU1E                 0x1E
+#define     SerialSpeedReg        0x1F
+// PAGE 2
+#define     RFU20                 0x20
+#define     CRCResultRegM         0x21
+#define     CRCResultRegL         0x22
+#define     RFU23                 0x23
+#define     ModWidthReg           0x24
+#define     RFU25                 0x25
+#define     RFCfgReg              0x26
+#define     GsNReg                0x27
+#define     CWGsCfgReg            0x28
+#define     ModGsCfgReg           0x29
+#define     TModeReg              0x2A
+#define     TPrescalerReg         0x2B
+#define     TReloadRegH           0x2C
+#define     TReloadRegL           0x2D
+#define     TCounterValueRegH     0x2E
+#define     TCounterValueRegL     0x2F
+// PAGE 3
+#define     RFU30                 0x30
+#define     TestSel1Reg           0x31
+#define     TestSel2Reg           0x32
+#define     TestPinEnReg          0x33
+#define     TestPinValueReg       0x34
+#define     TestBusReg            0x35
+#define     AutoTestReg           0x36
+#define     VersionReg            0x37
+#define     AnalogTestReg         0x38
+#define     TestDAC1Reg           0x39
+#define     TestDAC2Reg           0x3A
+#define     TestADCReg            0x3B
+#define     RFU3C                 0x3C
+#define     RFU3D                 0x3D
+#define     RFU3E                 0x3E
+#define     RFU3F		  		        0x3F
+
+/////////////////////////////////////////////////////////////////////
+//MF522 통신 에러 코드
+/////////////////////////////////////////////////////////////////////
+#define 	MI_OK                 0x26
+#define 	MI_NOTAGERR           0xcc
+#define 	MI_ERR                0xbb
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdbool.h>
+#include <string.h>
+
+void RC522_setup(uint8_t rst);
+
+void PcdReset ( void );
+void M500PcdConfigISOType ( uint8_t type );
+char PcdRequest ( uint8_t req_code, uint8_t* pTagType );
+char PcdAnticoll ( uint8_t* pSnr);
+char PcdHalt ( void );
+char PcdSelect ( uint8_t* pSnr );
+void CalulateCRC ( uint8_t* pIndata, uint8_t len, uint8_t* pOutData );
+char PcdAuthState ( uint8_t auth_mode, uint8_t addr, uint8_t* pKey, uint8_t* pSnr );
+char PcdRead ( uint8_t addr, uint8_t* pData );
+char PcdWrite ( uint8_t addr, uint8_t* pData );
+char PcdValue ( uint8_t dd_mode, uint8_t addr, uint8_t* pValue );
+char PcdBakValue ( uint8_t sourceaddr, uint8_t goaladdr );
+char PcdComMF522 ( uint8_t Command, uint8_t* pInData, uint8_t InLenByte, uint8_t* pOutData, uint32_t* pOutLenBit );
+
+
+
+
+#endif
\ No newline at end of file
diff --git a/RPI1/RC522.o b/RPI1/RC522.o
new file mode 100644
index 0000000000000000000000000000000000000000..fa55130452175ac0d378efc0f6302a5d6e7ad94f
GIT binary patch
literal 6488
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
Ql5!DeV2A`UpctkF0D^(-X8-^I

literal 0
HcmV?d00001

diff --git a/RPI1/README.md b/RPI1/README.md
new file mode 100644
index 0000000..62033b8
--- /dev/null
+++ b/RPI1/README.md
@@ -0,0 +1,9 @@
+# Smart Library
+
+## RFID-RC522
+
+## LCD 1602
+
+```
+make run
+```
diff --git a/RPI1/rfid b/RPI1/rfid
new file mode 100755
index 0000000000000000000000000000000000000000..a317818ffcc20113c66e48a517c515762f904d2c
GIT binary patch
literal 18124
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

literal 0
HcmV?d00001

diff --git a/RPI1/rfid.c b/RPI1/rfid.c
new file mode 100644
index 0000000..ae0dddc
--- /dev/null
+++ b/RPI1/rfid.c
@@ -0,0 +1,325 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <stdint.h>
+#include <wiringPi.h>
+#include <wiringPiSPI.h>
+#include <wiringPiI2C.h>
+#include <stdbool.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+#include "RC522.h"
+
+#define LCD_ADDR 0x27
+#define ONE_DAY	86400
+#define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
+
+typedef struct {
+	char memberId[10];
+	int borrowed_book;
+	time_t borrowed_time;
+} Member;
+
+int fd;
+int BLEN=1;
+
+void write_word(int data){
+    int temp = data;
+    if ( BLEN == 1 )
+        temp |= 0x08;
+    else
+        temp &= 0xF7;
+    wiringPiI2CWrite(fd, temp);
+}
+
+void send_command(int comm){
+    int buf;
+    // Send bit7-4 firstly
+    buf = comm & 0xF0;
+    buf |= 0x04;                    // RS = 0, RW = 0, EN = 1
+    write_word(buf);
+    delay(2);
+    buf &= 0xFB;                    // Make EN = 0
+    write_word(buf);
+
+    // Send bit3-0 secondly
+    buf = (comm & 0x0F) << 4;
+    buf |= 0x04;                    // RS = 0, RW = 0, EN = 1
+    write_word(buf);
+    delay(2);
+    buf &= 0xFB;                    // Make EN = 0
+    write_word(buf);
+}
+
+void send_data(int data){
+    int buf;
+    // Send bit7-4 firstly
+    buf = data & 0xF0;
+    buf |= 0x05;                    // RS = 1, RW = 0, EN = 1
+    write_word(buf);
+    delay(2);
+    buf &= 0xFB;                    // Make EN = 0
+    write_word(buf);
+
+    // Send bit3-0 secondly
+    buf = (data & 0x0F) << 4;
+    buf |= 0x05;                    // RS = 1, RW = 0, EN = 1
+    write_word(buf);
+    delay(2);
+    buf &= 0xFB;                    // Make EN = 0
+    write_word(buf);
+}
+
+void init(){
+    send_command(0x33);     // Must initialize to 8-line mode at first
+    delay(5);
+    send_command(0x32);     // Then initialize to 4-line mode
+    delay(5);
+    send_command(0x28);     // 2 Lines & 5*7 dots
+    delay(5);
+    send_command(0x0C);     // Enable display without cursor
+    delay(5);
+    send_command(0x01);     // Clear Screen
+    wiringPiI2CWrite(fd, 0x08);
+}
+
+void clear(){
+    send_command(0x01);     //clear Screen
+}
+
+void write_lcd(int x, int y, char data[]){
+    int addr, i;
+    int tmp;
+    if (x < 0)  x = 0;
+    if (x > 15) x = 15;
+    if (y < 0)  y = 0;
+    if (y > 1)  y = 1;
+
+    // Move cursor
+    addr = 0x80 + 0x40 * y + x;
+    send_command(addr);
+
+    tmp = strlen(data);
+    for (i = 0; i < tmp; i++){
+        send_data(data[i]);
+    }
+}
+
+int find_member(Member members[], size_t n_members, const char *id) {
+	for (int i = 0; i < n_members; i++) {
+		if (strcmp(members[i].memberId, id) == 0) {
+			return (int)i;
+		}
+	}
+	return -1;
+}
+
+const char* readRFID ( void )
+{
+	char cStr [ 30 ];
+	static uint8_t ucArray_ID [ 4 ]; // 카드 ID
+	uint8_t ucStatusReturn; // 카드 검색 상태
+
+	while ( 1 ) { // 무한 카드 검색
+		/* PICC_REQALL : 모든 종류의 카드 검색 */
+		if (( ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID )) != MI_OK ) { // 실패할 경우 다시 카드 검색
+			ucStatusReturn = PcdRequest ( PICC_REQALL, ucArray_ID ); 
+		}
+
+		if (ucStatusReturn == MI_OK) { // 카드 검색 성공
+			if (PcdAnticoll ( ucArray_ID ) == MI_OK) { // 카드 인식 성공
+				return ucArray_ID;
+			}
+		}
+	}
+}
+
+int main(void) {
+	char server_address[] = "192.168.0.7";
+	int port = 8888;
+
+	Member members[10];
+	size_t n_members = 0;
+	int available_books[] = { 1, 1, 1, 1, 1, 1, 1, 1 };
+	int n_available_books = ARRAY_SIZE(available_books);
+	int select_num;
+	char block_num[2];
+
+	int sock;
+	struct sockaddr_in serv_addr;
+
+	RC522_setup(7); // Pin : 7
+	PcdReset(); // RC522 초기화
+	M500PcdConfigISOType('A'); // ISO14443A 타입으로 설정
+
+	fd = wiringPiI2CSetup(LCD_ADDR);
+	init();
+
+	// sock = socket(PF_INET, SOCK_STREAM, 0);
+	// if (sock == -1) {
+	// 	printf("🚫 소켓 생성 실패\r\n");
+	// 	exit(1);
+	// }
+
+	// memset(&serv_addr, 0, sizeof(serv_addr));
+	// serv_addr.sin_family = AF_INET;
+	// serv_addr.sin_addr.s_addr = inet_addr(server_address);
+	// serv_addr.sin_port = htons(port);
+
+	// if (connect(sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) {
+	// 	printf("🚫 서버 연결 실패\r\n");
+	// 	exit(1);
+	// }
+	
+	while(1) {
+		printf("\n");
+		printf("📚 스마트 도서관에 오신 것을 환영합니다 !\n");
+		printf("😃 회원증을 인식해주세요. . .\r\n");
+		clear();
+		write_lcd(0, 0, "Welcome to      ");
+		write_lcd(0, 1, "Smart Library ! ");
+		delay(2000);
+		clear();
+		write_lcd(0, 0, "Please scan your");
+		write_lcd(0, 1, "membership card");
+		// 회원번호 출력
+		const char* id = readRFID();
+		
+		int member_index = find_member(members, n_members, id);
+		if (member_index == -1) {
+			printf("🚫 등록되지 않은 회원입니다.\r\n");
+			clear();
+			write_lcd(0, 0, "You are not a   ");
+			write_lcd(0, 1, "member.         ");
+			delay(1000);			
+			write_lcd(0, 0, "Do you wanna   ");
+			write_lcd(0, 1, "sign up? Y:1 N:2");
+			printf("📝 회원 가입을 하시겠습니까?.\r\n");
+			printf("1. 예 2. 아니오\r\n");
+			scanf("%d", &select_num);
+			if (select_num == 1) {			
+				printf("✅ 회원 가입이 완료되었습니다.\r\n");
+				clear();
+				write_lcd(0, 0, "Sign up complete");
+				strcpy(members[n_members].memberId, id); // 회원번호 저장
+				members[n_members].borrowed_book = 0;
+				members[n_members].borrowed_time = 0;
+				n_members++;
+				delay(3000);
+				clear();
+			} else {
+				printf("😃 이용해주셔서 감사합니다.\r\n");
+				clear();
+				write_lcd(0, 0, "Thank you for   ");
+				write_lcd(0, 1, "using.          ");
+				delay(3000);
+				clear();
+			}
+			continue;
+		}
+		else if (member_index >= 0) {
+			printf("😃 환영합니다 !!\r\n");
+			clear();
+			write_lcd(0, 0, "Welcome !!      ");
+			delay(1000);
+			clear();
+			printf("--------------------------------\r\n");
+			printf("ℹ️   회원번호 : %02X%02X%02X%02X\r\n", id[0], id[1], id[2], id[3]);
+			if (members[member_index].borrowed_book != 0) {
+				printf("ℹ️   대여 중인 도서는 %d번 도서입니다.\r\n", members[member_index].borrowed_book);
+			} else {
+				printf("ℹ️   대여 중인 도서가 없습니다.\r\n");
+			}
+			if (members[member_index].borrowed_time != 0) {
+				printf("ℹ️   현재 대여 기간은 %d일입니다.\r\n", (int)(time(NULL) - members[member_index].borrowed_time) / ONE_DAY);
+			}
+	
+			printf("--------------------------------\r\n");
+			printf("ℹ️   대여는 1번, 반납은 2번을 눌러주세요.\r\n");
+			write_lcd(0, 0, "1. Borrow       ");
+			write_lcd(0, 1, "2. Return       ");
+			scanf("%d", &select_num);
+			if (select_num == 1) {
+				if (n_available_books == 0) {
+					printf("🚫 대여 가능한 도서가 없습니다.\r\n");
+					continue;
+				}
+				printf("📝 대여할 도서 번호를 입력해주세요.\r\n");
+				clear();
+				write_lcd(0, 0, "Enter the number");
+				write_lcd(0, 1, "of the book.    ");
+				scanf("%d", &select_num);
+				if (select_num < 1 || select_num > 8) {
+					printf("🚫 잘못된 도서 번호입니다.\r\n");
+					continue;
+				}
+				if (available_books[select_num - 1] == 0) {
+					printf("🚫 이미 대출중인 도서입니다.\r\n");
+					continue;
+				}
+				if (select_num >= 1 && select_num <= 4) {
+					printf("❗️ 1️번 블록을 개방합니다.\r\n");
+					// write(sock, "1", 1);
+					clear();
+					write_lcd(0, 0, "Block 1 is open ");
+					delay(5000);
+				}
+				else if (select_num >= 5 && select_num <= 8) {
+					printf("❗️ 2️번 블록을 개방합니다.\r\n");
+					// write(sock, "2", 1);
+					clear();
+					write_lcd(0, 0, "Block 2 is open ");
+					delay(5000);
+				}
+				available_books[select_num - 1] = 0; // 대출중으로 변경
+				printf("✅ 대여가 완료되었습니다.\r\n");
+				clear();
+				write_lcd(0, 0, "Borrow complete ");
+				members[member_index].borrowed_book = select_num;
+				members[member_index].borrowed_time = time(NULL);
+				delay(3000);
+			} else if (select_num == 2) {
+				if (members[member_index].borrowed_book == 0) {
+					printf("🚫 대여 중인 도서가 없습니다.\r\n");
+					continue;
+				}
+				int return_book_num = members[member_index].borrowed_book;
+				printf("📝 반납할 도서 번호는 %d번 도서입니다.\r\n", return_book_num);
+				delay(1000);
+				if(return_book_num >= 1 && return_book_num <= 4) {
+					printf("❗️ 1️번 블록을 개방합니다.\r\n");
+					// write(sock, "1", 1);
+					clear();
+					write_lcd(0, 0, "Block 1 is open ");
+					delay(5000);
+				}
+				else if(return_book_num >= 5 && return_book_num <= 8) {
+					printf("❗️ 2️번 블록을 개방합니다.\r\n");
+					// write(sock, "2", 1);
+					clear();
+					write_lcd(0, 0, "Block 2 is open ");
+					delay(5000);
+				}
+
+				available_books[return_book_num - 1] = 1; // 반납으로 변경
+				members[member_index].borrowed_book = 0;
+				// 7일 연체 시 연체한 날짜만큼 제한
+				if ((int)(time(NULL) - members[member_index].borrowed_time) / ONE_DAY > 7) {
+					printf("🚫 연체로 인해 7일간 대출이 제한됩니다.\r\n");
+					delay(3000);
+				}
+				members[member_index].borrowed_time = 0;
+				printf("✅ 반납이 완료되었습니다.\r\n");
+				clear();
+				write_lcd(0, 0, "Return complete ");
+				delay(3000);
+			} else {
+				printf("🚫 잘못된 입력입니다.\r\n");
+				delay(3000);
+				continue;
+			}		
+		}	
+	}
+}
\ No newline at end of file
diff --git a/RPI1/rfid.o b/RPI1/rfid.o
new file mode 100644
index 0000000000000000000000000000000000000000..d96a4eb9fce1653d23f3a76357ddbf59f1ede33c
GIT binary patch
literal 8156
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

literal 0
HcmV?d00001

-- 
GitLab